本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
的亚马逊 ECR 示例 CodeBuild
此示例使用 Amazon Elastic Container Registry(Amazon ECR)镜像构建示例 Go 项目。
运行该示例可能会导致您的 Amazon 账户产生相关费用。其中包括与 Amazon S3Amazon CodeBuild、 CloudWatch Logs 和 Amazon ECR 相关的Amazon资源和操作可能产生的费用。Amazon KMS有关更多信息,请参阅CodeBuild 定价、Amazon S3 定价
运行示例
要运行此示例,请执行以下操作:
-
要创建 Docker 映像并将其推送到 Amazon ECR 中的映像存储库,请完成的 “运行示例” 部分中的步骤Docker 示例。
-
创建 Go 项目:
-
按照本主题Go 项目结构和Go 项目文件部分所述创建文件,然后将它们上传到 S3 输入存储桶或Amazon CodeCommit、 GitHub或 Bitbucket 存储库。
重要 请不要上传
,而只上传(root directory name)
中的文件。(root directory name)
如果您使用的是 S3 输入存储桶,请务必创建一个包含文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将
添加到 ZIP 文件中,而只添加(root directory name)
中的文件。(root directory name)
-
请按照 直接运行 Amazon CodeBuild 中的步骤创建构建项目、运行构建并查看相关构建信息。
如果您使用 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:4.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 证书提取亚马逊 ECR 镜像。这是由
ProjectEnvironment
的imagePullCredentialsType
属性中的CODEBUILD
值指示的。 -
您的项目使用跨账户 Amazon ECR 镜像。在这种情况下,您的项目必须使用其服务角色提取 Amazon ECR 镜像。要启用此行为,请将您的
ProjectEnvironment
的imagePullCredentialsType
属性设置为SERVICE_ROLE
。
打开位于 https://console.aws.amazon.com/ecr/
的 Amazon ECR 控制台。 -
在存储库名称列表中,选择您创建或选择的存储库的名称。
-
在导航窗格中,依次选择 Permissions (权限)、Edit (编辑) 和 Add statement (添加语句)。
-
对于 Statement name (声明名称),输入标识符(例如
CodeBuildAccess
)。 -
对于 Effect (效果),选择 Allow (允许)。这表示您希望允许访问另一个 Amazon 账户。
-
对于 Principal (委托人),执行以下操作之一:
-
如果您的项目使用 CodeBuild 证书提取 Amazon ECR 镜像,请在服务主体中输入
codebuild.amazonaws.com
。 -
如果您的项目使用跨账户 Amazon ECR 镜像,对于Amazon账户 ID,请输入您想要授予访问权限的Amazon账户的 ID。
-
-
跳过 All IAM entities (所有 IAM 实体) 列表。
-
对于 “操作”,选择仅限拉动的操作:GetDownloadUrlForLayerecr:BatchGetImage、ecr: 和 ecr:BatchCheckLayerAvailability。
-
在 “条件” 中,添加以下内容:
{ "StringEquals":{ "aws:SourceAccount":"
<AWS-account-ID>
", "aws:SourceArn":"arn:aws:codebuild:<region>
:<AWS-account-ID>
:project/<project-name>
" } } -
选择 Save(保存)。
此策略显示在 Permissions (权限) 中。委托人是您在此过程的步骤 3 中为 Principal (委托人) 输入的内容:
-
如果您的项目使用 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" ] } ] } -
-
-
请按照 运行 CodeBuild 直接地 中的步骤创建构建项目、运行构建并查看相关构建信息。
如果您使用 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) }
相关资源
有关 Amazon CodeBuild 入门的信息,请参阅通过控制台开始使用 Amazon CodeBuild。
有关中问题排的更多信息 CodeBuild,请参阅故障排除 Amazon CodeBuild。
有关中的配额的信息 CodeBuild,请参阅Amazon CodeBuild 的配额。