AWS CodeDeploy
ユーザーガイド (API バージョン 2014-10-06)

Amazon EC2 Auto Scaling の問題のトラブルシューティング

一般的な Amazon EC2 Auto Scaling トラブルシューティング

Amazon EC2 Auto Scaling グループの Amazon EC2 インスタンスへのデプロイは、次の理由で失敗する場合があります。

  • Amazon EC2 Auto Scaling は継続的に Amazon EC2 インスタンスを起動し、削除します。 CodeDeploy がアプリケーションリビジョンを自動的にデプロイできない場合、Amazon EC2 Auto Scaling は継続的に Amazon EC2 インスタンスを起動および削除します。

    CodeDeploy デプロイグループから Amazon EC2 Auto Scaling グループの関連付けを解除するか、Amazon EC2 Auto Scaling グループの設定を変更し、必要なインスタンス数が現在のインスタンス数に一致するようにします (これにより、Amazon EC2 Auto Scaling がそれ以上の Amazon EC2 インスタンスを起動できないようにします)。詳細については、「CodeDeploy を使用して、デプロイグループの設定を変更します。」または「Amazon EC2 Auto Scaling の手動スケーリング」を参照してください。

  • CodeDeploy エージェントが応答しない。 Amazon EC2 インスタンスの起動または開始直後に実行された初期化スクリプト (cloud-init スクリプトなど) の実行に 1 時間以上かかっている場合、CodeDeploy エージェントはインストールされないことがあります。CodeDeploy には、保留中のデプロイに CodeDeploy エージェントが応答するまでに 1 時間のタイムアウトがあります。この問題に対応するには、CodeDeploy アプリケーションリビジョンに初期化スクリプトを移動します。

  • Amazon EC2 Auto Scaling グループの Amazon EC2 インスタンスがデプロイ中に再起動する。 デプロイ中に Amazon EC2 インスタンスが再起動したか、デプロイコマンドの処理中に CodeDeploy エージェントがシャットダウンした場合、デプロイは失敗することがあります。詳細については、「Amazon EC2 Auto Scaling インスタンスを削除または再起動すると、デプロイが失敗する場合がある」を参照してください。

  • 複数のアプリケーションリビジョンが Amazon EC2 Auto Scaling グループの同じ Amazon EC2 インスタンスに同時にデプロイされた。 Amazon EC2 Auto Scaling グループの同じ Amazon EC2 インスタンスに複数のアプリケーションリビジョンをデプロイする場合、デプロイの 1 つに数分以上実行されるスクリプトがあると、失敗することがあります。Amazon EC2 Auto Scaling グループの同じ Amazon EC2 インスタンスに複数のアプリケーションリビジョンをデプロイしないでください。

  • Amazon EC2 Auto Scaling グループの一部として起動された新しい Amazon EC2 インスタンスに対して、デプロイが失敗する。 このシナリオでは、デプロイでスクリプトを実行すると、Amazon EC2 Auto Scaling グループで Amazon EC2 インスタンスを起動できなくなる場合があります(Amazon EC2 Auto Scaling グループの他の Amazon EC2 インスタンスは正常に実行中に見える場合があります)。 この問題に対応するには、最初にその他のすべてのスクリプトが完了していることを確認します。

    • CodeDeploy エージェントを AMI に含めない場合: 新しいインスタンスの起動中に cfn-init コマンドを使用して CodeDeploy エージェントをインストールする場合、エージェントのインストールスクリプトを AWS CloudFormation テンプレートの cfn-init セクションの最後に配置します。

    • CodeDeploy エージェントを AMI に含める場合: インスタンスの作成時にエージェントが Stopped 状態になるように設定し、次に cfn-init スクリプトライブラリの最終ステップとして、エージェントを起動するスクリプトを含めます

    .

「CodeDeployRole では、次の AWS サービスでオペレーションを実行するアクセス権限は付与されません: AmazonAutoScaling」エラー

起動テンプレートを使用して作成された Auto Scaling グループを使用するデプロイでは、次のアクセス権限が必要です。これらは AWSCodeDeployRole AWS 管理ポリシーによって付与されるアクセス権限に加えて必要になります。

  • ec2:RunInstance

  • ec2:CreateTags

  • iam:PassRole

