本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon 的ECR示例 CodeBuild
此示例使用亚马逊弹性容器注册表 (亚马逊ECR) 镜像存储库中的 Docker 镜像来构建示例 Go 项目。
重要
运行此示例可能会导致您的 AWS 账户被扣款。其中包括与 Amazon S3、、 AWS KMS L CloudWatch ogs 和 Amazon 相关的 AWS 资源和操作可能产生的费用ECR。 AWS CodeBuild 有关更多信息,请参阅CodeBuild 定价
运行 Amazon ECR 示例
按照以下说明运行 Amazon ECR 示例 CodeBuild。
要运行此示例,请执行以下操作:
-
要创建 Docker 镜像并将其推送到您在 Amazon 中的镜像存储库ECR,请完成运行 “将 Docker 镜像发布到亚马ECR逊” 示例部分中的'将 Docker 镜像发布到亚马逊 ECR '示例步骤。
-
创建 Go 项目:
-
按照本主题Go 项目结构和Go 项目文件部分所述创建文件,然后将其上传到 S3 输入存储桶或 AWS CodeCommit GitHub、或 Bitbucket 存储库。
重要
请不要上传
,而只上传(root directory name)
中的文件。(root directory name)
如果您使用的是 S3 输入存储桶,请务必创建一个包含这些ZIP文件的文件,然后将其上传到输入存储桶。不要
添加到ZIP文件中,只添加里面的文件(root directory name)
。(root directory name)
-
创建构建项目,运行构建,并查看相关的构建信息。
如果您使用创建构建项目,则
create-project
命令的 JSON-格式输入可能与此类似。 AWS 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这样 AWS CodeBuild 才能将其 Docker 映像提取到构建环境中。
-
您的项目使用 CodeBuild 凭证来提取 Amazon ECR 图片。这是由
ProjectEnvironment
的imagePullCredentialsType
属性中的CODEBUILD
值指示的。 -
您的项目使用跨账户的 Amazon ECR 图片。在这种情况下,您的项目必须使用其服务角色来提取Amazon ECR 图片。要启用此行为,请将您的
ProjectEnvironment
的imagePullCredentialsType
属性设置为SERVICE_ROLE
。
打开 Amazon ECR 控制台,网址为https://console.aws.amazon.com/ecr/
。 -
在存储库名称列表中,选择您创建或选择的存储库的名称。
-
在导航窗格中,依次选择权限、编辑和添加语句。
-
对于声明名称,输入标识符(例如
CodeBuildAccess
)。 -
对于效果,选择允许。这表示您希望允许访问另一个 AWS 账户。
-
对于主体,执行以下操作之一:
-
如果您的项目使用 CodeBuild 凭证提取亚马逊ECR图片,请在服务主体中输入
codebuild.amazonaws.com
。 -
如果您的项目使用跨账户 Amazon ECR 图片IDs,请输入IDs您想要授予访问权限的 AWS 账户。AWS
-
-
跳过 “所有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 图片,则您要授予访问权限的 AWS 账户的 ID 会显示在 “AWS 账户 IDs” 下。
以下示例策略同时使用 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-格式输入可能与此类似。 AWS 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) }