

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

# チュートリアル: CodePipeline を使用した Amazon ECS 標準デプロイ
<a name="ecs-cd-pipeline"></a>

このチュートリアルでは、CodePipeline を使用して Amazon ECS で完全なエンドツーエンドの継続的デプロイメント (CD) パイプラインを作成する方法を説明します。

**重要**  
コンソールでのパイプライン作成の一環として、CodePipeline は S3 アーティファクトバケットをアーティファクトとして使用します (これは S3 ソースアクションで使用するバケットとは異なります)。S3 アーティファクトバケットがパイプラインのアカウントとは異なるアカウントにある場合は、S3 アーティファクトバケットが によって所有 AWS アカウント されており、安全で信頼できることを確認してください。

**注記**  
このトピックとチュートリアルでは、CodePipeline の Amazon ECS 標準デプロイアクションについて説明します。CodePipeline で Amazon ECS から CodeDeploy の blue/green デプロイアクションを使用するチュートリアルは、[チュートリアル: Amazon ECR ソース、ECS - CodeDeploy 間のデプロイでパイプラインを作成する](tutorials-ecs-ecr-codedeploy.md) を参照してください。

**注記**  
このトピックとチュートリアルでは、ソースアクションを含む CodePipeline の Amazon ECS 標準デプロイアクションについて説明します。CodePipeline で Amazon ECS 標準デプロイアクションと ECRBuildAndPublish ビルドアクションを使用してイメージをプッシュするチュートリアルについては、「[チュートリアル: CodePipeline (V2 タイプ) を使用して Docker イメージを構築し Amazon ECR にプッシュする](tutorials-ecr-build-publish.md)」を参照してください。

## 前提条件
<a name="ecs-cd-prereqs"></a>

このチュートリアルで CD パイプラインを作成する前に、いつくかのリソースを用意する必要があります。使用を開始するために必要なものは以下のとおりです。

**注記**  
これらのリソースはすべて、同じ AWS リージョン内に作成する必要があります。
+ Dockerfile およびアプリケーションリソースを使用するソースコントロールリポジトリ (このチュートリアルでは CodeCommit を使用します)。詳細については、*AWS CodeCommit ユーザーガイド* の「[CodeCommit リポジトリの作成](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-create-repository.html)」を参照してください。
+ Dockerfile およびアプリケーションソースから作成したイメージを含む Docker イメージリポジトリ (このチュートリアルでは Amazon ECR を使用します)。詳細については、*Amazon Elastic Container Registry ユーザーガイド* の「[リポジトリの作成](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)」と「[イメージをプッシュする](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)」を参照してください。
+ イメージリポジトリでホストされた Docker イメージを参照する Amazon ECS タスク定義。詳細については、*Amazon Elastic Container Service デベロッパーガイド* の「[タスク定義の作成](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)」を参照してください。
**重要**  
CodePipeline の Amazon ECS 標準デプロイアクションは、Amazon ECS サービスで使用されるリビジョンに基づいて、タスク定義の独自のリビジョンを作成します。Amazon ECS サービスを更新せずにタスク定義の新しいリビジョンを作成した場合、デプロイアクションはそれらのリビジョンを無視します。

  このチュートリアルで使用するタスク定義の例を以下に示します。`name` と `family` に使用する値は、ビルド仕様ファイルのために次のステップで使用します。

  ```
  {
    "ipcMode": null,
    "executionRoleArn": "role_ARN",
    "containerDefinitions": [
      {
        "dnsSearchDomains": null,
        "environmentFiles": null,
        "logConfiguration": {
          "logDriver": "awslogs",
          "secretOptions": null,
          "options": {
            "awslogs-group": "/ecs/hello-world",
            "awslogs-region": "us-west-2",
            "awslogs-stream-prefix": "ecs"
          }
        },
        "entryPoint": null,
        "portMappings": [
          {
            "hostPort": 80,
            "protocol": "tcp",
            "containerPort": 80
          }
        ],
        "command": null,
        "linuxParameters": null,
        "cpu": 0,
        "environment": [],
        "resourceRequirements": null,
        "ulimits": null,
        "dnsServers": null,
        "mountPoints": [],
        "workingDirectory": null,
        "secrets": null,
        "dockerSecurityOptions": null,
        "memory": null,
        "memoryReservation": 128,
        "volumesFrom": [],
        "stopTimeout": null,
        "image": "image_name",
        "startTimeout": null,
        "firelensConfiguration": null,
        "dependsOn": null,
        "disableNetworking": null,
        "interactive": null,
        "healthCheck": null,
        "essential": true,
        "links": null,
        "hostname": null,
        "extraHosts": null,
        "pseudoTerminal": null,
        "user": null,
        "readonlyRootFilesystem": null,
        "dockerLabels": null,
        "systemControls": null,
        "privileged": null,
        "name": "hello-world"
      }
    ],
    "placementConstraints": [],
    "memory": "2048",
    "taskRoleArn": null,
    "compatibilities": [
      "EC2",
      "FARGATE"
    ],
    "taskDefinitionArn": "ARN",
    "family": "hello-world",
    "requiresAttributes": [],
    "pidMode": null,
    "requiresCompatibilities": [
      "FARGATE"
    ],
    "networkMode": "awsvpc",
    "cpu": "1024",
    "revision": 1,
    "status": "ACTIVE",
    "inferenceAccelerators": null,
    "proxyConfiguration": null,
    "volumes": []
  }
  ```
