概要
CodeDeployを利用したFargateでのBlue/Greenデプロイメントをコンソールから実装します。
基本的な内容は下記の記事を参考にしています。記事には書かれていないECRリポジトリのイメージの更新も含めて記載し、デプロイの流れを説明しています。
AWS CodeDeploy による AWS Fargate と Amazon ECS でのBlue/Greenデプロイメントの実装 | Amazon Web Services
全体の流れ
FargateでBlue/Greenデプロイメントを実装するための前提条件と、全体の流れを把握します。
前提条件
- ECRにリポジトリが作成されていること
- ECRにリポジトリに
latestタグがついたDockerメージがpushされていること - ECSクラスターが作成されていること
ECRにリポジトリを作成しDockerイメージをpushする方法については、下記の記事で手順を書いていますので、よろしければご覧ください。
LaravelアプリケーションをAWS上のDockerで動かす
Blue/Greenデプロイに必要なリソースを作成
- IAMロールの作成
- ALBの作成
- タスクの定義の作成
- ECSサービスの作成
詳細は後述しますが、ECSサービスの作成の中で、Deployment typeにBlue/Green deploymentを選択することで、CodeDeployアプリケーションとデプロイメントグループが自動的に作成されます。CodeDeployを手動で作る必要がなく、とても便利です。
Blue/Greenデプロイをする
- ECRのリポジトリに新しいDockerイメージをpushする
- タスク定義のリビジョンを作成
- 新しいリビジョンのタスクの定義を使用し、ECSサービスを更新する
ECSサービスを更新した時点で、CodeDeployによるBlue/Greenデプロイが実行されます。
これより先は、具体的な手順を解説していきます。
Blue/Greenデプロイに必要なリソースを作成
IAMロールの作成
ECSサービスが更新されると、CodeDeployによってECSへのデプロイが行われます。
そのため、CodeDeployがECSへのデプロイに関する操作を行えるようにIAMロールの作成を行います。
- CodeDeploy用のIAMロールを作成し、
AWSCodeDeployRoleForECSLimited管理ポリシーをアタッチ - タスク実行ロールまたはタスクロール上書きに対する iam:PassRole アクセス許可を、CodeDeploy用のIAMロールにインラインポリシーとして追加
Fargateの場合、タスク実行ロールが追加されていると思いますので、2つめの手順も忘れずに実行してください。
詳細な手順については、「Amazon ECS 開発者ガイド」のAmazon ECS CodeDeploy IAM Role を参照して下さい。
ALBの作成
443/tcp、8080/tcpを受け付けるALBを作成します。
この手順ではアプリケーションの都合上443/tcpとしていますが、80/tcpでも問題ありません。
ALBの作成の中で、セキュリティグループも新規作成します。
8080/tcpを任意の場所 (0.0.0.0/0) でも使用できるように、ルールを追加します。

ルーティングの設定で、新しいターゲットグループを作成します。
名前は、Blue/Greenデプロイのためのターゲットグループであることがわかるように、stg-fargate-blueとしてます。Blue/Greenデプロイにおいて、ターゲットを切り替えるためのもう1つのターゲットグループは、ECSサービスの作成において作成するため、現時点ではターゲットグループは1つで大丈夫です。

「ステップ 5: ターゲットの登録」は、特に設定は必要ありません。確認画面で設定を確認し、ALBを作成してください。
また、必要に応じてRoute53のレコードセットの追加を行います。
タスクの定義の作成
Fargateのタスクの定義の作成方法については省略させていただきます。
ECSサービスの作成
サービスの設定
| 項目 | 値 |
|---|---|
| 起動タイプ | FARGATE |
| タスク定義 | 上記で作成したタスクの定義を選択 |
| プラットフォームのバージョン | LATEST |
| クラスタ | 作成済みのクラスタを選択 |
| サービス名 | 任意のサービス名 |
| タスクの数 | 1 |
サービスの設定
| 項目 | 値 |
|---|---|
| Deployment type | Blue/green deployment (powered by AWS CodeDeploy) |
| Service role for CodeDeploy | 上記で作成したCodeDeploy用のIAMロール選択 |
VPC とセキュリティグループ
VPCは、ALB作成で指定したVPC指定。
セキュリティグループは、作成済みのECSサービスのセキュリティグループを指定。
Elastic Load Balancing(オプション)
| 項目 | 値 |
|---|---|
| ELB タイプ | Application Load Balancer |
| ELB 名 | 上記で作成したALBを選択 |
「負荷分散用のコンテナ」をクリックして、負荷分散用のコンテナを登録します。
| 項目 | 値 |
|---|---|
| リスナーポート | 443:HTTPS をドロップダウンリストから選択 |
| リスナープロトコル | HTTPS |
| Test listener | チェックあり |
| Test listener port | 8080 |
| Test listener protocol | HTTP |
Additional configuration
ここでは、Blue/Greenデプロイで使用する2つのターゲットグループに関する設定を行います。
このターゲットグループをCodeDeployが切り替えることによって、Blue/Greenデプロイが可能になります。
ターゲットグループ1は、ALB作成時に作成したstg-fargate-blueを選択します。

