【備忘録】AWS ECS Blue / Green Deploy で 複数コンテナを含んだ ECS サービス / タスク を更新する


はじめに

以前、CodePipelineを利用した「ECS Blue / Green Deploy」を実現したのですが、その後 タスク定義の構成を変更(1タスク定義内に1コンテナを配置→2コンテナを配置)するにあたって必要だった設定について備忘録のために投稿させていただきます。

以前の投稿

【備忘録】AWS ECS Blue / Green Deploy 実現のために学んだこと - Qiita

本投稿で説明しないこと

本投稿では、実現したいことのために必要なCodeBuild/Deploy設定の追加・変更・差分についてのみ記載させていただきます。
「ECS Blue / Green Deploy」の基本的な構築方法については、以前の投稿に記載しているため、省略させていただきます。

  • CodePipeline の設定方法
  • CodeBuild の設定方法
  • CodeDeploy の設定方法
  • appspec.yaml の記述方法
  • taskdef.json の記述方法
  • buildspec.yml の記述方法 など

実現したいこと

1つのタスク定義内に複数コンテナ(webサーバとappサーバ)が含まれている構成のECSサービス/タスクに対して、「ECS Blue / Green Deploy」を実現したい。

ECSの構成

ECSの構成イメージは以下になります。

  • 1つのタスク定義内に複数コンテナ(webサーバとappサーバ)が含まれている

CodePipelineの構成

CodePipelineの構成イメージは以下になります。

  • Buildステージでは、webサーバとappサーバのコンテナイメージをビルドする
  • Deployステージでは、ビルドしたコンテナイメージをECSへデプロイする


実現するための設定方法

もくじ

  1. CodeBuildで、各ステップに適切な出力アーティファクト名を付ける
  2. CodeDeployで、入力アーティファクトに、CodeBuildの出力アーティファクトを指定する
  3. CodeDeployで、入力アーティファクト毎に、プレースホルダー文字を設定する
  4. taskdef.jsonで、プレースホルダー文字を指定する

1. CodeBuildで、各ステップに適切な出力アーティファクト名を付ける

各コンテナをビルドするステップの出力アーティファクトに適切な名前をつけておきます

  • 1-1. webサーバのビルドステップの出力アーティファクトにアーティファクト名(例:web_build_output)を設定する
  • 1-2. appサーバのビルドステップの出力アーティファクトにアーティファクト名(例:app_build_output)を設定する



2. CodeDeployで、入力アーティファクトに、CodeBuildの出力アーティファクトを指定する

ビルドステップの出力アーティファクト名を入力アーティファクトとして利用するように指定します。

入力アーティファクト

  • 2-1. webサーバの出力アーティファクト(例:web_build_output)を指定する
  • 2-2. appサーバの出力アーティファクト(例:app_build_output)を指定する

3. CodeDeployで、入力アーティファクト毎に、プレースホルダー文字を設定する

タスク定義の動的な更新イメージ

また、タスク定義の動的な更新イメージで、各ビルドステップの出力アーティファクトプレースホルダ文字を指定します。

  • 3-1. 入力アーティファクトを持つイメージの詳細に、webサーバの出力アーティファクト(例:web_build_output)を指定する
  • 3-2. タスク定義のプレースホルダー文字に、プレースホルダ(例:WEB_IMAGE_NAME)を設定する

  • 3-3. 入力アーティファクトを持つイメージの詳細に、appサーバの出力アーティファクト(例:app_build_output)を指定する

  • 3-4. タスク定義のプレースホルダー文字に、プレースホルダ(例:APP_IMAGE_NAME)を設定する


4. taskdef.jsonで、プレースホルダー文字を指定する

taskdef.jsonで、イメージ名を指定する項目にCodeDeployで設定した、プレースホルダ(例:WEB_IMAGE_NAME、APP_IMAGE_NAME)を指定します。こうすることで、DeployステージでECSタスクを更新する際に、Buildステージでビルドされたコンテナイメージが利用されるようになります。

  • 4-1. taskdef.jsonで、webサーバのイメージ名にプレースホルダー文字(例:<WEB_IMAGE_NAME>)を指定する
  • 4-2. taskdef.jsonで、appサーバのイメージ名にプレースホルダー文字(例:<APP_IMAGE_NAME>)を指定する
taskdef.json
... (省略)
"containerDefinitions": [
  ... (省略)
  {
    "name" : "web"
    "image": "<WEB_IMAGE_NAME>",
    ... (省略)
  },
  {
    "name" : "app"
    "image": "<APP_IMAGE_NAME>",
    ... (省略)
  }
  ... (省略)
]
... (省略)

注意事項

すごく基本的なことなのですが、構築中に「アーティファクト名」や「プレースホルダー文字」をコピペミスしたことで、うまくデプロイされずハマってしまったことがありました orz

着手する前に簡単に設定する名称を整理しておいたほうが、ささいなミスを減らせるかもしれません orz
以下は本投稿で用いた名称です。

webサーバ

役割 名前
ビルドステップ名 WebBuild
ビルドステップの出力アーティファクト名 web_build_output
出力アーティファクトに対してつけたプレースホルダー文字 WEB_IMAGE_NAME

appサーバ

役割 名前
ビルドステップ名 AppBuild
ビルドステップの出力アーティファクト名 app_build_output
出力アーティファクトに対してつけたプレースホルダー文字 APP_IMAGE_NAME