+ 前に説明したタスク定義を使用するサービスを実行する Amazon ECS クラスター。詳細については、*Amazon Simple Queue Serviceデベロッパーガイド* の [クラスターの作成](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-console-v2.html) と [サービスの作成](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html) を参照してください。

これらの前提条件を満たした後、チュートリアルに進んで CD パイプラインを作成できます。

## ステップ 1: ビルド仕様ファイルをソースリポジトリに追加する
<a name="cd-buildspec"></a>

このチュートリアルでは、CodeBuild を使用して Docker イメージを構築し、Amazon ECR にイメージをプッシュします。`buildspec.yml` ファイルをソースコードリポジトリに追加して CodeBuild に処理方法を指示します。ビルド仕様の以下の例では、次のように動作します。
+ プレビルドステージ:
  + Amazon ECR にログインします。
  + リポジトリ URI を ECR イメージに設定して、ソースの Git コミット ID の最初の 7 文字を使用するイメージタグを追加します。
+ ビルドステージ
  + Docker イメージを作成し、イメージに `latest` と Git コミット ID の両方をタグ付けします。
+ ポストビルドステージ:
  + 両方のタグを持った ECR リポジトリにイメージをプッシュします。
  + Amazon ECS サービスのコンテナ名およびイメージとタグがあるビルドのルートに `imagedefinitions.json` という名前のファイルを作成します。CD パイプラインのデプロイステージでこの情報を使用してサービスのタスク定義の新しいリビジョンを作成し、新しいタスク定義を使用してサービスを更新します。`imagedefinitions.json` ファイルは ECS ジョブワーカーに必須です。

このサンプルテキストを貼り付けて、`buildspec.yml` ファイルを使用して、イメージとタスク定義の値を置き換えます。このテキストでは、例としてアカウント ID 111122223333 を使用しています。

```
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com
      - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json
```

