

# Amazon ECS カナリアデプロイの作成
<a name="deploy-canary-service"></a>

Amazon ECS カナリアデプロイを使用すると、トラフィックのごく一部を新しいサービスリビジョン (「Canary」) に移行できます。デプロイを検証し、指定した間隔で残りのトラフィックをすべて一度に移行します。このアプローチでは、フルデプロイの前に最小限のリスクで新機能をテストできます。

## 前提条件
<a name="deploy-canary-service-prerequisites"></a>

カナリアデプロイを開始する前に、次の操作を実行します。

1. 適切なアクセス許可を設定します。
   + Elastic Load Balancing のアクセス許可の詳細については、「[ロードバランサー用の Amazon ECS インフラストラクチャの IAM ロール](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)」を参照してください。
   + Lambda のアクセス許可の詳細については、「[Amazon ECS ブルー/グリーンデプロイの Lambda 関数に必要となるアクセス許可](blue-green-permissions.md)」を参照してください。

1. Amazon ECS カナリアデプロイでは、サービスが次のいずれかの機能を使用する必要があります。適切なリソースを設定してください。
   + Application Load Balancer – 詳細については、「[ブルー/グリーンデプロイ、リニアデプロイおよびカナリアデプロイ用の Application Load Balancer リソース](alb-resources-for-blue-green.md)」を参照してください。
   + Network Load Balancer – 詳細については、「[Amazon ECS ブルー/グリーン、リニアおよびカナリアデプロイの Network Load Balancer リソース](nlb-resources-for-blue-green.md)」を参照してください。
   + Service Connect – 詳細については、「[Amazon ECS ブルー/グリーンデプロイ、リニアデプロイおよびカナリアデプロイ用の Service Connect リソース](service-connect-blue-green.md)」を参照してください。

## 手順
<a name="deploy-canary-service-procedure"></a>

コンソールまたは AWS CLI を使用して、Amazon ECS カナリアデプロイサービスを作成できます。

------
#### [ Console ]

1. コンソール ([https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)) を開きます。

1. サービスを起動するリソースを決定します。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deploy-canary-service.html)

   **[サービスの作成]** ページが表示されます。

1. **[サービスの詳細]** で、次の操作を行います。

   1. **[タスク定義ファミリー]** では、使用するタスク定義を選択します。次に **[タスク定義リビジョン]** には、使用するリビジョンを入力します。

   1. **[Service name]** (サービス名) でサービスの名前を入力します。

1. 既存のクラスターでサービスを実行するには、**[既存のクラスター]** にクラスターを選択します。新しいクラスターでサービスを実行するには、**[クラスターの作成]** を選択します。

1. クラスターのインフラストラクチャ全体にタスクを分散する方法を選択します。**[コンピュート設定]** で、オプションを選択します。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deploy-canary-service.html)

1. **[デプロイメント設定]** で、次の操作を行います。

   1. **[サービスタイプ]** では、**[レプリカ]** を選択します。

   1. **[Desired tasks]** (必要なタスク) で、サービス内で起動および維持するタスクの数を入力します。

   1. Amazon ECS がアベイラビリティーゾーン間のタスクの分散をモニタリングし、不均衡が発生したときにタスクを再分散するには、**[アベイラビリティーゾーンのサービス再調整]** で **[アベイラビリティーゾーンのサービス再調整]** を選択します。

   1. **[ヘルスチェックの猶予期間]** には、タスクの初回起動後にサービススケジューラが異常な Elastic Load Balancing、VPC Lattice、コンテナヘルスチェックを無視する時間 (秒単位) を入力します。ヘルスチェックの猶予期間値を指定しない場合、デフォルト値 0 が使用されます。

1. **[デプロイ設定]** で、カナリアデプロイ設定を構成します。

   1. **[デプロイ戦略]** で、**[Canary]** を選択します。

   1. **[Canary の割合]** には、最初のステージでグリーンサービスリビジョンに移行するトラフィックの割合を入力します (例えば、最初の Canary トラフィックの場合は 10%)。

   1. **[Canary ベイク時間]** には、残りのトラフィックをグリーンサービスリビジョンに移行するまでに待機する時間を分単位で入力します。

   1. **[ベイク時間]** には、ブルーリビジョンが終了する前に、トラフィックの最終移行後にブルーおよびグリーンのサービスリビジョンの両方が同時に実行される時間 (分) を入力します。

   1. (オプション) Lambda 関数を実行し、デプロイの特定段階で実行します。**[デプロイライフサイクルフック]** で、ライフサイクルフックを実行するステージを選択します。

      ライフサイクルフックを追加する方法

      1. **[Add]** (追加) を選択します。

      1. **[Lambda 関数]** には、ARN の関数名を入力します。

      1. **[ロール]** では、Lambda 関数を呼び出すアクセス許可を持つ IAM ロールを選択します。

      1. **[ライフサイクルステージ]** では、Lambda 関数を実行するステージを選択します。

