的亚马逊 ECR 示例 CodeBuild - Amazon CodeBuild
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

的亚马逊 ECR 示例 CodeBuild

此示例使用 Amazon Elastic Container Registry(Amazon ECR)镜像构建示例 Go 项目。

重要

运行该示例可能会导致您的 Amazon 账户产生相关费用。其中包括与 Amazon S3Amazon CodeBuild、 CloudWatch Logs 和 Amazon ECR 相关的Amazon资源和操作可能产生的费用。Amazon KMS有关更多信息,请参阅CodeBuild 定价、Amazon S3 定价、定价、亚马逊Amazon Key Management Service价亚马逊 CloudWatch Elastic Container Registry 定价

运行示例

要运行此示例,请执行以下操作:
  1. 要创建 Docker 映像并将其推送到 Amazon ECR 中的映像存储库,请完成的 “运行示例” 部分中的步骤Docker 示例

  2. 创建 Go 项目:

    1. 按照本主题Go 项目结构Go 项目文件部分所述创建文件,然后将它们上传到 S3 输入存储桶或Amazon CodeCommit、 GitHub或 Bitbucket 存储库。

      重要

      请不要上传 (root directory name),而只上传 (root directory name) 中的文件。

      如果您使用的是 S3 输入存储桶,请务必创建一个包含文件的 ZIP 文件,然后将其上传到输入存储桶。请不要将 (root directory name) 添加到 ZIP 文件中,而只添加 (root directory name) 中的文件。

    2. 请按照 直接运行 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" }
    3. 要获取构建输出构件,请打开您的 S3 输出存储桶。

    4. GoOutputArtifact.zip 文件下载到您的本地计算机或实例,然后提取该文件的内容。在提取出来的内容中,获取 hello 文件。

  3. 如果满足以下条件之一,则必须在 Amazon ECR 中添加镜像存储库的权限,这样Amazon CodeBuild才能将其 Docker 映像拉入构建环境。

    • 您的项目使用 CodeBuild 证书提取亚马逊 ECR 镜像。这是由 ProjectEnvironmentimagePullCredentialsType 属性中的 CODEBUILD 值指示的。

    • 您的项目使用跨账户 Amazon ECR 镜像。在这种情况下,您的项目必须使用其服务角色提取 Amazon ECR 镜像。要启用此行为,请将您的 ProjectEnvironmentimagePullCredentialsType 属性设置为 SERVICE_ROLE

    1. 打开位于 https://console.aws.amazon.com/ecr/ 的 Amazon ECR 控制台。

    2. 在存储库名称列表中,选择您创建或选择的存储库的名称。

    3. 在导航窗格中,依次选择 Permissions (权限)Edit (编辑)Add statement (添加语句)

    4. 对于 Statement name (声明名称),输入标识符(例如 CodeBuildAccess)。

    5. 对于 Effect (效果),选择 Allow (允许)。这表示您希望允许访问另一个 Amazon 账户。

    6. 对于 Principal (委托人),执行以下操作之一:

      • 如果您的项目使用 CodeBuild 证书提取 Amazon ECR 镜像,请在服务主体中输入codebuild.amazonaws.com

      • 如果您的项目使用跨账户 Amazon ECR 镜像,对于Amazon账户 ID,请输入您想要授予访问权限的Amazon账户的 ID。

    7. 跳过 All IAM entities (所有 IAM 实体) 列表。

    8. 对于 “操作”,选择仅限拉动的操作:GetDownloadUrlForLayerecr:BatchGetImage、ecr: 和 ecr:BatchCheckLayerAvailability

    9. 在 “条件” 中,添加以下内容:

      { "StringEquals":{ "aws:SourceAccount":"<AWS-account-ID>", "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>" } }
    10. 选择 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" ] } ] }
  4. 请按照 运行 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" }
  5. 要获取构建输出构件,请打开您的 S3 输出存储桶。

  6. GoOutputArtifact.zip 文件下载到您的本地计算机或实例,然后提取 GoOutputArtifact.zip 文件的内容。在提取出来的内容中,获取 hello 文件。

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) }

相关资源