

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

# 的亚马逊 ECR 示例 CodeBuild
<a name="sample-ecr"></a>

此示例使用 Amazon Elastic Container Registry（Amazon ECR）映像存储库中的 Docker 映像生成示例 Go 项目。

**重要**  
运行此示例可能会导致您的 AWS 账户被扣款。其中包括与 Amazon S3、 AWS KMS、 CloudWatch 日志和 Amazon ECR 相关的 AWS 资源和操作可能产生的费用。 AWS CodeBuild 有关更多信息，请参阅[CodeBuild 定价](https://aws.amazon.com/codebuild/pricing)、[Amazon S3 定价](https://aws.amazon.com/s3/pricing)、[AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing)、[亚马逊 CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing)和[亚马逊弹性容器注册表定价](https://aws.amazon.com/ecr/pricing)。

**Topics**
+ [运行 Amazon ECR 示例](#sample-ecr-running)

## 运行 Amazon ECR 示例
<a name="sample-ecr-running"></a>

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

**要运行此示例，请执行以下操作：**

1. 要创建 Docker 映像并将其推送到 Amazon ECR 中的映像存储库，请完成 [“将 Docker 映像发布到 Amazon ECR”示例](sample-docker.md) 的 [运行“将 Docker 映像发布到 Amazon ECR”示例](sample-docker.md#sample-docker-running) 部分中的步骤。

1. 创建 Go 项目：

   1. 按照本主题[Go 项目结构](#ecr-sample-go-project-file-structure)和[Go 项目文件](#sample-ecr-go-project-files)部分所述创建文件，然后将其上传到 S3 输入存储桶或 AWS CodeCommit GitHub、或 Bitbucket 存储库。
**重要**  
请不要上传 `(root directory name)`，而只上传 `(root directory name)` 中的文件。  
如果您使用的是 S3 输入存储桶，请务必创建一个包含这些文件的 ZIP 文件，然后将其上传到输入存储桶。请不要将 `(root directory name)` 添加到 ZIP 文件中，而只添加 `(root directory name)` 中的文件。

   1. 创建构建项目、运行构建和查看相关构建信息。

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

   1. 要获取构建输出构件，请打开您的 S3 输出存储桶。

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

1.  如果满足以下条件之一，则必须在 Amazon ECR 中为镜像存储库添加权限，这样 AWS CodeBuild 才能将其 Docker 映像拉入构建环境。
   +  您的项目使用 CodeBuild 凭证来提取 Amazon ECR 映像。这是由 `ProjectEnvironment` 的 `imagePullCredentialsType` 属性中的 `CODEBUILD` 值指示的。
   +  您的项目使用了跨账户 Amazon ECR 映像。在这种情况下，您的项目必须使用其服务角色拉取 Amazon ECR 映像。要启用此行为，请将您的 `ProjectEnvironment` 的 `imagePullCredentialsType` 属性设置为 `SERVICE_ROLE`。

   1. 打开 Amazon ECR 控制台，网址为[https://console.aws.amazon.com/ecr/](https://console.aws.amazon.com/ecr/)。

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

   1. 在导航窗格中，依次选择**权限**、**编辑**和**添加语句**。

   1. 对于**声明名称**，输入标识符（例如 **CodeBuildAccess**）。

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

   1. 对于**主体**，执行以下操作之一：
      + 如果您的项目使用 CodeBuild 凭证提取 Amazon ECR 映像，请在**服务主体**中输入**codebuild.amazonaws.com**。
      + **如果您的项目使用跨账户 Amazon ECR 图片 IDs，请输入 IDs 您想要授予访问权限的 AWS 账户。AWS **

   1. 跳过**所有 IAM 实体**列表。

   1. **在 “**操作**” 中，选择仅限拉取的操作：**ecr: GetDownloadUrlForLayer**、**ecr: 和 ecr: BatchGetImage**。BatchCheckLayerAvailability**

   1. 对于**条件**，请添加以下内容：

      ```
      {
         "StringEquals":{
            "aws:SourceAccount":"<AWS-account-ID>",
            "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>"
         }
      }
      ```

   1. 选择**保存**。

      此策略显示在**权限**中。主体是您在此过程的步骤 3 中为**主体**输入的内容：
      + 如果您的项目使用 CodeBuild 凭证提取 Amazon ECR 映像，则`"codebuild.amazonaws.com"`会显示在 “**服务主体**” 下。
      + **如果您的项目使用跨账户 Amazon ECR 图片，则您要授予访问权限的 AWS 账户的 ID 将显示在账户下方AWS 。 IDs**

        以下示例策略同时使用 CodeBuild 凭证和跨账户 Amazon ECR 映像。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceArn": "arn:aws:codebuild:us-east-1:111122223333:project/MyProject",
                          "aws:SourceAccount": "111122223333"
                      }
                  }
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*"
              }
          ]
      }
      ```

------
      + 如果您的项目使用 CodeBuild 证书，并且您希望您的 CodeBuild 项目拥有对 Amazon ECR 存储库的开放访问权限，则可以省略`Condition`密钥并添加以下示例策略。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              }
          ]
      }
      ```

------

1. 创建构建项目、运行构建和查看构建信息。

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

1. 要获取构建输出构件，请打开您的 S3 输出存储桶。

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

### Go 项目结构
<a name="ecr-sample-go-project-file-structure"></a>

此示例采用以下目录结构。

```
(root directory name)
├── buildspec.yml
└── hello.go
```

### Go 项目文件
<a name="sample-ecr-go-project-files"></a>

此示例将使用这些文件。

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