これらのアクセス権限がないために、このエラーが発生した可能性があります。詳細については、「起動テンプレートによって作成された Auto Scaling グループを使用してデプロイの作成をユーザーに許可する」、「チュートリアル: CodeDeploy を使用して Amazon EC2 Auto Scaling グループにアプリケーションをデプロイする」、および「Auto Scaling グループの起動テンプレートの作成」を参照してください。

Amazon EC2 Auto Scaling グループのインスタンスのプロビジョニングと終了が繰り返されてリビジョンをデプロイできない

エラーが原因で、Amazon EC2 Auto Scaling グループ内の新しくプロビジョニングされたインスタンスに正常にデプロイできない場合があります。その結果として、インスタンスは正常な状態にならず、デプロイは失敗します。デプロイが正常に実行または完了されないため、インスタンスは作成後すぐに終了されます。この場合、Amazon EC2 Auto Scaling グループの設定により、正常なホスト数の最小要件を満たすために別のバッチのインスタンスがプロビジョニングされます。このバッチも終了され、同じサイクルが繰り返されます。

エラーの原因として以下が考えられます。

  • Amazon EC2 Auto Scaling グループのヘルスチェックに失敗した。

  • アプリケーションリビジョンのエラー。

この問題を回避するには、次の手順に従います。

  1. Amazon EC2 Auto Scaling グループの一部ではない Amazon EC2 インスタンスを手動で作成します。インスタンスに一意の EC2 インスタンスタグを付けます。

  2. 新しいインスタンスを該当するデプロイグループに追加します。

  3. 新しい、エラーのないアプリケーションリビジョンをデプロイグループにデプロイします。

これにより、Amazon EC2 Auto Scaling グループ内の今後のインスタンスに Amazon EC2 Auto Scaling グループからアプリケーションリビジョンがデプロイされるようになります。

注記

デプロイが成功したことを確認したら、お使いの AWS アカウントに今後請求が発生しないようにインスタンスを削除します。

Amazon EC2 Auto Scaling インスタンスを削除または再起動すると、デプロイが失敗する場合がある

Amazon EC2 インスタンスが Amazon EC2 Auto Scaling を通じて起動され、その後で削除または再起動されると、そのインスタンスへのデプロイは、次の理由で失敗する場合があります。

  • 進行中のデプロイで、スケールインイベントまたはその他の終了イベントにより、インスタンスは Amazon EC2 Auto Scaling グループからデタッチされた後に削除されます。デプロイは完了できないため、失敗します。

  • インスタンスが再起動されたが、その起動に 5 分間以上かかる。CodeDeploy はこれをタイムアウトとして処理します。サービスにより、インスタンスに対する現在およびそれ以降のすべてのデプロイが失敗します。

この問題に対応するには:

  • 一般的に、インスタンスが削除または再起動される前に、すべてのデプロイが完了したことを確認します。インスタンスの起動または再起動後に、すべてのデプロイが開始されることを確認します。

  • Amazon EC2 Auto Scaling 設定で Windows Server の基本 Amazon Machine Image (AMI) を指定し、EC2Config サービスを使用して、インスタンスのコンピュータ名を設定すると、デプロイは失敗します。この問題を修正するには、Windows Server 基本 AMI の [Ec2 Service Properties] の [General (全般)] で、[Set Computer Name (コンピュータ名の設定)] のチェックボックスをオフにします。このチェックボックスをオフにすると、この動作は、その Windows Server の基本 AMI で起動されるすべての新しい Windows Server Amazon EC2 Auto Scaling インスタンスに対して無効になります。この動作が有効になっている Windows Server Amazon EC2 Auto Scaling インスタンスでは、このチェックボックスをオフにする必要はありません。再起動後に、失敗したデプロイをこれらのインスタンスに再デプロイします。

複数のデプロイグループを 1 つの Amazon EC2 Auto Scaling グループに関連付けることは避ける

各 Amazon EC2 Auto Scaling グループには 1 つのデプロイグループのみを関連付けることをお勧めします。

