インフラ

CodePipelineを使ってECRのイメージをECSに自動デプロイする!

codepipeline-ecr-ecs-auto-deploy
野田竣介

今回はこのような質問をいただきました。

CodePipelineを使って自動デプロイしたい!

前回は手動でECSにデプロイしてみました。

あわせて読みたい
【Fargate】ECRのイメージをECSにデプロイする!
【Fargate】ECRのイメージをECSにデプロイする!

そこで今回は前回作成したECSの環境に自動デプロイできるようにしてみます!

CodeCommitリポジトリの変更をトリガーにCodeBuildを実行してECRにPUSHされたイメージをECSにデプロイします。

と言ってもデプロイできる状態にはなっているのでそんなに難しくはないはず!

環境
  • AWS
    • ECR
    • ECS
    • CodeCommit
    • CodeBuild
    • CodePipeline

buildspec.ymlの改修

CodePipelineの設定をする前にこちらの記事で作成したbuildspec.ymlに少し追記します。

あわせて読みたい
SpringBootをCodeBuildでビルドしてECRにPUSHする!
SpringBootをCodeBuildでビルドしてECRにPUSHする!

今の状態だとCodeCommitリポジトリに変更があったときにビルドはできますが、どのイメージをどのコンテナ(ECS)にデプロイして良いかわかりません。

「このビルドが終わったらこのイメージをこのコンテナにデプロイしてくださいね」という設定を追加します。

以前作成したbuildspec.ymlの一番下に以下の行を追加します。

      - printf '[{"name":"sample-container","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json
artifacts:
  files: imagedefinitions.json

sample-containerとなっている部分は皆さんが作成したコンテナの名前を設定してください。

buildspec.ymlはこんな感じになります。

version: 0.2
phases:
  install:
    runtime-versions:
      java: openjdk11
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
  build:
    commands:
      - echo Build started on `date`
      - echo Building the SpringBoot project...
      - ./gradlew build -x test
      - echo Building the Docker image...
      - IMAGE_TAG=$(date '+%Y%m%d.%H%M%S.%N')
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - echo docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - printf '[{"name":"sample-container","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json
artifacts:
  files: imagedefinitions.json

これをCodeCommitにPUSHしておきましょう。

CodePipelineの設定

今回のメインであるCodePipelineの設定を行います。

CodePipelineからパイプラインの作成を選択します。

パイプラインの作成

パイプライン名を入力します。

ロール名はパイプライン名を入力すると自動的に入力されます。

パイプラインの設定

CodeCommitに存在するデプロイしたいリポジトリ、ブランチ名を選択します。

ソースステージの追加

選択したリポジトリをビルドするプロジェクト名を選択します。

ビルドステージの追加

ECSのデプロイ対象のクラスターとサービスを選択します。

デプロイステージの追加

設定を確認し、作成すると自動的にパイプラインが実行されます。

すべてのステージが成功したらOKです。

すべてのステージの成功

これでCodeCommitリポジトリの対象ブランチが変更されたときに自動でデプロイされるようになっていると思います。

CodeCommitリポジトリを変更して確認してみてください!

あとがき

CodePipelineは名前通りCodeシリーズを繋げる役目を担っていますね。

ただ繋げるだけなので設定は非常に簡単でした。

これでJenkins卒業できますね!

記事URLをコピーしました