Amazon Web Services ブログ

AWS CodeDeploy による AWS Fargate と Amazon ECS でのBlue/Greenデプロイメントの実装

AWS FargateAmazon Elastic Container Service (Amazon ECS) 上で稼働するサービスでの Blue/Green デプロイメントがサポートされます。

AWS CodeDeploy を利用し、 Blue/Green デプロイメントを行うことでアプリケーションの更新時のダウンタイムを最小限に抑えることが出来るようになります。 Blue/Green デプロイメントは、古いバージョンと新しいバージョンのアプリケーションを同時に起動し、新しいバージョンをテストしてからトラフィックをルーティングします。デプロイ状況を監視し、問題が発生した場合はすぐにロールバックすることも出来ます。

この新しい機能により、デプロイメント、テスト、トラフィックのカットオーバーが管理されたサービスを、AWS Fargate または Amazon ECS で作成することが出来ます。 サービスを更新すると、AWS CodeDeploy によってデプロイメントがトリガーされます。 このデプロイメントは、Amazon ECSと連携して、新しいバージョンのサービスを Green 環境用のターゲットグループにデプロイし、ロードバランサのリスナーを更新してこの新しいバージョンをテストできるようにし、ヘルスチェックが成功した場合にカットオーバーを実行します。

この記事では、AWS CodeDeploy を使用して AWS Fargate と Amazon ECS の Blue/Green デプロイメントを設定する方法を説明します。 AWS CodePipeline と Amazon ECR の連続配信パイプラインを使用してエンドツーエンドを自動化する方法については、「Amazon ECR をソースとしてコンテナ画像の連続配信パイプラインを構築する」を参照してください。

さあ、進んでみましょう!

事前準備

本記事に沿って進むには、これらのリソースを準備する必要があります。

  • Docker イメージリポジトリ – Dockerfile とアプリケーションソースコードから構築したイメージを含みます。このチュートリアルでは、Amazon ECRを使用しています。詳細については、「Amazon Elastic Container Registry ユーザーガイド」の「リポジトリの作成イメージのプッシュ」を参照してください。
  • Amazon ECS クラスタ。Amazon ECS を最初に使用したときに作成されたデフォルトのクラスタを使用することも、Amazon ECS コンソールのクラスタページでネットワークのみのクラスタを選択することも出来ます。詳細については「Amazon Elastic Container Service ユーザーガイド」の「クラスタの作成」を参照して下さい。

注意:イメージリポジトリとクラスタは同じリージョンで作成されている必要があります。

IAM Service Role の設定

Amazon ECS へのアプリケーションのデプロイには AWS CodeDeploy 使用するため、AWS CodeDeploy は Amazon ECS API の呼び出し、ロードバランサの変更、Lambda Function の呼び出し、CloudWatch Alerm の記述のためのアクセス権が必要です。 Blue/Green デプロイを行う Amazon ECS サービスを作成する前に、AWS CodeDeploy IAM Role (ecsCodeDeployRole) を作成する必要があります。手順については、「Amazon ECS 開発者ガイド」の「Amazon ECS CodeDeploy IAM Role」 を参照して下さい。

Application Load Balancer の作成

AWS CodeDeploy と Amazon ECS が複数のバージョンの Amazon ECS サービスへのトラフィックフローを制御できるようにするには、Application Load Balancer を作成する必要があります。

Application Load Balancer の作成」の手順に従って、次の変更を行います。

  1. 「ロードバランサーを定義する」セクションの6aで、ロードバランサに sample-web-alb という名前を付けます。
  2. 「セキュリティグループの設定」セクションの2で、
    1. セキュリティグループ名に sample-website-sg と入力。
    2. TCP port 8080 を 任意の場所 (0.0.0.0/0) でも使用できるようにする追加ルールを追加します。
  3. 「ルーティングの設定」セクションで次の操作を行います。
    1. Name に sample-website-tg-1 と入力します。
    2. Target type はIPアドレスを選択します。
  4. 「コンテナインスタンスのセキュリティグループルールを作成する」セクションの手順をスキップします。

Amazon ECS タスク定義の作成

イメージリポジトリでホストされている Docker イメージを参照する Amazon ECS タスク定義を作成します。このチュートリアルでは、Fargate の起動タイプと次のタスク定義を使用します。

{
"executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
"containerDefinitions": [{
"name": "sample-website",
"image": "<YOUR ECR REPOSITORY URI>",
"essential": true,
"portMappings": [{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}]
}],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"family": "sample-website"
}

注意:”image”の値を、事前準備で Amazon ECR にアップロードしたイメージの Amazon ECR リポジトリ URI に変更してください。

Blue/Green デプロイメントによる Amazon ECS サービスの作成

事前準備と設定手順を完了したので、AWS CodeDeploy の Blue/Green デプロイメントサポートを使用して Amazon ECS サービスを作成する準備が整いました。

Amazon ECS サービスの作成

  1. Amazon ECS コンソールを開きます。 https://console.aws.amazon.com/ecs/
  2. クラスタのリストから、タスクを実行するために作成したAmazon ECSクラスタを選択します。
  3. Servicesタブ内の、Createを選択します。

