

# Amazon ECS 用の CodeDeploy ブルー/グリーンデプロイ
<a name="deployment-type-bluegreen"></a>

Amazon ECS ブルー/グリーンデプロイを使用することをお勧めします。詳細については、「[Amazon ECS ブルー/グリーンデプロイの作成](deploy-blue-green-service.md)」を参照してください。

*ブルー/グリーンデプロイ*タイプでは、CodeDeploy によって制御される ブルー/グリーンデプロイモデルを使用します。このデプロイタイプは、本番稼働用トラフィックを送信する前にサービスの新しいデプロイを検証するために使用します。詳細については、「*AWS CodeDeploy ユーザーガイド*」の「[What Is CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html)」を参照してください。デプロイ前に Amazon ECS サービスの状態を検証します。

ブルー/グリーンデプロイ中にトラフィックを移行するには、次の 3 つの方法があります。
+ **Canary** - トラフィックは 2 つの増分で移行されます。事前定義された複数の Canary オプションから選択し、最初の増分および間隔でトラフィックを更新済みタスクセットに移行する割合 (%) を分単位で指定できます。次に 2 回目の増分で残りのトラフィックを移行します。
+ **Linear** - トラフィックは等しい増分で移行され、増分間の間隔 (分) も同じです。事前定義された複数の線形オプションから選択し、増分ごとに移行するトラフィックの割合 (%) と増分間の間隔 (分) を指定できます。
+ **一括** - すべてのトラフィックを元のタスクセットから更新済みタスクセットに同時に移行します。

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

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

**CodeDeploy デプロイグループ**  
デプロイ設定。これには以下の構成要素があります。  
+ Amazon ECS クラスターとサービス
+ ロードバランサーのターゲットグループとリスナー情報
+ デプロイメントロールバック戦略
+ トラフィックルーティング設定
+ 元のリビジョンの終了設定
+ デプロイ設定
+ デプロイメントを停止するために設定できる CloudWatch アラームの設定
+ 通知用の SNS または CloudWatch Eventsの設定
詳細については、*AWS CodeDeployユーザーガイド*の[「デプロイグループの操作」](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-groups.html)を参照してください。

**CodeDeploy デプロイ構成**  
デプロイメント中に本番トラフィックを置換タスクに CodeDeploy がルーティングする方法を指定します。次の事前定義された線形および Canary デプロイ設定を使用できます。また、カスタム定義の線形および Canary デプロイを作成することもできます。詳細については、*AWS CodeDeploy ユーザーガイド*の「[デプロイ構成の操作](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)」を参照してください。  
+ [**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 ファイルリファレンス」](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html)を参照してください。

## 考慮事項
<a name="deployment-type-bluegreen-considerations"></a>

ブルー/グリーンデプロイタイプを使用するときは、以下の点を考慮します。
+ Blue/Green デプロイタイプを使用して、Amazon ECS サービスが最初に作成されたとき、Amazon ECS タスクセットが作成されます。
+ Application Load Balancer または Network Load Balancer の使用にサービスを設定する必要があります。ロードバランサーの要件は以下のとおりです。
  + 本番稼働用リスナーをロードバランサーに追加する必要があります。これは本番トラフィックをルーティングするために使用されます。
  + オプションテストリスナーをロードバランサーに追加することができます。これはテストトラフィックをルーティングするために使用されます。テストリスナーを指定する場合、CodeDeploy はデプロイメント中にテストトラフィックを置換タスクセットにルーティングします。
  + 本番稼働用とテストリスナーの両方が同じロードバランサーに属している必要があります。
  + ロードバランサーに対してターゲットグループを定義する必要があります。ターゲットグループは本番稼働用リスナーを通じてトラフィックをサービスの元のタスクセットにルーティングします。
  + Network Load Balancer を使用する場合、`CodeDeployDefault.ECSAllAtOnce` デプロイメント構成のみがサポートされます。
+ サービスの自動スケーリングと ブルー/グリーンデプロイタイプを使用するように設定されたサービスでは、自動スケーリングはデプロイ中にブロックされませんが、状況によってはデプロイが失敗する場合があります。以下では、この動作について詳しく説明します。
  + サービスがスケーリング中の状態でデプロイが開始されると、グリーンタスクセットが作成され、CodeDeploy は Green タスクセットが定常状態になるまで最大 1 時間待機し、完了するまでトラフィックをシフトしません。
  + サービスが ブルー/グリーンデプロイのプロセス中で、スケーリングイベントが発生した場合、トラフィックは 5 分間シフトし続けます。サービスが 5 分以内に定常状態にならない場合、CodeDeploy はデプロイを停止し、失敗としてマークします。
+ Fargate または `CODE_DEPLOY` のデプロイコントローラータイプを使用するタスクは、`DAEMON` スケジューリング戦略をサポートしません。
+ 最初に CodeDeploy アプリケーションおよびデプロイグループを作成する際に、以下を指定する必要があります。
  + ロードバランサーに対して 2 つのターゲットグループを定義する必要があります。1 つのターゲットグループは、Amazon ECS サービスの作成時に、ロードバランサーに対して定義された最初のターゲットグループです。2 番目のターゲットグループの唯一の要件は、サービスが使用するものとは別のロードバランサーに関連付けることはできないということです。
+ Amazon ECS サービスに対して CodeDeploy デプロイを作成すると、CodeDeploy は*置換タスクセット* (または *Green タスクセット*) をデプロイで作成します。テストリスナーをロードバランサーに追加した場合、CodeDeploy はテストトラフィックを置換タスクセットにルーティングします。この時点で検証テストを実行できます。次に、CodeDeploy は本番稼働用トラフィックを元のタスクセットから置換タスクセットに再ルーティングします。このときデプロイグループへのトラフィックの再ルーティング設定に従います。

## 必要な IAM 許可
<a name="deployment-type-bluegreen-IAM"></a>

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

サービスの作成や更新に使用するデフォルトの IAM アクセス権限に加えて、Amazon ECS には次のアクセス権限が必要です。`AmazonECS_FullAccess` IAM ポリシーには、次の許可が追加されています。詳細については、「[AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess)」を参照してください。
+ `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`

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

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