CodeDeploy による ブルー/グリーンデプロイ - Amazon Elastic Container Service

CodeDeploy による ブルー/グリーンデプロイ

ブルー/グリーンデプロイタイプでは、CodeDeploy によって制御される ブルー/グリーンデプロイモデルを使用します。このデプロイタイプは、本番稼働用トラフィックを送信する前にサービスの新しいデプロイを検証するために使用します。詳細については、「AWS CodeDeploy ユーザーガイド」の「CodeDeploy とは」を参照してください。

ブルー/グリーンデプロイ中にトラフィックを移行するには、次の 3 つの方法があります。

  • Canary - トラフィックは 2 つの増分で移行されます。事前定義された複数の Canary オプションから選択し、最初の増分および間隔でトラフィックを更新済みタスクセットに移行する割合 (%) を分単位で指定できます。次に 2 回目の増分で残りのトラフィックを移行します。

  • Linear - トラフィックは等しい増分で移行され、増分間の間隔 (分) も同じです。事前定義された複数の線形オプションから選択し、増分ごとに移行するトラフィックの割合 (%) と増分間の間隔 (分) を指定できます。

  • 一括 - すべてのトラフィックを元のタスクセットから更新済みタスクセットに同時に移行します。

以下に示しているのは、サービスが Blue/Green デプロイタイプを使用するときに Amazon ECS が使用する CodeDeploy のコンポーネントです。

CodeDeploy アプリケーション

CodeDeploy リソースのコレクションです。これは 1 つ以上のデプロイグループで構成されます。

CodeDeploy デプロイグループ

デプロイ設定。これには以下の構成要素があります。

  • Amazon ECS クラスターとサービス

  • ロードバランサーのターゲットグループとリスナー情報

  • デプロイメントロールバック戦略

  • トラフィックルーティング設定

  • 元のリビジョンの終了設定

  • デプロイ設定

  • デプロイメントを停止するために設定できる CloudWatch アラームの設定

  • 通知用の SNS または CloudWatch Eventsの設定

詳細については、AWS CodeDeployユーザーガイド「デプロイグループの操作」を参照してください。

CodeDeploy デプロイ構成

デプロイメント中に本番トラフィックを置換タスクに CodeDeploy がルーティングする方法を指定します。次の事前定義された線形および Canary デプロイ設定を使用できます。また、カスタム定義の線形および Canary デプロイを作成することもできます。詳細については、AWS CodeDeploy ユーザーガイドの「デプロイ構成の操作」を参照してください。

  • [CodeDeployDefault.ECSAllAtOnce]: すべてのトラフィックを同時に更新済みの Amazon ECS コンテナに移行します。

  • CodeDeployDefault.ECSLinear10PercentEvery1Minutes: すべてのトラフィックがシフトされるまで、1 分ごとにトラフィックの 10 パーセントをシフトします。

  • CodeDeployDefault.ECSLinear10PercentEvery3Minutes: すべてのトラフィックがシフトされるまで、3 分ごとにトラフィックの 10 パーセントをシフトします。

  • [CodeDeployDefault.ECSCanary10Percent5Minutes]: 最初の増分で 10 パーセントのトラフィックをシフトします。残りの 90 パーセントは 5 分後にデプロイされます。

  • [CodeDeployDefault.ECSCanary10percent15Minutes]: 最初の増分で 10 パーセントのトラフィックをシフトします。残りの 90 パーセントは 15 分後にデプロイされます。

リビジョン

リビジョンは、CodeDeploy アプリケーション仕様ファイル (AppSpec ファイル) です。AppSpec ファイルでは、タスク定義の完全な ARN と置換タスクセットのコンテナとポートを指定し、新しいデプロイが作成時にトラフィックがルーティングされるようにします。コンテナ名は、タスク定義内で参照されているコンテナ名のいずれかに設定する必要があります。ネットワーク設定またはプラットフォームのバージョンがサービス定義で更新された場合は、AppSpec ファイルでその詳細についても指定する必要があります。また、デプロイメントライフサイクルイベント中に実行する Lambda 関数も指定できます。Lambda 関数を使用することで、デプロイメント中にテストを実行し、メトリクスを返すことができます。詳細については、AWS CodeDeployユーザーガイド「AppSpec ファイルリファレンス」を参照してください。

ブルー/グリーンデプロイの考慮事項