これにより、サービスの構成ウィザードが開きます。ここから、AWS Fargate と AWS CodeDeploy を使用して、アプリケーションのデプロイ、実行、および更新に必要なすべての設定を行うことが出来ます。

  1. Configure service セクション
    1. Launch type は FARGATE を選択します。
    2. Task Definition は先ほど作成した sample-website を選択します。
    3. アプリケーションタスクを実行するクラスタを選択します。
    4. Service Name は Sample-Website と入力します。
    5. Number of tasks はサービスで実行するタスクの数を指定します。
  2. Deployments セクション
    1. Deployment type は Blue/green deployment (powered by AWS CodeDeploy) を選択します。これにより、デフォルト設定を使用してCodeDeploy アプリケーションとデプロイメントグループが作成されます。これらの設定は、後で CodeDeploy コンソールで表示および編集出来ます。
    2. Service role for CodeDeploy は、事前に作成した CodeDeploy Service roleを選択します。
  3. Next step を選択
  4. VPC and security groups セクション
    1. Subnets はサービスに使用するサブネットを選択します。
    2. Security groups はEditを選択し、
      1. Assigned security groups は Select existing security group を選択します。
      2. Existing security groups では事前に作成した sample-website-sg group を選択します。
      3. Save を選択します。
  5. Load Balancing セクション
    1. Application Load Balancer を選択します。
    2. Load balancer namesample-website-alb を選択します。
  6. Container to load balance セクション
    1. Add to load balancer を選択します。
    2. Production listener port は 80:HTTP をドロップダウンリストから選択します。
    3. Test listener port は 8080 と入力します。
  7. Additional configuration セクション
    1. Target group 1 name は sample-website-tg-1 を選択します。
    2. Target group 2 name は sample-website-tg-2 と入力します。
  8. Service discovery (optional) セクションで、Enable service discovery integration をオフにして、Next step を選択します。
  9. Auto Scaling を設定しないでください。次のステップを選択します。
  10. サービスの正確性を確認し、Create service を選択します。
  11. すべてが正常に作成されたら、 View service を選択します。

少なくとも1つのタスクを実行していれば、新しく作成したサービスが表示されるはずです。

Events タブを選択すると、Amazon ECS がターゲットグループ sample-website-tg-1 にタスクをデプロイしていることがわかります。リフレッシュすると、サービスが安定した状態になるはずです。

AWS CodeDeploy コンソールに移ると、Amazon ECS のサービス設定ウィザードがCodeDeploy アプリケーションを作成していることが分かります。アプリケーションをクリックすると、作成されたデプロイメントグループを含むその他の詳細が表示されます。

デプロイメントグループ名をクリックすると、デプロイメントに関する他の詳細を表示出来ます。Deployment type の下に Blue/green と表示されます。Deployment configuration の下には CodeDeployDefault.ECSAllAtOnce と表示されます。これは、ヘルスチェックが成功した後、CodeDeploy がアプリケーション負荷分散装置のリスナーを更新して、トラフィックの100%をGreen環境に送信することを示しています。

Load Balancing セクションでは、ターゲットグループと本番とテスト用のリスナーの詳細を確認することが出来ます。

サービスのアップデートを適用して、実際に CodeDeploy のデプロイメントを見てみましょう。

CodeDeploy のBlue/Greenデプロイメントを実行する

修正されたタスク定義を作成する

デプロイメントをテストするには、アプリケーションのタスク定義のリビジョンを作成します。

  1. Amazon ECS コンソールを開きます。 https://console.aws.amazon.com/ecs/
  2. 左端のナビゲーションペインから Task Definitions を選択します。
  3. sample-website にチェックを入れ、Create new revision を選択します。
  4. 最下部の Tags セクションに移ります。
    1. Add key に Name と入力します。
    2. Add value に Sample Website と入力します。
  5. Create を選択します。

ECSサービスを更新する

タスク定義の最新リビジョンを使用するように Amazon ECS サービスを更新する必要があります。

  1. Amazon ECS コンソールを開きます。 https://console.aws.amazon.com/ecs/
  2. Amazon ECS サービスをデプロイした Amazon ECS クラスタを選択します。
  3. sample-website サービスの横にあるチェックボックスをオンにします。
  4. 「更新」を選択して、「サービスの更新」ウィザードを開きます。
    1. Configure service セクションに移り、Task Definition の項目でリビジョンのドロップダウンリストから2 (latest)を選択します。
  5. Next step を選択します。
  6. Configure deployments をスキップし、 Next step を選択します。
  7. Configure network をスキップし、 Next step を選択します。
  8. Set Auto Scaling (optional) をスキップし、 Next step を選択します。
  9. 変更を確認し、Update Service を選択します。
  10. View Service を選択します。

Deployments タブに移動すると Blue/Green デプロイメントに関する詳細を確認できます。

Deployments ID をクリックすると、CodeDeploy デプロイメントの詳細ビューに移動できます。

そこからデプロイメントのステータスを見ることができます。

トラフィックの移行の進行状況を確認することもできます。

問題が発生した場合は、展開を停止してロールバックすることができます。これによりトラフィックは元の(Blue)タスクセットに戻され、展開が停止されます。

既定では、CodeDeploy は正常な展開後1時間待ってから元のタスクセットを終了します。この間隔を短縮するには、AWS CodeDeploy コンソールを使用します。タスクセットが終了すると、CodeDeploy はデプロイメント完了をマークします。

終わりに

この記事では、AWS CodeDeploy を使用したBlue/Greenデプロイメントによる AWS Fargate ベースの Amazon ECS サービスを作成する方法を説明しました。Application Load Balancer や関連するターゲットグループなど、必須コンポーネントを AWS Management Console からすべて構成する方法も説明しました。この記事の情報を参考にして、自分のアプリケーションにこれを実装してください。

この記事は SA 松田が翻訳しました。原文はこちら