概要
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