AWS
Docker
ECS
CodeDeploy
Fargate
63
どのような問題がありますか?

この記事は最終更新日から1年以上が経過しています。

投稿日

更新日

AWS FargateでBlue/Greenデプロイを行う

概要

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 typeBlue/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) でも使用できるように、ルールを追加します。
スクリーンショット 2019-03-17 16.28.09.png

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

「ステップ 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

スクリーンショット 2019-03-17 17.04.06.png

Additional configuration
ここでは、Blue/Greenデプロイで使用する2つのターゲットグループに関する設定を行います。
このターゲットグループをCodeDeployが切り替えることによって、Blue/Greenデプロイが可能になります。

ターゲットグループ1は、ALB作成時に作成したstg-fargate-blueを選択します。
スクリーンショット 2019-03-17 17.06.54.png

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

上記の設定が完了したら、ECSサービスを作成します。
この時点で、ALBを確認するとターゲットグループが作成されていることが確認できます。
スクリーンショット 2019-03-17 17.12.13.png

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

デプロイグループのデプロイ設定を変更

デプロイグループのデフォルトの設定では、デプロイされた際に、新しくデプロイが行われた側のターゲットグループに、トラフィックが自動で流れ始めてしまいます。
今回は、動作確認をしてからターゲットグループの変更を行いたいため、トラフィックの再ルーティングするタイミングを指定します。今回は15分後に、再ルーティングされるように変更します。この設定をすることで、15分間待たなくても手動で再ルーティングすることも可能です。詳細は後述。

また、デフォルトの設定では、タスクの正常な展開後(再ルーティング後)1時間待ってから元のタスクが終了します。今回は30分後にタスクが終了するように設定を変更します。

デプロイグループを選択し、「編集」ボタンを押下することで、デプロイ設定画面が表示されます。

スクリーンショット 2019-03-17 18.03.57.png
スクリーンショット 2019-03-17 17.59.28.png

Blue/Greenデプロイをする

ECRのリポジトリに新しいDockerイメージをPushする

ECRのリポジトリは下記の通りとなっています。
スクリーンショット 2019-03-17 17.36.13.png

タグ1.0.2,latestをつけたDockerイメージをECRのリポジトリにpushします。
latestが最新のイメージのみについています。古いイメージについていたlatestは自動的に剥がされています。
スクリーンショット 2019-03-17 17.53.55.png

タスク定義のリビジョンを作成し、ECSサービスを更新する

タスクの定義の新しいリビジョンを作成し、ECSサービスを更新します。
このサービスを更新した時点で、CodeDeployによるデプロイが開始されます。

CodeDeployからデプロイのステータス、トラフィック移行の進行状況を確認できます。
スクリーンショット 2019-03-17 18.10.32.png

タスクを確認すると、新旧のタスクのリビジョンが起動していることを確認できます。
スクリーンショット 2019-03-17 18.12.05.png

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

CodeDeployの「トラフィックの再ルーティング」ボタンを押下することで、デプロイしたターゲットグループにトラフィックが流れ始めます。
スクリーンショット 2019-03-17 18.19.09.png

スクリーンショット 2019-03-17 18.21.35.png

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

旧タスクの待機時間が終了すると、旧タスクが停止されデプロイが完了します。
スクリーンショット 2019-03-17 18.50.10.png

ロールバック機能

デプロイに問題が発生した場合は、展開を停止してロールバックすることができます。
サービスのデプロイタブに表示されている「Stop and rollback deployment」ボタンを押下することで、展開が停止されます。

スクリーンショット 2019-03-17 18.17.29.png

まとめ

ECSでCodeDeployを使用したBlue/Greenデプロイメントを利用することで、簡単にBlue/Greenデプロイができました。CodePipelineを利用したデプロイもサポートされているので、さらにデプロイが簡単になりますね!

参考記事

参考にさせていただきました。ありがとうございます。
AWS CodeDeploy による AWS Fargate と Amazon ECS でのBlue/Greenデプロイメントの実装
ECSでCodeDeployを使用したBlue/Green Deploymentがサポートされたので早速試してみた #reinvent | DevelopersIO

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
kobayashi-m42
フリーランスのWEBエンジニアです。AWS /Docker /Go /Laravel /Vue.js
この記事は以下の記事からリンクされています

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
63
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー