适用于 CodeBuild 的 Amazon ECR 示例
此示例使用 Amazon Elastic Container Registry(Amazon ECR)映像存储库中的 Docker 映像生成示例 Go 项目。
重要
运行该示例可能会导致您的 Amazon 账户产生相关费用。这包括 Amazon CodeBuild 可能产生的费用,以及与 Amazon S3、Amazon KMS、CloudWatch Logs 和 Amazon ECR 相关的 Amazon 资源和操作可能产生的费用。有关更多信息,请参阅 CodeBuild 定价
运行 Amazon ECR 示例
按照以下说明运行适用于 CodeBuild 的 Amazon ECR 示例。
要运行此示例,请执行以下操作:
-
要创建 Docker 映像并将其推送到 Amazon ECR 中的映像存储库,请完成 “将 Docker 映像发布到 Amazon ECR”示例 的 运行“将 Docker 映像发布到 Amazon ECR”示例 部分中的步骤。
-
创建 Go 项目:
-
按照本主题的Go 项目结构和Go 项目文件部分的说明创建文件,然后将其上传到 S3 输入存储桶或者上传到 Amazon CodeCommit、GitHub 或 Bitbucket 存储库。
重要
请不要上传
,而只上传(root directory name)
中的文件。(root directory name)
如果您使用的是 S3 输入存储桶,请务必创建一个包含这些文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将
添加到 ZIP 文件中,而只添加(root directory name)
中的文件。(root directory name)
-
创建构建项目、运行构建和查看相关构建信息。
如果您使用 Amazon CLI 创建构建项目,则
create-project
命令的 JSON 格式输入可能与此类似。(请将占位符替换为您自己的值。){ "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:BatchGetImage 和 ecr: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" ] } ] } -
-
-
创建构建项目、运行构建和查看构建信息。
如果您使用 Amazon CLI 创建构建项目,则
create-project
命令的 JSON 格式输入可能与此类似。(请将占位符替换为您自己的值。){ "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) }