CodeDeployを利用してECS FargateをBlue/Greenデプロイする

インフラ

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

先日、PrivateLinkとALBを利用してECS FargateをロードバランシングするでECSをALBでロードバランシングさせる手順について紹介しました。

PrivateLinkとALBを利用してECS Fargateをロードバランシングする

2020年6月28日

ロードバランサーのアクセス先に本番環境と検証環境を用意することで、Blue/Greenデプロイメントと呼ばれるデプロイ手法を実現できます。

Blue/Greenデプロイメントはロードバランサーの向き先を変えるだけでデプロイが完了するため、『ダウンタイムを最小限で抑えられる』『ロールバックを迅速にできる』などのメリットがあります。
ECSではCodeDeployを利用することでBlue/Greenデプロイメントを実現できます。

そこで今回はCodeDeployを利用してECSのBlue/Greenデプロイメントを実現する手順について紹介します。
なお、ECSの実行環境にはFargateを利用します。

下準備

CodeDeployを利用してBlue/Greenデプロイメントを実現するために事前にやっておくことについて記載します。

IAMロールを追加する

CodeDeployを利用するためには、EC2の場合はAWSCodeDeployRole、ECSの場合はAWSCodeDeployRoleForECSのロールが必要になるためロールの追加をします。 1

IAMダッシュボードの『ロール』→『ロールの作成』を選択します。

『CodeDeploy』→『CodeDeploy ECS』を選択します。

AWSCodeDeployRoleForECSが表示されるのでロールを作成します。

タスクをプライベートサブネットでロードバランシングする環境の用意

既にECSのタスク(Dockerコンテナ)をロードバランシングさせる環境が用意されているという前提で話を進めます。
今回はロードバランサーをパブリックサブネットに、タスクをプライベートサブネットに配置します。

タスクをプライベートサブネットでロードバランシングするために以下の項目を準備します。

  • サブネットの作成
  • セキュリティグループの作成
  • ロードバランサーの作成
  • ターゲットグループの作成
  • ECRの作成
  • PrivateLinkの作成

上記の環境構築手順についてはPrivateLinkとALBを利用してECS Fargateをロードバランシングするを参考にしてください。

PrivateLinkとALBを利用してECS Fargateをロードバランシングする

2020年6月28日

ロードバランサーのセキュリティグループの編集

Blue/Greenデプロイメントでは、本番稼働しているポート(プロダクションリスナーポート)だけでなく、デプロイ前の検証用ポート(テストリスナーポート)の設定ができます。

検証用のポートでもアプリケーションにアクセスできるようにするため、テストリスナーポートをロードバランサーのインバウンドルールに追加します。今回は8080を検証用のポートにしました。

ECSの作成

今回はECSの実行環境にFargateを利用します。
『クラスター』および『タスク定義』の作成手順はローリングアップデート(Blue/Greenデプロイメントではないデプロイメント手法)の場合と同じになります。

クラスターの作成

クラスターとはECSでDockerコンテナを動かすときのホストマシンの論理グループで、ECSの一番大枠の概念にあたります。

Amazon ECSの『クラスター』→『クラスターの作成』を選択します。

『ネットワーキングのみ』を選択します。

任意のクラスター名を設定すればクラスターの作成は完了です。

タスク定義の作成

タスクとはアプリケーションを構成する1つ以上のコンテナ(群)のことをいいます。
タスク定義とは、タスク内でのコンテナ間のやりとりの方法やコンテナ数、使用ポートといったコンテナ情報を明記したものです。

Amazon ECSの『タスク定義』→『新しいタスク定義の作成』を選択します。

『Fargate』を選択します。

タスク定義の詳細設定は【AWS】ECR + ECS + RDSを利用したDocker環境構築手順『タスク定義を作成する』で紹介した内容とほぼ同じです。

Fargateのタスク定義のうち、EC2のそれと異なる点は以下の点です。

  • awsvpcを利用するため、ポートマッピングはコンテナポートのみ指定
  • タスクサイズ(『タスクメモリ』と『タスク CPU』)を指定
  • 『タスクの実行 IAMロール』を『ecsTaskExecutionRole』にする

サービスの作成

サービスとはクラスター内で実行されるタスク数やタスクの配置方法を制御する機能です。

クラスターの『サービス』タブの『作成』を選択します。

『起動タイプ』にFARGATEを選択します。

デプロイメントについて、『デプロイメントタイプ』は『Blue/Greenデプロイメント』を選択します。『CodeDeployのサービスロール』は事前に作成したAWSCodeDeployRoleForECSを指定します。

