Amazon ECS ブルー/グリーンデプロイの作成 - Amazon Elastic Container Service

Amazon ECS ブルー/グリーンデプロイの作成

Amazon ECS ブルー/グリーンデプロイを使用すると、本番環境に実装する前にサービスを変更してテストできます。

前提条件

ブルー/グリーンデプロイを開始する前に、次の操作を実行します。

  1. 適切なアクセス許可を設定します。

  2. Amazon ECS ブルー/グリーンデプロイでは、サービスで次のいずれかの機能を使用する必要があります。適切なリソースを設定してください。

  3. グリーンサービスリビジョンにトラフィックをルーティングするルールを作成します。詳細については、「Network Load Balancer のユーザーガイド」の「リスナールール」を参照してください。

  4. グリーンサービスリビジョンのターゲットグループを作成します。タスクに awsvpc ネットワークモードを使用する場合、ターゲットタイプは ip である必要があります。ターゲットグループの詳細については、「Network Load Balancer のユーザーガイド」の「ターゲットグループ」を参照してください。

  5. ライフサイクルイベントに Lambda 関数を実行するかどうかを決定します。

    • スケールアップ前

    • スケールアップ後

    • テストトラフィックの移行

    • テストトラフィックの移行後

    • 本番トラフィックの移行

    • 本番トラフィックの移行後

    ライフサイクルイベントごとに Lambda 関数を作成します。詳細については、「AWS Lambda デベロッパーガイド」の「コンソールで Lambda 関数の作成」を参照してください。

手順

