本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
的亚马逊 ECR 示例 CodeBuild
此示例使用 Amazon Elastic Container Registry (Amazon ECR) 映像存储库中的 Docker 映像生成示例 Go 项目。
重要
运行此示例可能会导致您的 Amazon 账户被扣款。其中包括与 Amazon S3、 Amazon KMS、 CloudWatch 日志和 Amazon ECR 相关的 Amazon 资源和操作可能产生的费用。 Amazon CodeBuild 有关更多信息,请参阅CodeBuild 定价
运行示例
要运行此示例,请执行以下操作:
-
要创建 Docker 映像并将其推送到 Amazon ECR 中的映像存储库,请完成 将 Docker 镜像发布到亚马逊 ECR 镜像存储库示例 的“运行示例”部分中的步骤。
-
创建 Go 项目:
-
按照本主题Go 项目结构和Go 项目文件部分所述创建文件,然后将其上传到 S3 输入存储桶或 Amazon CodeCommit GitHub、或 Bitbucket 存储库。
重要
请不要上传
,而只上传(root directory name)
中的文件。(root directory name)
如果您使用的是 S3 输入存储桶,请务必创建一个包含这些文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将
添加到 ZIP 文件中,而只添加(root directory name)
中的文件。(root directory name)
-
创建构建项目,运行构建,并查看相关的构建信息。
如果您使用创建构建项目,则
create-project
命令的 JSON 格式输入可能与此类似。 Amazon CLI (请将占位符替换为您自己的值。){ "name": "sample-go-project", "source": { "type": "S3", "location": "codebuild-
region-ID
-account-ID
-input-bucket/GoSample
.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID
-account-ID
-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact
.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:5.0", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID
:role/role-name
", "encryptionKey": "arn:aws:kms:region-ID
:account-ID
:key/key-ID
" } -
要获取构建输出构件,请打开您的 S3 输出存储桶。
-
将
文件下载到您的本地计算机或实例,然后提取该文件的内容。在提取出来的内容中,获取GoOutputArtifact
.ziphello
文件。
-
-
如果满足以下条件之一,则必须在 Amazon ECR 中为镜像存储库添加权限,这样 Amazon CodeBuild 才能将其 Docker 映像拉入构建环境。
-
您的项目使用 CodeBuild 凭证来提取 Amazon ECR 映像。这是由
ProjectEnvironment
的imagePullCredentialsType
属性中的CODEBUILD
值指示的。 -
您的项目使用了跨账户 Amazon ECR 映像。在这种情况下,您的项目必须使用其服务角色拉取 Amazon ECR 映像。要启用此行为,请将您的
ProjectEnvironment
的imagePullCredentialsType
属性设置为SERVICE_ROLE
。
从 https://console.aws.amazon.com/ecr/
打开 Amazon ECR 控制台。 -
在存储库名称列表中,选择您创建或选择的存储库的名称。
-
在导航窗格中,依次选择权限、编辑和添加语句。
-
对于声明名称,输入标识符(例如
CodeBuildAccess
)。 -
对于效果,选择允许。这表示您希望允许访问另一个 Amazon 账户。
-
对于主体,执行以下操作之一:
-
如果您的项目使用 CodeBuild 凭证提取 Amazon ECR 映像,请在服务主体中输入
codebuild.amazonaws.com
。 -
如果您的项目使用了跨账户 Amazon ECR 映像,请在 Amazon 账户 ID 中输入您要为其授予访问权限的 Amazon 账户的 ID。
-
-
跳过所有 IAM 实体列表。
-
在 “操作” 中,选择仅限拉取的操作:ecr: GetDownloadUrlForLayer、ecr: 和 ecr: BatchGetImage。BatchCheckLayerAvailability
-
对于条件,请添加以下内容:
{ "StringEquals":{ "aws:SourceAccount":"
<AWS-account-ID>
", "aws:SourceArn":"arn:aws:codebuild:<region>
:<AWS-account-ID>
:project/<project-name>
" } } -
选择保存。
此策略显示在权限中。主体是您在此过程的步骤 3 中为主体输入的内容:
-
如果您的项目使用 CodeBuild 凭证提取 Amazon ECR 映像,则
"codebuild.amazonaws.com"
会显示在 “服务主体” 下。 -
如果您的项目使用跨账户 Amazon ECR 图片,则您要授予访问权限的 Amazon 账户 ID 会显示在Amazon 账户 ID 下。
以下示例策略同时使用 CodeBuild 凭证和跨账户 Amazon ECR 映像。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"CodeBuildAccessPrincipal", "Effect":"Allow", "Principal":{ "Service":"codebuild.amazonaws.com" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ], "Condition":{ "StringEquals":{ "aws:SourceArn":"arn:aws:codebuild:
<region>
:<aws-account-id>
:project/<project-name>
", "aws:SourceAccount":"<aws-account-id>
" } } }, { "Sid":"CodeBuildAccessCrossAccount", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::<AWS-account-ID>
:root" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] }-
如果您的项目使用 CodeBuild 证书,并且您希望您的 CodeBuild 项目拥有对 Amazon ECR 存储库的开放访问权限,则可以省略
Condition
密钥并添加以下示例策略。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"CodeBuildAccessPrincipal", "Effect":"Allow", "Principal":{ "Service":"codebuild.amazonaws.com" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] }, { "Sid":"CodeBuildAccessCrossAccount", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::
<AWS-account-ID>
:root" }, "Action":[ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] } -
-
-
创建构建项目,运行构建,并查看构建信息。
如果您使用创建构建项目,则
create-project
命令的 JSON 格式输入可能与此类似。 Amazon CLI (请将占位符替换为您自己的值。){ "name": "amazon-ecr-sample-project", "source": { "type": "S3", "location": "codebuild-
region-ID
-account-ID
-input-bucket/GoSample
.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID
-account-ID
-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact
.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "account-ID
.dkr.ecr.region-ID
.amazonaws.com/your-Amazon-ECR-repo-name
:tag
", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID
:role/role-name
", "encryptionKey": "arn:aws:kms:region-ID
:account-ID
:key/key-ID
" } -
要获取构建输出构件,请打开您的 S3 输出存储桶。
-
将
文件下载到您的本地计算机或实例,然后提取GoOutputArtifact
.zip
文件的内容。在提取出来的内容中,获取GoOutputArtifact
.ziphello
文件。
Go 项目结构
此示例采用以下目录结构。
(root directory name)
├── buildspec.yml
└── hello.go
Go 项目文件
此示例将使用这些文件。
buildspec.yml
(在
)(root directory
name)
version: 0.2 phases: install: runtime-versions: golang: 1.13 build: commands: - echo Build started on `date` - echo Compiling the Go code - go build hello.go post_build: commands: - echo Build completed on `date` artifacts: files: - hello
hello.go
(在
)(root directory
name)
package main import "fmt" func main() { fmt.Println("hello world") fmt.Println("1+1 =", 1+1) fmt.Println("7.0/3.0 =", 7.0/3.0) fmt.Println(true && false) fmt.Println(true || false) fmt.Println(!true) }
相关资源
有关入门的信息 Amazon CodeBuild,请参阅通过控制台开始使用 Amazon CodeBuild。
有关中问题疑难解答的信息 CodeBuild,请参阅故障排除 Amazon CodeBuild。
有关中配额的信息 CodeBuild,请参阅Amazon CodeBuild 的限额。