『VPCとセキュリティグループ』はタスクを配置するプライベートサブネットの情報を設定します。プライベートサブネットなので『パブリック IP の自動割り当て』は不要です。

『ロードバランシング』はALBを選択し、事前に作成したロードバランサー名を指定します。

ロードバランス用のコンテナについて、『テストリスナー』にチェックをつけ、『テストリスナーポート』はあらかじめ検証用にポート開放しておいた8080を新規作成します。

Blue/GreenデプロイメントではALBのターゲットグループが2つ必要ですので作成していきます。 2
『ターゲットグループ1の名前』には事前に作成したALBのターゲットグループを指定します。今回はalb-blueというターゲットグループを事前に作成しておきました。

『ターゲットグループ2の名前』は新規作成をします。今回はalb-greenというターゲットグループ名にしました。

Blue/Greenデプロイメントはここで指定した2つのターゲットグループを切り替えることでデプロイを実現します。

これでサービスの作成はOKです。

サービスの作成されると、ロードバランサーに新規リスナーポート(8080)と新規ターゲットグループ(alb-green)が追加されます。

CodeDeployのアプリケーションも自動で追加されます。

動作確認

サービスを更新したらデプロイメントは自動で実行されるので特に行うことはありません。しばらくするとデプロイメントが実行され、アプリケーションが起動します。

サービス作成後の状態

デプロイメントが正常に実行されるとタスク一覧にタスクが表示されます。今回はタスク数を1つにしたため、1つのタスクがRUNNING状態になっています。

http://[ALBのDNS名]:80でアクセスすると画面が表示されます↓

デプロイを実行し、BlueとGreenを並行稼働させる

アプリケーションが起動している状態ですので、実際にBlue/Greenデプロイメントでアプリケーションを更新してみます。

自動作成されたCodeDeployの設定では検証環境と本番環境のトラフィックの切り替えが即時反映されるようになっています。
トラフィックを切り替える前に検証環境で確認をしたいため、デプロイの設定を修正します。

CodeDeployのダッシュボードにある『アプリケーション』の『デプロイグループ』の『編集』を選択します。

『トラフィックを再ルーティングするタイミングを指定します』に変更をします。時間は適当でOKです。

デプロイの設定が完了したので、デプロイを実行します。
CodeDeployの実行はサービスの更新がトリガーとなりますので、『ECRへpush』→『タスク定義のリビジョン作成』→『サービスでタスク定義のリビジョンを変更』を実行します。

サービスが更新されると、CodeDeployのアプリケーションのデプロイが実行されます。

検証環境(Green)の準備ができると、本番環境(Blue)と検証環境(Green)でアプリケーションが並行稼働します。
並行稼働しているため、タスク数も2つになっています。

80ポートでアクセスすると現在稼働中の画面が表示されます↓

8080ポートでアクセスするとデプロイ予定の画面が表示されます↓

BlueとGreenの切り替えを行う

検証環境の確認が完了したらCodeDeployのデプロイ詳細にある『トラフィックの再ルーティング』を実行します。

デプロイが完了すると『置換』が100%になります。
デプロイが正常に終了し、ロールバックの必要がないと判断したら『元のタスクセットの終了』を選択します。

『元のタスクセットの終了』をすると、BlueとGreenの並行稼働が終わるためタスク数が1つになります。

トラフィックの切り替えが完了しているため、ALBのターゲットグループは80ポートと8080ポートはalb-greenを向いていることがわかります。

80ポートでアクセスするとデプロイ後の画面が表示されます↓

Blue/GreenデプロイメントではBlueとGreenの役割を交互に代えながらデプロイが実行されます。
ですので、次回デプロイする際はalb-blueのターゲットグループがテストポート(8080)に紐付くことになり、デプロイが完了するとalb-greenのかわりにalb-blueがロードバランサーに紐づくようになります。

参考: ロールバックの方法について

トラフィックを切り替える前および切り替え後にも『デプロイを停止してロールバック』という項目が表示されています。これを押すとロールバックが完了します。

まとめ

以上でCodeDeployを利用してECS FargateをBlue/Greenデプロイする手順の紹介を終わります。

CodeDeployでBlue/Greenデプロイメントを実現する手順
  1. IAMロールの追加する
  2. ロードバランサーのセキュリティグループを編集する
  3. 検証用のリスナーポートとターゲットグループを作成する
  4. 自動で作成されたデプロイ設定の修正をする
  5. サービス更新をしてCodeDeployを実行する
  6. 検証環境でのチェックが完了したらトラフィックを切り替える

この記事がいいなと思いましたらTwitter(@nishina555)のフォローもよろしくお願いします!

AWSオススメ参考書