これは、複数のデプロイグループに関連付けられたフックを持つインスタンスを Amazon EC2 Auto Scaling がスケールアップする場合、すべてのフックに対して一度に通知を送信するためです。これにより、各インスタンスの複数のデプロイが同時に開始されます。複数のデプロイが同時に CodeDeploy エージェントへコマンドを送信すると、ライフサイクルイベントとデプロイの開始または前のライフサイクルイベント終了の間に 5 分間のタイムアウトに達する場合があります。その場合は、予想通りにデプロイがプロセスされていてもデプロイが失敗します。

注記

ライフサイクルイベントのスクリプトのデフォルトのタイムアウトは、30 分です。AppSpec file でこのタイムアウトを異なる値に変更できます。詳細については、「EC2/オンプレミス デプロイ用の AppSpec ファイルを追加する」を参照してください。

複数のデプロイが同時に実行を試みた場合、デプロイが発生する順序を制御することはできない。

最後に、インスタンスへのデプロイが失敗した場合、Amazon EC2 Auto Scaling は直ちにインスタンスを削除します。その最初のインスタンスがシャットダウンすると、実行中の他のデプロイも失敗します。CodeDeploy には、CodeDeploy エージェントが保留中のデプロイに応答するための 1 時間のタイムアウトがあるため、各インスタンスのタイムアウトは最大 60 分かかる場合があります。

Amazon EC2 Auto Scaling の詳細については、「CodeDeploy と Auto Scaling の統合の詳細」を参照してください。

Amazon EC2 Auto Scaling グループの Amazon EC2 インスタンスが起動に失敗し、「ハートビートのタイムアウト」というエラーが表示される

Amazon EC2 Auto Scaling グループが新しい Amazon EC2 インスタンスの起動に失敗し、次のようなメッセージを生成する場合があります。

Launching a new Amazon EC2 instance <instance-Id>. Status Reason: Instance failed to complete user's Lifecycle Action: Lifecycle Action with token<token-Id> was abandoned: Heartbeat Timeout.

このメッセージは通常、以下のいずれかを示します。

  • AWS アカウントに関連付けられている同時デプロイの最大数に達した。デプロイの制限の詳細については、「CodeDeploy の制限」を参照してください。

  • 関連付けられたデプロイグループが更新または削除される前に、CodeDeploy のアプリケーションが削除された。

アプリケーションまたはデプロイグループを削除すると、CodeDeploy はそれに関連付けられていた Amazon EC2 Auto Scaling フックのクリーンアップを試みますが、一部のフックが残る場合があります。デプロイグループを削除するコマンドを実行すると、残りのフックが出力で返ります。ただし、アプリケーションを削除するコマンドを実行した場合、残りのフックは出力に表示されません。

したがって、アプリケーションを削除する前に、アプリケーションと関連付けられたすべてのデプロイグループを削除することをお勧めします。コマンド出力を使用して、手動で削除する必要があるライフサイクルフックを識別できます。

「ハートビートのタイムアウト」エラーメッセージが表示される場合は、次の操作を行い、残っているライフサイクルフックが原因かどうかを特定して問題を解決します。

  1. update-deployment-group コマンドまたは delete-deployment-group コマンドを実行します。呼び出しの出力を確認します。出力に hooksNotCleanedUp 構造と Amazon EC2 Auto Scaling ライフサイクルフックの一覧が含まれている場合、残っているライフサイクルフックが、おそらくエラーの原因です。

  2. describe-lifecycle-hooks コマンドを呼び出し、起動に失敗した Amazon EC2 インスタンスに関連付けられている Amazon EC2 Auto Scaling グループの名前を指定します。出力で、ステップ 1 で確認した hooksNotCleanedUp 構造に対応する Amazon EC2 Auto Scaling ライフサイクルフック名を探します。または、デプロイグループの名前を含む Amazon EC2 Auto Scaling ライフサイクルフック名を探します。

  3. 各 Amazon EC2 Auto Scaling ライフサイクルに対して delete-lifecycle-hook コマンドを呼び出します。Amazon EC2 Auto Scaling グループとライフサイクルフックを指定します。

