Amazon 的ECR示例 CodeBuild - AWS CodeBuild

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

Amazon 的ECR示例 CodeBuild

此示例使用亚马逊弹性容器注册表 (亚马逊ECR) 镜像存储库中的 Docker 镜像来构建示例 Go 项目。

重要

运行此示例可能会导致您的 AWS 账户被扣款。其中包括与 Amazon S3、、 AWS KMS L CloudWatch ogs 和 Amazon 相关的 AWS 资源和操作可能产生的费用ECR。 AWS CodeBuild 有关更多信息,请参阅CodeBuild 定价Amazon S3 定价AWS Key Management Service 定价亚马逊 CloudWatch 定价亚马逊弹性容器注册表定价

运行 Amazon ECR 示例

按照以下说明运行 Amazon ECR 示例 CodeBuild。

要运行此示例,请执行以下操作:
  1. 要创建 Docker 镜像并将其推送到您在 Amazon 中的镜像存储库ECR,请完成运行 “将 Docker 镜像发布到亚马ECR逊” 示例部分中的'将 Docker 镜像发布到亚马逊 ECR '示例步骤。

  2. 创建 Go 项目:

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

      重要

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

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

    2. 创建构建项目,运行构建,并查看相关的构建信息。

      如果您使用创建构建项目,则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" }
    3. 要获取构建输出构件,请打开您的 S3 输出存储桶。

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

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

    • 您的项目使用 CodeBuild 凭证来提取 Amazon ECR 图片。这是由 ProjectEnvironmentimagePullCredentialsType 属性中的 CODEBUILD 值指示的。

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

    1. 打开 Amazon ECR 控制台,网址为https://console.aws.amazon.com/ecr/

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

    3. 在导航窗格中,依次选择权限编辑添加语句

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

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

    6. 对于主体,执行以下操作之一:

      • 如果您的项目使用 CodeBuild 凭证提取亚马逊ECR图片,请在服务主体中输入codebuild.amazonaws.com

      • 如果您的项目使用跨账户 Amazon ECR 图片IDs,请输入IDs您想要授予访问权限的 AWS 账户。AWS

    7. 跳过 “所有IAM实体” 列表。

    8. 在 “操作” 中,选择仅限拉取的操作:ecr: GetDownloadUrlForLayerecr: 和 ecr: BatchGetImage。BatchCheckLayerAvailability

    9. 对于条件,请添加以下内容:

      { "StringEquals":{ "aws:SourceAccount":"<AWS-account-ID>", "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>" } }
    10. 选择保存

      此策略显示在权限中。主体是您在此过程的步骤 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" ] } ] }
  4. 创建构建项目,运行构建,并查看构建信息。

    如果您使用创建构建项目,则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" }
  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) }