コンソールまたは AWS CLI を使用して、Amazon ECS ブルー/グリーンサービスを作成できます。

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

  2. サービスを起動するリソースを決定します。

    サービスの起動元 ステップ

    クラスター

    1. [Clusters] ページで、サービスを作成するクラスターを選択します。

      クラスター詳細のページが表示されます。

    2. [Services (サービス)] タブで、[Create (作成]) を選択します。

    タスク定義
    1. [タスク定義] ページで、タスク定義を選択します。

    2. [デプロイ] メニューで、[サービスの作成] を選択します。

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

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

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

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

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

  5. クラスターのインフラストラクチャ全体にタスクを分散する方法を選択します。[コンピュート設定] で、オプションを選択します。

    コンピューティングオプション ステップ

    キャパシティプロバイダー戦略

    1. [コンピューティングオプション] で、[キャパシティプロバイダー戦略] を選択します。

    2. 戦略を選択:

      • デフォルトのキャパシティープロバイダー戦略を使用するには、[Use cluster default] (デフォルトのクラスターを使用) を選択します。

      • クラスターにデフォルトのキャパシティプロバイダー戦略がない場合、またはカスタム戦略を使用する場合は、[カスタムを使用][キャパシティプロバイダー戦略を追加] を選択し、[ベース][キャパシティプロバイダー][重み] を指定して、カスタムキャパシティプロバイダー戦略を定義します。

    注記

    戦略でキャパシティープロバイダーを使用するには、キャパシティープロバイダーをクラスターに関連付ける必要があります。

    起動タイプ
    1. [Compute options] (コンピューティングオプション) セクションで、[Launch type] (起動タイプ) を選択します。

    2. [Launch type] (起動タイプ) で、起動タイプを選択します。

    3. (オプション) Fargate 起動タイプが指定されている場合、Platform version(プラットフォームのバージョン)で、使用するプラットフォームのバージョンを指定します。プラットフォームバージョンが指定されない場合、LATEST プラットフォームバージョンが使用されます。

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

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

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

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

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

    1. ベイク時間には、ブルーリビジョンが終了する前に、ブルーおよびグリーンのサービスリビジョンの両方が同時に実行される分数を入力します。これにより、検証およびテストの時間を確保できます。

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

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

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

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

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

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

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

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

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

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

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

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

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

    2. [Service Connect configuration] (Service Connect 設定) で、クライアントモードを指定します。

      • サービスが名前空間内の他のサービスへの接続のみを必要とするネットワーククライアントアプリケーションを実行している場合は、[クライアント側のみ] を選択します。

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

    3. デフォルトのクラスター名前空間ではない名前空間を使用するには、[Namespace] (名前空間) でサービス名前空間を選択します。

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

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

      2. [ヘッダー一致ルール] では、テストトラフィックをルーティングする条件を設定します。

        • [ヘッダー名]: 一致する HTTP ヘッダーの名前を入力します (例えば、X-Test-Version または User-Agent)。

        • [一致タイプ]: 一致する条件を選択します。

          • [完全一致]: ヘッダー値が指定された値と完全に一致するリクエストをルーティングする

          • [ヘッダーが存在する]: 値に関係なく、指定されたヘッダーを含むリクエストをルーティングする

          • [パターン一致]: ヘッダー値が指定されたパターンと一致するリクエストをルーティングする

        • [ヘッダー値] (完全一致またはパターン一致を使用する場合): 照合する値またはパターンを入力します。

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

      3. [ヘッダールールの追加] を選択し、追加のヘッダー一致条件を設定します。

      注記

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

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

      以下では、各コンテナログの送信先について詳しく説明します。

      • 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 バケット名を指定する必要があります。

  9. (オプション) ブルー/グリーンデプロイ用に [ロードバランシング] を設定します。

    Elastic Load Balancing のタイプ ステップ

    Application Load Balancer

    1. [ロードバランサーのタイプ] では [Application Load Balancer] を選択します。

    2. 選択新しいロードバランサーを作成するをクリックして新しいApplication Load Balancer を作成するか、既存のロードバランサーを使用する既存のApplication Load Balancer を選択します。

    3. [コンテナ] では、サービスをホストするコンテナを選択します。

    4. [Load balancer name] (ロードバランサー名) では、一意な名前を入力します。

    5. [Listener] (リスナー) で、Application Load Balancer が接続リクエストをリッスンするポートとプロトコルを入力します。デフォルトでは、ロードバランサーはポート 80 と HTTP を使用するように設定されます。

      • [本番ルール] には、ルールの [評価順序] および [パスパターン] を入力します。

        このルールは、本番 (ブルー) サービスリビジョンのトラフィック用です。

      • [テストルール] には、ルールの [評価順序] および [パスパターン] を入力します。

        このルールは、テスト (グリーン) サービスリビジョンのトラフィック用です。

    6. [ターゲットグループ] では、以下を設定します。

      • [Target group name] (ターゲットグループ名) では、Application Load Balancer がリクエストをルーティングするターゲットグループの名前とプロトコルを入力します。

      • [プロトコル] では、Application Load Balancer がリクエストをルーティングするターゲットグループのプロトコルを選択します。デフォルトでは、ターゲットグループは、タスク定義で定義されている最初のコンテナにリクエストをルーティングします。

      • [登録の遅延] には、ロードバランサーがターゲットの状態を UNUSED に変更するまでの秒数を入力します。デフォルトは 300 秒です。

      • [Health check path] (ヘルスチェックパス) では、Application Load Balancer とコンテナ間の接続の正常性を検証するために、Application Load Balancer が定期的にリクエストを送信するコンテナ内に存在するパスを入力します。デフォルトはルートディレクトリ (/)。

      • [代替グループ名] には、テスト (緑) サービスリビジョンのターゲットグループのグループ名を入力します。

    Network Load Balancer
    1. [Load balancer type] (ロードバランサータイプ) では、[Network Load Balancer] を選択します。

    2. [Load Balancer] (ロードバランサー) では、既存の Network Load Balancer を選択します。

    3. [Choose container to load balance] (負荷分散するコンテナを選択) で、サービスをホストするコンテナを選択します。

    4. [本番リスナー] では、[本番リスナーポート] および [本番リスナープロトコル] を選択します。

      これは、本番 (ブルー) サービスリビジョントのラフィックのリスナーです。

    5. [テストリスナー] では、[テストリスナーポート] および [テストリスナープロトコル] を選択します。

      これは、テスト (グリーン) サービスリビジョンのトラフィックのリスナーです。

    6. [ターゲットグループ] では、以下を設定します。

      • [Target group name] (ターゲットグループ名) では、Network Load Balancer がリクエストをルーティングするターゲットグループの名前とプロトコルを入力します。

      • [プロトコル] では、Network Load Balancer がリクエストをルーティングするターゲットグループのプロトコルを選択します。デフォルトでは、ターゲットグループは、タスク定義で定義されている最初のコンテナにリクエストをルーティングします。

      • [登録の遅延] には、ロードバランサーがターゲットの状態を UNUSED に変更するまでの秒数を入力します。デフォルトは 300 秒です。

      • [Health check path] (ヘルスチェックパス) では、Application Load Balancer とコンテナ間の接続の正常性を検証するために、Application Load Balancer が定期的にリクエストを送信するコンテナ内に存在するパスを入力します。デフォルトはルートディレクトリ (/)。

      • [代替グループ名] には、テスト (緑) サービスリビジョンのターゲットグループのグループ名を入力します。

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

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

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

    タグを追加または削除します。

    • [タグを追加] [Add tag] (タグを追加) を選択し、以下を実行します。

      • [キー] にはキー名を入力します。

      • [] にキー値を入力します。

    • [タグの削除] タグの横にある [タグの削除] を選択します。

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

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

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

    { "serviceName": "myBlueGreenService", "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": "BLUE_GREEN", "maximumPercent": 200, "minimumHealthyPercent": 100, "bakeTimeInMinutes": 2, "alarms": { "alarmNames": [ "myAlarm" ], "rollback": true, "enable": true }, "lifecycleHooks": [ { "hookTargetArn": "arn:aws:lambda:us-west-2:7123456789012:function:checkExample", "roleArn": "arn:aws:iam::123456789012:role/ECSLifecycleHookInvoke", "lifecycleStages": [ "PRE_SCALE_UP" ] } ] }, "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-blue-green-demo/32e0e4f946c3c05b/9cfa8c482e204f7d/831dbaf72edb911", "roleArn": "arn:aws:iam::123456789012:role/LoadBalancerManagementforECS" } } ] }
  2. create-service を実行します。

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

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

    または、次の例を使用して、ロードバランサー設定を持つ ブルー/グリーンデプロイサービスを作成することもできます。

    aws ecs create-service \ --cluster "arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster" \ --service-name "blue-green-example-service" \ --task-definition "nginxServer:1" \ --launch-type "FARGATE" \ --network-configuration "awsvpcConfiguration={subnets=[subnet-12345,subnet-67890,subnet-abcdef,subnet-fedcba],securityGroups=[sg-12345],assignPublicIp=ENABLED}" \ --desired-count 3 \ --deployment-controller "type=ECS" \ --deployment-configuration "strategy=BLUE_GREEN,maximumPercent=200,minimumHealthyPercent=100,bakeTimeInMinutes=0" \ --load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/MyBGtg1/abcdef1234567890,containerName=nginx,containerPort=80,advancedConfiguration={alternateTargetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/MyBGtg2/0987654321fedcba,productionListenerRule=arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/MyLB/1234567890abcdef/1234567890abcdef,roleArn=arn:aws:iam::123456789012:role/ELBManagementRole}"

次のステップ

  • サービスを更新してデプロイを開始します。詳細については、「Amazon ECS サービスを更新する」を参照してください。

  • デプロイプロセスをモニタリングし、ブルー/グリーンのパターンに従っていることを確認します。

    • グリーンサービスリビジョンが作成され、スケールアップされる

    • テストトラフィックがグリーンリビジョンにルーティングされている (設定されている場合)

    • 本番トラフィックがグリーンリビジョンに移行されている

    • ベイク時間が過ぎたら、ブルーリビジョンが終了する