Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

チュートリアル: CodePipeline を使用した継続的なデプロイ

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

前提条件

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

注記

これらのすべてのリソースを、同じ AWS リージョン内に作成する必要があります。

  • Dockerfile およびアプリケーションリソースを使用するソースコントロールリポジトリ (このチュートリアルでは CodeCommit を使用します)。詳細については、『AWS CodeCommit ユーザーガイド』の「CodeCommit リポジトリを作成する」を参照してください。

  • Dockerfile およびアプリケーションソースから作成したイメージを含む Docker イメージリポジトリ (このチュートリアルでは Amazon ECR を使用します)。詳細については、Amazon Elastic Container Registry ユーザーガイド の「リポジトリの作成」および「イメージのプッシュ」を参照してください。

  • イメージリポジトリでホストされた Docker イメージを参照する Amazon ECS タスク定義。詳細については、Amazon Elastic Container Service Developer Guide の「タスク定義の作成」を参照してください。

  • 前に説明したタスク定義を使用するサービスを実行する Amazon ECS クラスター。詳細については、Amazon Elastic Container Service Developer Guide の「クラスターの作成」および「サービスの作成」を参照してください。

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

ステップ 1: ビルド仕様ファイルをソースリポジトリに追加する

このチュートリアルでは、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 ファイルは CodeDeploy ECS ジョブワーカーに必須です。

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) - 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 サービスによって使用されます。REPOSITORY_URI 値は image リポジトリ (イメージタグなし) に対応し、ファイルの末尾近くの hello-world 値はサービスのタスク定義のコンテナ名に対応します。

{ "taskDefinition": { "family": "hello-world", "containerDefinitions": [ { "name": "hello-world", "image": "012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world:6a57b99", "cpu": 100, "portMappings": [ { "protocol": "tcp", "containerPort": 80, "hostPort": 80 } ], "memory": 128, "essential": true } ] } }

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

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

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

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

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

      git add .
    2. 変更をコミットします。

      git commit -m "Adding build specification."
    3. コミットをプッシュします。

      git push

ステップ 2: 継続的デプロイパイプラインを作成する

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

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

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

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

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

  3. [Step 1: Name] ページの [Pipeline name] ボックスにパイプラインの名前を入力し、[Next step] を選択します。このチュートリアルでは、パイプライン名は hello-world です。

  4. [Step 2: Source (ステップ 2: ソース)] ページの [Source provider (ソースプロバイダー)] で、[CodeCommit] を選択します。

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

    2. [Branch name] で使用するブランチを選択し、[Next step] を選択します。

  5. [Step 3: Build (ステップ 3: ビルド)] ページで、[CodeBuild]、[Create a new build project (新しいビルドプロジェクトを作成する)] の順に選択します。

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

    2. [Operating system] で、[Ubuntu] を選択します。

    3. [Runtime] で [Docker] を選択します。

    4. [バージョン] で、aws/codebuild/docker: 17.09.0 を選択します。

    5. ビルドプロジェクトの保存 を選択します。

    6. [Next step] を選択します。

      注記

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

  6. [Step 4: Deploy (ステップ 4: デプロイ)] ページの [Deployment provider (デプロイプロバイダー)] で、[Amazon ECS] を選択します。

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

    2. [Service name] で更新するサービスを選択し、[Next step] を選択します。このチュートリアルでは、サービス名は hello-world です。

  7. [Step 5: Service Role] ページで、[Create role] を選択します。作成されるロールを定義する IAM コンソールページで、[Allow (許可)] を選択します。

  8. [Next step] を選択します。

  9. [Step 6: Review] ページで、パイプラインの設定を確認し、[Create pipeline] を選択してパイプラインを作成します。

    注記

    これでパイプラインが作成され、さまざまなパイプラインステージを通して実行を試みます。ただし、ウィザードによって作成されたデフォルトの CodeBuild ロールには、buildspec.yml ファイルに含まれるコマンドのすべてを実行するアクセス権限がないため、ビルドステージは失敗します。次のセクションで、ビルドステージのアクセス権限を追加します。

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

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

Amazon ECR アクセス権限を CodeBuild ロールに追加するには

  1. https://console.aws.amazon.com/iam/ にある IAM コンソールを開きます。

  2. 左のナビゲーションペインで、[Roles (ロール)] を選択します。

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

  4. [Summary] ページで、[Attach policy] を選択します。

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

ステップ 4: パイプラインのテスト

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

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

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

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

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

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

    
                        CodePipeline 完了