

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# CodeBuild の Amazon ECR サンプル
<a name="sample-ecr"></a>

このサンプルでは Amazon Elastic Container Registry (Amazon ECR) イメージレポジトリの Docker イメージを使用して、サンプルの Go プロジェクトをビルドします。

**重要**  
このサンプルを実行すると、 AWS アカウントに料金が発生する可能性があります。これには、Amazon S3、、CloudWatch Logs AWS KMS、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)、[Amazon CloudWatch 料金表](https://aws.amazon.com/cloudwatch/pricing)、[Amazon Elastic Container Registry 料金表](https://aws.amazon.com/ecr/pricing)を参照してください。

**Topics**
+ [Amazon ECR サンプルを実行](#sample-ecr-running)

## Amazon ECR サンプルを実行
<a name="sample-ecr-running"></a>

CodeBuild の Amazon ECR サンプルを実行するには、以下の手順に従います。

**このサンプルを実行するには**

1. Amazon ECR で Docker イメージを作成してイメージリポジトリにプッシュするには、「['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. ビルドプロジェクトを作成して、ビルドを実行し、関連するビルド情報を表示します。

      を使用してビルドプロジェクト AWS 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: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.  次のいずれかに該当する場合、 が Docker イメージをビルド環境に AWS CodeBuild プルできるように、Amazon ECR のイメージリポジトリにアクセス許可を追加する必要があります。
   +  プロジェクトで CodeBuild の認証情報を使用して Amazon ECR のイメージをプルしている場合。これは、`CODEBUILD` の `imagePullCredentialsType` 属性で `ProjectEnvironment` の値で示されます。
   +  プロジェクトでクロスアカウントの Amazon ECR イメージを使用している場合。この場合は、プロジェクトでサービスロールを使用して Amazon ECR イメージをプルする必要があります。この動作を有効にするには、`imagePullCredentialsType` の `ProjectEnvironment` 属性を `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 イメージを使用する場合は、[**AWS アカウント ID**] に、アクセス権を付与する AWS アカウントの ID を入力します。

   1. [**すべての IAM エンティティ**] リストをスキップします。

   1. [**アクション**] で、プル専用アクションとして [**ecr:GetDownloadUrlForLayer**]、[**ecr:BatchGetImage**]、および [**ecr: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 のイメージをプルする場合は、**[Service principals]** (サービスプリンシパル) に「`"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. ビルドプロジェクトを作成して、ビルドを実行し、ビルド情報を表示します。

   を使用してビルドプロジェクト AWS 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"
   }
   ```

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