ブルー/グリーンデプロイタイプを使用するときは、以下の点を考慮します。

  • Blue/Green デプロイタイプを使用して、Amazon ECS サービスが最初に作成されたとき、Amazon ECS タスクセットが作成されます。

  • Application Load Balancer または Network Load Balancer の使用にサービスを設定する必要があります。ロードバランサーの要件は以下のとおりです。

    • 本番稼働用リスナーをロードバランサーに追加する必要があります。これは本番トラフィックをルーティングするために使用されます。

    • オプションテストリスナーをロードバランサーに追加することができます。これはテストトラフィックをルーティングするために使用されます。テストリスナーを指定する場合、CodeDeploy はデプロイメント中にテストトラフィックを置換タスクセットにルーティングします。

    • 本番稼働用とテストリスナーの両方が同じロードバランサーに属している必要があります。

    • ロードバランサーに対してターゲットグループを定義する必要があります。ターゲットグループは本番稼働用リスナーを通じてトラフィックをサービスの元のタスクセットにルーティングします。

    • Network Load Balancer を使用する場合、CodeDeployDefault.ECSAllAtOnce デプロイメント構成のみがサポートされます。

  • サービスの自動スケーリングと ブルー/グリーンデプロイタイプを使用するように設定されたサービスでは、自動スケーリングはデプロイ中にブロックされませんが、状況によってはデプロイが失敗する場合があります。以下では、この動作について詳しく説明します。

    • サービスがスケーリング中の状態でデプロイが開始されると、グリーンタスクセットが作成され、CodeDeploy は Green タスクセットが定常状態になるまで最大 1 時間待機し、完了するまでトラフィックをシフトしません。

    • サービスが ブルー/グリーンデプロイのプロセス中で、スケーリングイベントが発生した場合、トラフィックは 5 分間シフトし続けます。サービスが 5 分以内に定常状態にならない場合、CodeDeploy はデプロイを停止し、失敗としてマークします。

    • サービスが青/緑でのデプロイのプロセス中でスケーリングイベントが発生した場合、必要タスクカウントが予期しない値に設定される場合があります。これは実行中のタスク数を現在の容量と見なすことで自動スケーリングによって発生します。これは必要タスク数の計算で使用される適切なタスク数の 2 倍です。

  • Fargate 起動タイプ、CODE_DEPLOY またはデプロイメントコントローラータイプを使用するタスクは、DAEMON スケジューリング戦略をサポートしません。

  • 最初に CodeDeploy アプリケーションおよびデプロイグループを作成する際に、以下を指定する必要があります。

    • ロードバランサーに対して 2 つのターゲットグループを定義する必要があります。1 つのターゲットグループは、Amazon ECS サービスの作成時に、ロードバランサーに対して定義された最初のターゲットグループです。2 番目のターゲットグループの唯一の要件は、サービスが使用するものとは別のロードバランサーに関連付けることはできないということです。

  • Amazon ECS サービスに対して CodeDeploy デプロイを作成すると、CodeDeploy は置換タスクセット (または Green タスクセット) をデプロイで作成します。テストリスナーをロードバランサーに追加した場合、CodeDeploy はテストトラフィックを置換タスクセットにルーティングします。この時点で検証テストを実行できます。次に、CodeDeploy は本番稼働用トラフィックを元のタスクセットから置換タスクセットに再ルーティングします。このときデプロイグループへのトラフィックの再ルーティング設定に従います。

IAM アクセス権限が必要な Blue/Green デプロイ

Amazon ECS ブルー/グリーンデプロイは、Amazon ECS と CodeDeploy API の組み合わせによって実現されています。ユーザーは、Amazon ECS ブルー/グリーンデプロイを使用するためには、これらのサービスに対する適切なアクセス権限が必要です。AWS Management Consoleまたは AWS CLI または SDK を使用します。

サービスの作成や更新に使用するデフォルトの IAM アクセス権限に加えて、Amazon ECS には次のアクセス権限が必要です。AmazonECS_FullAccess IAM ポリシーには、次の許可が追加されています。詳細については、「AmazonECS_FullAccess」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateApplication", "codedeploy:CreateDeployment", "codedeploy:CreateDeploymentGroup", "codedeploy:GetApplication", "codedeploy:GetDeployment", "codedeploy:GetDeploymentGroup", "codedeploy:ListApplications", "codedeploy:ListDeploymentGroups", "codedeploy:ListDeployments", "codedeploy:StopDeployment", "codedeploy:GetDeploymentTarget", "codedeploy:ListDeploymentTargets", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision", "codedeploy:BatchGetApplicationRevisions", "codedeploy:BatchGetDeploymentGroups", "codedeploy:BatchGetDeployments", "codedeploy:BatchGetApplications", "codedeploy:ListApplicationRevisions", "codedeploy:ListDeploymentConfigs", "codedeploy:ContinueDeployment", "sns:ListTopics", "cloudwatch:DescribeAlarms", "lambda:ListFunctions" ], "Resource": ["*"] } ] }
注記

タスクおよびサービスを実行するために必要な標準の Amazon ECS アクセス権限を付与するだけでなく、ユーザーにはタスクの IAM ロールを使用する iam:PassRole アクセス権限も必要です。

CodeDeploy には、Amazon ECS API の呼び出し、Elastic Load Balancing の変更、Lambda 関数の起動、CloudWatch アラームの記述のアクセス権限が必要です。また、ユーザーの代わりにサービスの必要数を変更するためのアクセス許可も必要です。Blue/Green デプロイタイプを使用する Amazon ECS サービスを作成する前に、IAM ロール (ecsCodeDeployRole) を作成する必要があります。詳細については、「Amazon ECS CodeDeploy IAM ロール」を参照してください。

サービス作成の例」および「サービスの更新の例」の IAM ポリシー例に、ユーザーが AWS Management Consoleで Amazon ECS ブルー/グリーンデプロイを使用するためのアクセス許可が示されています。