1. Amazon ECS がデプロイの障害を検出して処理する方法を設定するには、**[Deployment failure detection]** (デプロイ障害検出) を展開し、オプションを選択します。

   1. タスクを開始できない場合にデプロイを停止するには、**[Use the Amazon ECS deployment circuit breaker]** (Amazon ECS デプロイサーキットブレーカーを使用する) を選択します。

      デプロイサーキットブレーカーによってデプロイが失敗状態に設定されたときに、ソフトウェアがデプロイを最後に完了したデプロイ状態に自動的にロールバックするようにするには、**[失敗時のロールバック]** を選択します。

   1. アプリケーションメトリクスに基づいてデプロイを停止するには、**[CloudWatch アラームを使用する]** を選択します。次に、**[CloudWatch アラーム名]** からアラームを選択します。新しいアラームを作成するには、CloudWatch コンソールに移動します。

      CloudWatch アラームによってデプロイが失敗状態に設定されたときに、ソフトウェアがデプロイを最後に完了したデプロイ状態に自動的にロールバックするようにするには、**[失敗時のロールバック]** を選択します。

1. (オプション) Service Connect を使用してサービスを相互接続するには、**[Service Connect]** を展開して以下を指定します。

   1.  **[Service Connect をオンにする]** を選択します。

   1. **[Service Connect configuration]** (Service Connect 設定) で、クライアントモードを指定します。
      + サービスが名前空間内の他のサービスへの接続のみを必要とするネットワーククライアントアプリケーションを実行している場合は、**[クライアント側のみ]** を選択します。
      + サービスがネットワークまたは Web サービスアプリケーションを実行していて、このサービスにエンドポイントを提供し、名前空間内の他のサービスに接続する必要がある場合は、**[Client and server]** (クライアントとサーバー) を選択します。

   1. デフォルトのクラスター名前空間ではない名前空間を使用するには、**[Namespace]** (名前空間) でサービス名前空間を選択します。この場合、AWS アカウントの同じ AWS リージョンで個別に作成された名前空間、またはAWS Resource Access Manager (AWS RAM) を使用してアカウントと共有されている同じリージョンの名前空間のいずれかを選択できます。共有 AWS Cloud Map 名前空間の詳細については、「*AWS Cloud Map デベロッパーガイド*」の「[クロスアカウント AWS Cloud Map 名前空間の共有](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)」を参照してください。

   1. (オプション) カナリアデプロイのテストトラフィックヘッダーのルールを設定します。**[テストトラフィックのルーティング]** では、以下を指定します。

      1. **[テストトラフィックヘッダーのルールの有効化]** を選択し、テスト中に特定のリクエストをグリーンサービスリビジョンにルーティングします。

      1. **[ヘッダー一致ルール]** では、テストトラフィックをルーティングする条件を設定します。
         + **[ヘッダー名]**: 一致する HTTP ヘッダーの名前を入力します (例えば、`X-Test-Version` または `User-Agent`)。
         + **[一致タイプ]**: 一致する条件を選択します。
           + **[完全一致]**: ヘッダー値が指定された値と完全に一致するリクエストをルーティングする
           + **[ヘッダーが存在する]**: 値に関係なく、指定されたヘッダーを含むリクエストをルーティングする
           + **[パターン一致]**: ヘッダー値が指定されたパターンと一致するリクエストをルーティングする
         + **[ヘッダー値]** (完全一致またはパターン一致を使用する場合): 照合する値またはパターンを入力します。

         複数のヘッダー一致ルールを追加し、複雑なルーティングロジックを作成できます。設定されたルールに一致するリクエストは、テストのためにグリーンサービスリビジョンにルーティングされます。

      1. **[ヘッダールールの追加]** を選択し、追加のヘッダー一致条件を設定します。
