Amazon ECS のブルー/グリーンデプロイに関連する問題のトラブルシューティング方法を教えてください。

最終更新日: 2022 年 4 月 13 日

Amazon Elastic Container Service (Amazon ECS) でホストされているサービスのブルー/グリーンデプロイに関連する問題をトラブルシューティングしようと考えています。

簡単な説明

Amazon ECS でホストされているサービスのブルー/グリーンデプロイに関連する最も一般的な問題は次のとおりです。

AWS Identity and Access Management (IAM) 関連の問題:

  • CodeDeploy のサービスロールを作成してください」というエラーが発生するため、ECS サービスを作成できません。
  • 次のエラーが発生します: サービス が以下のためタスクを起動できませんでした (エラー: ECS はこのタスクに指定されたロール を引き受けることができませんでした。渡されたロールに適切な信頼関係とアクセス許可があり、IAM ユーザーがこのロールを渡すアクセス許可を持っていることを確認してください)

ロードバランサー/ECS 関連の問題:

  • ヘルスチェックが失敗したため、ECS サービスが安定していません。
  • 次のエラーが発生します: 「プライマリタスクセットターゲットグループはリスナーの後ろになければなりません」というエラーのため、ELB を更新できませんでした
  • デプロイが成功しても、トラフィックは引き続きブルーターゲットグループにルーティングされます。
  • ECS サービスで実行されている ECS タスクが、新しいグリーンデプロイ時にのみ、Application Load Balancer のヘルスチェックに失敗します。
  • ECS タスクが、Application Load Balancer のヘルスチェックに一貫性なく失敗します。
  • 要件をすべて満たすコンテナインスタンスが存在しないため、ECS サービスはタスクを配置できません。最も近いコンテナインスタンスには、使用可能な CPU ユニットが不足しています。

AWS CloudFormation 関連の問題 (CloudFormation を通じてブルー/グリーンデプロイを実行している場合):

  • ブルー/グリーンデプロイをトリガーする変更セットを作成すると、CloudFormation スタックが内部エラーで失敗します。
  • ブルー/グリーンデプロイをトリガーする変更セットを作成するときに次のエラーが発生します: タイプ AWS::CodeDeployBlueGreenHook の 'CodeDeployBlueGreenHook' は次のメッセージが表示されて失敗しました: TaskDefinition 論理 ID [ ] は初期テンプレートと最終テンプレートで同じです。CodeDeploy は BlueGreen スタイルの更新を適切に実行できません

解決方法

「CodeDeploy のサービスロールを作成してください」というエラーが発生するため、ECS サービスを作成できません:

このエラーは、AWS CodeDeploy にはブルー/グリーンデプロイ戦略を実行するために必要な IAM アクセス許可がないため発生します。お客様に代わって Amazon ECS サービスを更新するには、CodeDeploy サービスにアクセス許可を付与する必要があります。

このエラーをトラブルシューティングするには、CodeDeploy IAM ロールが正しく作成され、必要なアクセス許可があることを確認します。

CodeDeploy の IAM ロールを作成するには、次の手順を実行します。

  1. IAM コンソールを開きます。
  2. ナビゲーションペインで、[Roles] (ロール) を選択します。
  3. [Create role] (ロールの作成) を選択します
  4. [Select type of trusted entity] (信頼されたエンティティの種類の選択) セクションで、[AWS service] (AWS のサービス)、[CodeDeploy] の順に選択します。
  5. [Select your use case] (ユースケースの選択) セクションで、[CodeDeploy - ECS][Next:Permissions] (次へ: アクセス許可) を選択します。
    注意: デフォルトの AWSCodeDeployforECS ポリシーは維持します。このポリシーには、CodeDeploy が Amazon ECS やその他のサービスと正しく対話するために必要なアクセス許可が含まれています。
  6. [Next: Tags] (次のステップ: タグ) を選択します。
  7. (オプション) タグ名を入力し、[Next: Review] (次のステップ: レビュー) を選択します。
  8. [Role name] (ロール名) に「ecsCodeDeployRole」と入力します。
  9. [Create role] (ロールの作成) を選択します。

次のエラーが発生します: サービスがで以下によりタスクを起動できませんでした (エラー: ECS はこのタスクに指定されたロールを引き受けることができませんでした: 渡された IAM ロールに適切な信頼関係とアクセス許可があり、IAM ユーザーがこのロールを渡すアクセス許可を持っていることを確認してください)。