(Amazon EC2 Auto Scaling グループから) CodeDeploy によって作成されたすべての Amazon EC2 Auto Scaling ライフサイクルフックを削除した場合、デプロイは、CodeDeploy によって Amazon EC2 Auto Scaling グループの一部としてスケールアップされた Amazon EC2 インスタンスに実行されることはありません。

不一致の Amazon EC2 Auto Scaling ライフサイクルフックにより、Amazon EC2 Auto Scaling グループへの自動デプロイが停止または失敗する場合がある

Amazon EC2 Auto Scaling と CodeDeploy はライフサイクルフックを使用して、Amazon EC2 Auto Scaling グループで起動された後にデプロイするアプリケーションリビジョンと、そのデプロイ先の Amazon EC2 インスタンスを判断します。ライフサイクルフックとそれに関する情報が Amazon EC2 Auto Scaling と CodeDeploy で正確に一致しない場合、自動デプロイは停止または失敗することがあります。

Amazon EC2 Auto Scaling グループへのデプロイが失敗する場合は、Amazon EC2 Auto Scaling と CodeDeploy のライフサイクル名が一致するかどうか確認します。一致しない場合は、次の AWS CLI コマンド呼び出しを使用します。

最初に、Amazon EC2 Auto Scaling グループとデプロイグループの両方のライフサイクルフック名の一覧を取得します。

  1. describe-lifecycle-hooks コマンドを呼び出し、CodeDeploy のデプロイグループに関連付けられた Amazon EC2 Auto Scaling グループの名前を指定します。出力の LifecycleHooks リストで、LifecycleHookName のそれぞれの値を書き留めます。

  2. get-deployment-group コマンドを呼び出し、Amazon EC2 Auto Scaling グループに関連付けられたデプロイグループの名前を指定します。出力の autoScalingGroups リストで、名前の値が Amazon EC2 Auto Scaling グループ名と一致する項目を見つけ、対応する hook の値を書き留めます。

ここで、2 セットのライフサイクルフック名を比較します。それらが 1 文字ずつ正確に一致する場合は、これが問題ではありません。このセクションの他の場所で説明されている Amazon EC2 Auto Scaling の他のトラブルシューティングステップを試してください。

ただし、2 セットのライフサイクルフック名が 1 文字ずつ正確に一致しない場合は、次の操作を行います。

  1. get-deployment-group コマンド出力にもないライフサイクルフック名が describe-lifecycle-hooks コマンド出力にある場合は、次の操作を行います。

    1. describe-lifecycle-hooks コマンド出力のライフサイクルフック名ごとに、delete-lifecycle-hook コマンドを呼び出します。

    2. update-deployment-group コマンドを呼び出し、元の Amazon EC2 Auto Scaling グループの名前を指定します。CodeDeploy は新しい代替のライフサイクルフックを Amazon EC2 Auto Scaling グループに作成し、このライフサイクルフックをデプロイグループに関連付けます。これで、Amazon EC2 Auto Scaling グループに新しいインスタンスを追加すると、自動デプロイが開始されます。

  2. describe-lifecycle-hooks コマンド出力にもないライフサイクルフック名が get-deployment-group コマンド出力にある場合は、次の操作を行います。

    1. update-deployment-group コマンドを呼び出します。ただし、元の Amazon EC2 Auto Scaling グループの名前を指定しないでください。

    2. もう一度 update-deployment-group コマンドを呼び出しますが、今回は元の Amazon EC2 Auto Scaling グループの名前を指定します。CodeDeploy は見つからないライフサイクルフックを Amazon EC2 Auto Scaling グループに再作成します。これで、Amazon EC2 Auto Scaling グループに新しいインスタンスを追加すると、自動デプロイが開始されます。

1 文字ごとに正確に一致する 2 セットのライフサイクルフック名を取得したら、アプリケーションリビジョンをもう一度デプロイしますが、Amazon EC2 Auto Scaling グループに追加された新しいインスタンスにのみデプロイします。Amazon EC2 Auto Scaling グループに既に存在するインスタンスに対しては、デプロイは自動的に行われません。