ターゲットグループ2は、新規で作成します。名前は、stg-fargate-greenとしておきます。なお、ターゲットグループ名、ヘルスチェックパスについては環境に合わせて変更してください。

上記の設定が完了したら、ECSサービスを作成します。
この時点で、ALBを確認するとターゲットグループが作成されていることが確認できます。

CodeDeployについても確認してみると、アプリケーションとデプロイグループが作成されています。(この例だと名前が微妙ですね。)

デプロイグループのデプロイ設定を変更
デプロイグループのデフォルトの設定では、デプロイされた際に、新しくデプロイが行われた側のターゲットグループに、トラフィックが自動で流れ始めてしまいます。
今回は、動作確認をしてからターゲットグループの変更を行いたいため、トラフィックの再ルーティングするタイミングを指定します。今回は15分後に、再ルーティングされるように変更します。この設定をすることで、15分間待たなくても手動で再ルーティングすることも可能です。詳細は後述。
また、デフォルトの設定では、タスクの正常な展開後(再ルーティング後)1時間待ってから元のタスクが終了します。今回は30分後にタスクが終了するように設定を変更します。
デプロイグループを選択し、「編集」ボタンを押下することで、デプロイ設定画面が表示されます。
Blue/Greenデプロイをする
ECRのリポジトリに新しいDockerイメージをPushする
タグ1.0.2,latestをつけたDockerイメージをECRのリポジトリにpushします。
latestが最新のイメージのみについています。古いイメージについていたlatestは自動的に剥がされています。

タスク定義のリビジョンを作成し、ECSサービスを更新する
タスクの定義の新しいリビジョンを作成し、ECSサービスを更新します。
このサービスを更新した時点で、CodeDeployによるデプロイが開始されます。
CodeDeployからデプロイのステータス、トラフィック移行の進行状況を確認できます。

タスクを確認すると、新旧のタスクのリビジョンが起動していることを確認できます。

ALBのエンドポイントの8080番ポートにアクセスし、正常に動作していることを確認します。
問題がなければ、デプロイしたターゲットグループにトラフィックを向け、リリースを実施します。
CodeDeployの「トラフィックの再ルーティング」ボタンを押下することで、デプロイしたターゲットグループにトラフィックが流れ始めます。

ALBのリスナーを確認すると、ターゲットグループが変更されていることを確認できます。
HTTPSの転送先のターゲットグループがstg-fargate-blueからstg-fargate-greenに変更されています。

旧タスクの待機時間が終了すると、旧タスクが停止されデプロイが完了します。

ロールバック機能
デプロイに問題が発生した場合は、展開を停止してロールバックすることができます。
サービスのデプロイタブに表示されている「Stop and rollback deployment」ボタンを押下することで、展開が停止されます。
まとめ
ECSでCodeDeployを使用したBlue/Greenデプロイメントを利用することで、簡単にBlue/Greenデプロイができました。CodePipelineを利用したデプロイもサポートされているので、さらにデプロイが簡単になりますね!
参考記事
参考にさせていただきました。ありがとうございます。
AWS CodeDeploy による AWS Fargate と Amazon ECS でのBlue/Greenデプロイメントの実装
ECSでCodeDeployを使用したBlue/Green Deploymentがサポートされたので早速試してみた #reinvent | DevelopersIO