エラーメッセージによって返された IAM ロールをチェックして、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスが ECS タスクサービス ecs-tasks.amazonaws.com に対して信頼関係を持っていることを確認してください。ロールの信頼関係は次のようになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "ec2.amazonaws.com",
          "ecs-tasks.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • ヘルスチェックが失敗したため、ECS サービスが安定していません: タスク定義のポートマッピングがターゲットグループのポートと一致していることを確認します。詳細については、「Amazon ECS で Application Load Balancer のヘルスチェックに合格するために、Amazon EC2 起動タイプを使用して Amazon ECS タスクを実行するにはどうすればよいですか?」を参照してください。
  • 次のエラーが発生します: エラーメッセージ: 「プライマリタスクセットターゲットグループはリスナーの後ろになければなりません」というエラーのため、ELB を更新できませんでした: このエラーは、Elastic Load Balancing リスナーまたはターゲットグループが正しく設定されていない場合に発生します。ELB プライマリリスナーとテストリスナーの両方が、現在ワークロードを処理しているプライマリターゲットグループを指していることを確認します。
  • デプロイが成功しても、トラフィックは引き続きブルーターゲットグループにルーティングされます: デプロイが完了すると、CodeDeploy はロードバランサーのプライマリリスナーをグリーンターゲットグループを指すように自動的に更新します。ただし、CodeDeploy は指定した本番環境リスナーのみを更新します。デプロイ後に CodeDeploy がトラフィックの切り替えに失敗した場合、ELB リスナーが間違ったトラフィックタイプで設定されている可能性があります。プライマリ ELB リスナーに正しいプロトコルとポートを指定していることを確認します。
  • ECS サービスで実行されている ECS タスクが、新しい Green デプロイ時にのみ、Application Load Balancer のヘルスチェックに失敗します: 他の ECS サービスが同じグリーンターゲットグループにタスクを登録しようとして不一致を引き起こしていないかどうかを確認します。ロードバランサーの設定を更新して、1 つのターゲットグループに ECS サービスまたはポートが 1 つだけ登録されるようにします。
  • ECS タスクが Application Load Balancer のヘルスチェックに一貫性なく失敗します: この問題は、コンテナの開始に予想時間を超える時間がかかっている場合に発生する可能性があります。コンテナアプリケーションコードを確認して、遅延の原因を突き止めます。この問題を解決するには、アプリケーションコードを最適化します。それでも問題を解決できない場合は、コンテナが起動するのに十分な時間を確保できるように、ECS サービスにヘルスチェックの猶予期間を含めます。
  • その要件をすべて満たすコンテナインスタンスが存在しないため、ECS サービスはタスクを配置できません。最も近いコンテナインスタンスには、使用可能な CPU ユニットが不足しています: ブルー/グリーンデプロイを実行する前に、コンテナインスタンスリソースが十分にあることを確認します。

注:これらのトラブルシューティング手順は、ブルー/グリーンデプロイに CloudFormation を使用している場合にのみ適用されます。

  • ブルー/グリーンデプロイをトリガーする変更セットを作成すると、CloudFormation スタックが内部エラーで失敗します: この問題を軽減するには、CloudFormation サービスロールを使用し、このロールを CloudFormation スタックにアタッチします。サービスロールに、すべてのスタックオペレーションを実行するために必要なアクセス許可があることを確認します。スタックの作成後は、サービスロールをスタックから削除できないことに注意してください。
  • ブルー/グリーンデプロイをトリガーする変更セットを作成するときに次のエラーが発生します: タイプ AWS::CodeDeployBlueGreenHook の 'CodeDeployBlueGreenHook' は次のメッセージが表示されて失敗しました: TaskDefinition 論理 ID [ ] は初期テンプレートと最終テンプレートで同じです。CodeDeploy は BlueGreen スタイルの更新を適切に実行できません: 既にグリーンターゲットグループを指しているテストリスナーを指定すると、CodeDeploy フックはこのエラーで失敗します。ブルー/グリーンデプロイを実行する前に、テストリスナーがまだグリーンターゲットグループを指していないことを確認します。

重要: ブルー/グリーンデプロイをキャンセルしてロールバックするために UpdateService API を使用しないでください。代わりに、CreateDeployment API を使用してください。デプロイをロールバックするには、デプロイ StopDeployment API を使用します。