このチュートリアルで使用する Amazon ECS サービスで、[前提条件](#ecs-cd-prereqs) で提供されているサンプルタスクの定義に合わせてビルド仕様が書き込まれています。`REPOSITORY_URI` 値は `image` リポジトリ (イメージタグなし) に対応し、ファイルの末尾近くの `hello-world` 値はサービスのタスク定義のコンテナ名に対応します。

**ソースリポジトリに `buildspec.yml` ファイルを追加するには**

1. テキストエディタを開き、上記のビルド仕様をコピーして新しいファイルに貼り付けます。

1. `REPOSITORY_URI` の値 (`012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world`) を、Docker イメージの自分の Amazon ECR リポジトリ URI (イメージタグなし) に置き換えます。`hello-world` を、Docker イメージを参照するサービスのタスク定義のコンテナ名に置き換えます。

1. ソースリポジトリに `buildspec.yml` ファイルをコミットし、プッシュします。

   1. ファイルを追加します。

      ```
      git add .
      ```

   1. 変更をコミットします。

      ```
      git commit -m "Adding build specification."
      ```

   1. コミットをプッシュします。

      ```
      git push
      ```

## ステップ 2: 継続的デプロイパイプラインを作成する
<a name="pipeline-wizard"></a>

CodePipeline ウィザードを使用してパイプラインステージを作成し、ソースリポジトリを ECS サービスに接続します。

**パイプラインを作成するには**

1. CodePipeline コンソール ([https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)) を開きます。

1. [**Welcome (ようこそ)**] ページで、[**Create pipeline (パイプラインの作成)**] を選択します。

   CodePipeline を初めて使用する場合は、**[Welcome (ようこそ)]** の代わりに紹介ページが表示されます。[**今すぐ始める**] を選択します。

1. **[ステップ 1: 作成オプションを選択する]** ページの **[作成オプション]** で、**[カスタムパイプラインを構築する]** オプションを選択します。[**次へ**] を選択します。

1. **[ステップ 2: パイプラインの設定を選択する]** ページで、**[パイプライン名]** にパイプラインの名前を入力します。このチュートリアルでは、パイプライン名は **hello-world** です。

1. [**パイプラインのタイプ**] で、デフォルトの選択を [**V2**] のままにします。パイプラインのタイプによって特徴および価格が異なります。詳細については、「[パイプラインのタイプ](pipeline-types.md)」を参照してください。**[Next]** (次へ) を選択します。

1. **ステップ 3: ソースステージの追加**ページで、**ソースプロバイダー**で ** AWS CodeCommit**を選択します。

   1. [**Repository name (リポジトリ名)**] で、パイプラインのソース場所として使用する リポジトリの名前を選択します。

   1. [**ブランチ名**] で使用するブランチを選択し、[**Next (次へ)**] を選択します。

1. **ステップ 4: ビルドステージの追加**ページで、**ビルドプロバイダー**で を選択し**AWS CodeBuild**、**プロジェクトの作成**を選択します。

   1. [**Project name**] では、ビルドプロジェクトに一意の名前を選択します。このチュートリアルでは、プロジェクト名は **hello-world** です。

   1. [**環境イメージ**] で、[**Managed image (マネージド型イメージ)**] を選択します。

   1. [**オペレーティングシステム**] で、[**Amazon Linux 2**] を選択します。

   1. [**ランタイム**] で、[**Standard (標準)**] を選択します。

   1. [**イメージ**] で、[**`aws/codebuild/amazonlinux2-x86_64-standard:3.0`**] を選択します。

   1. [**イメージバージョン**] と [**環境タイプ**] には、既定値を使用します。

   1. [**Enable this flag if you want to build Docker images or want your builds to get elevated privileges (Docker イメージを構築する場合、またはビルドで昇格された権限を取得する場合は、このフラグを有効にする)**] を選択します。

   1. [**CloudWatch logs**] の選択を解除します。**アドバンスト** の拡張を必要とする場合があります。

   1. [**Continue to CodePipeline **] (CodePipeline に進む) を選択します。

   1. [**次へ**] を選択します。
**注記**  
ウィザードによって、**codebuild-*build-project-name*-service-role** という名前のビルドプロジェクト用の CodeBuild サービスロールが作成されます。このロール名を書き留めます。これには後で Amazon ECR アクセス権限を追加します。

1. **[Step 5: デプロイステージの追加]** の **[デプロイプロバイダ]** で **[Amazon ECS]** を選択します。

   1. [**Cluster name (クラスター名)**] で、サービスが実行されている Amazon ECS クラスターを選択します。このチュートリアルでは、クラスターは **default** です。

   1. [**サービス名**] で更新するサービスを選択し、[**Next (次へ)**] を選択します。このチュートリアルでは、サービス名は **hello-world** です。

1. [**Step 6: Review**] ページで、パイプラインの設定を確認し、[**Create pipeline**] を選択してパイプラインを作成します。
**注記**  
これでパイプラインが作成され、さまざまなパイプラインステージを通して実行を試みます。ただし、ウィザードによって作成されたデフォルトの CodeBuild ロールには、`buildspec.yml` ファイルに含まれるコマンドのすべてを実行するアクセス権限がないため、ビルドステージは失敗します。次のセクションで、ビルドステージのアクセス権限を追加します。

## ステップ 3: CodeBuild ロールに Amazon ECR 権限を追加する
<a name="code-build-perms"></a>

CodePipeline ウィザードによって、**codebuild-*build-project-name*-service-role** という名前の CodeBuild ビルドプロジェクト用の IAM ロールが作成されます。このチュートリアルで名前は **codebuild-hello-world-service-role** です。`buildspec.yml` ファイルは Amazon ECR API オペレーションの呼び出しを実行するため、これらの Amazon ECR コールを行うアクセス権限を許可するポリシーがロールに必要です。以下の手順では、適切なアクセス権限をロールにアタッチします。

**ステップ 3: CodeBuild ロールに Amazon ECR 権限を追加する**

1. IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. 左のナビゲーションペインで、**[ロール]** を選択してください。

1. 検索ボックスに「**codebuild-**」と入力し、CodePipeline ウィザードによって作成されたロールを選択します。このチュートリアルでは、ロール名は **codebuild-hello-world-service-role** です。

1. [**Summary (概要)**] ページで、[**Attach policy (ポリシーのアタッチ)**] を選択します。

1. [**AmazonEC2ContainerRegistryPowerUser**] ポリシーの左にあるボックスをオンにし、[**Attach policy**] を選択します。

## ステップ 4: パイプラインのテスト
<a name="commit-change"></a>

パイプラインには、end-to-endのネイティブ AWS 継続的デプロイを実行するためのすべてが必要です。次は、コードの変更をソースリポジトリにプッシュすることで機能をテストします。

**パイプラインをテストするには**

1. 設定済みソースリポジトリにコード変更を行い、変更をコミットしてプッシュします。

1. CodePipeline コンソール ([https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)) を開きます。

1. リストからパイプラインを選択します。

1. ステージを通してパイプラインの進行状況を監視します。パイプラインが終了し、Amazon ECS サービスがコード変更から作成された Docker イメージを実行することを確認します。