**注記**  
テストトラフィックヘッダーのルールにより、完全なデプロイを完了する前に、制御されたトラフィックで新機能を検証できます。これにより、ブルーサービスリビジョンへの通常のトラフィックフローを維持しながら、特定のリクエスト (内部テストツールやベータユーザーなどによるもの) でグリーンサービスリビジョンをテストできます。

   1. （オプション) ログ設定を指定します。**[ログコレクションを使用]** を選択します。デフォルトのオプションでは、コンテナログを CloudWatch Logs に送信します。その他のログドライバオプションは、AWS FireLens を使用して構成されます。詳細については、「[Amazon ECS ログを AWS サービスまたは AWS Partner に送信する](using_firelens.md)」を参照してください。

      以下では、各コンテナログの送信先について詳しく説明します。
      + **Amazon CloudWatch** — コンテナログを CloudWatch Logs に送信するようにタスクを設定します。デフォルトのログドライバーオプションが提供され、ユーザーに代わり CloudWatch ロググループを作成します。別のロググループ名を指定するには、ドライバーオプションの値を変更します。
      + **[Amazon Data Firehose]** — Firehose にコンテナログを送信するようタスクを設定します。Firehose 配信ストリームにログを送信するデフォルトのログドライバーオプションが提供されています。別の配信ストリーム名を指定するには、ドライバーオプションの値を変更します。
      + **Amazon Kinesis Data Streams** — Kinesis Data Streams にコンテナログを送信するようタスクを設定します。Kinesis Data Streams のストリームにログを送信するデフォルトのログドライバーオプションが提供されています。別のストリーム名を指定するには、ドライバーオプションの値を変更します。
      + **Amazon OpenSearch Service** — コンテナログを OpenSearch Service ドメインに送信するようタスクを設定します。ログドライバーオプションを提供する必要があります。
      + **Amazon S3** — Amazon S3 バケットにコンテナログを送信するようタスクを設定します。デフォルトのログドライバーオプションが提供されていますが、有効な Amazon S3 バケット名を指定する必要があります。

1. (オプション) カナリアデプロイ用に **[ロードバランシング]** を設定します。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deploy-canary-service.html)

1. （オプション）サービスとタスクを識別しやすくするには、**[Tags]** (タグ) セクションを展開し、タグを設定します。

   新しく起動したすべてのタスクに対して、Amazon ECS がクラスター名とタスク定義タグで自動的にタグ付けするようにするには、**[Amazon ECS マネージドタグを有効にする]** を選択し、**[タグの伝播元]** で **[タスク定義]** を選択します。

   新しく起動したすべてのタスクに対して、Amazon ECS がクラスター名とサービスタグで自動的にタグ付けするようにするには、**[Amazon ECS マネージドタグを有効にする]** を選択し、**[タグの伝播元]** で **[サービス]** を選択します。

   タグを追加または削除します。
   + [タグを追加] **[Add tag]** (タグを追加) を選択し、以下を実行します。
     + [**キー**] にはキー名を入力します。
     + [**値**] にキー値を入力します。
   + [タグの削除] タグの横にある [**タグの削除**] を選択します。

1. **[作成]** を選択します。

------
#### [ AWS CLI ]

1. `canary-service-definition.json` という名前のファイルを作成し、次の内容を記述します。

   {{user-input}} を独自の値に置き換えます。

   ```
   {
     "serviceName": "myCanaryService",
     "cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/sample-fargate-cluster",
     "taskDefinition": "sample-fargate:1",
     "desiredCount": 5,
     "launchType": "FARGATE",
     "networkConfiguration": {
       "awsvpcConfiguration": {
         "subnets": [
           "subnet-09ce6e74c116a2299",
           "subnet-00bb3bd7a73526788",
           "subnet-0048a611aaec65477"
         ],
         "securityGroups": [
           "sg-09d45005497daa123"
         ],
         "assignPublicIp": "ENABLED"
       }
     },
     "deploymentController": {
       "type": "ECS"
     },
     "deploymentConfiguration": {
       "strategy": "CANARY",
       "maximumPercent": 200,
       "minimumHealthyPercent": 100,
       "canaryConfiguration" : {
           "canaryPercent" : 5.0,
           "canaryBakeTime" : 10
       },
       "bakeTimeInMinutes": 10,
       "alarms": {
         "alarmNames": [
           "myAlarm"
         ],
         "rollback": true,
         "enable": true
       }
     },
     "loadBalancers": [
       {
         "targetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-target-group/54402ff563af1197",
         "containerName": "fargate-app",
         "containerPort": 80,
         "advancedConfiguration": {
           "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-target-group/cad10a56f5843199",
           "productionListenerRule": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-canary-demo/32e0e4f946c3c05b/9cfa8c482e204f7d/831dbaf72edb911",
           "roleArn": "arn:aws:iam::123456789012:role/LoadBalancerManagementforECS"
         }
       }
     ]
   }
   ```

1. `create-service` を実行します。

   ```
   aws ecs create-service --cli-input-json file://canary-service-definition.json
   ```

------

## 次のステップ
<a name="deploy-canary-service-next-steps"></a>

カナリアデプロイを設定したら、以下の手順を実行します。
+ サービスを更新してデプロイを開始します。詳細については、「[Amazon ECS サービスを更新する](update-service-console-v2.md)」を参照してください。
+ デプロイプロセスをモニタリングし、Canary のパターンに従っていることを確認します。
  + グリーンサービスリビジョンが作成され、スケールアップされる
  + トラフィック (Canary) のごく一部がグリーンリビジョンに移行されます
  + システムは Canary に対して指定された間隔の時間待機します
  + 残りのトラフィックはすべて一度にグリーンリビジョンに移行されます
  + ベイク時間が過ぎたら、ブルーリビジョンが終了する