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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

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

  • Amazon EC2 Auto Scaling は、EC2 インスタンスを継続的に起動および終了します。もし CodeDeploy アプリケーションリビジョンを自動的にデプロイすることはできません。Amazon EC2 Auto Scaling は継続的に EC2 インスタンスを起動および終了させます。

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

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

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

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

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

    • CodeDeploy エージェントは AMI に含まれていません: ♪cfn-initをインストールするには、 CodeDeploy エージェント新しいインスタンスの起動中に、エージェントのインストールスクリプトをcfn-initのセクションAWS CloudFormationテンプレート。

    • CodeDeploy エージェントは AMI に含まれます: AMI がStoppedインスタンスの作成日時を述べて、次に最後のステップとして、エージェントを起動するスクリプトをcfn-initスクリプトライブラリ。

「CodeDeployRole は、次の操作を実行するアクセス許可をユーザーに付与しません。AWSサービス: AmazonAutoScaling というエラーが表示される

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

  • EC2:RunInstances

  • EC2:CreateTags

  • iam:PassRole

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

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

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

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

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

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

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

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

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

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

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

注記

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

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

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] (EC2 サービスプロパティ) の [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 ファイルを開きます。詳細については、「EC2/オンプレミスデプロイ向けに AppSpec ファイルを追加する」を参照してください。

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

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

Amazon EC2 Auto Scaling の詳細については、「」を参照してください。ボンネットの下: CodeDeploy と Auto Scaling 統合

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

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

Launching a new 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」を参照してください。

  • Auto Scaling グループは、あまりにも多くの EC2 インスタンスを早く起動しようとしました。新しいインスタンスごとに RecordLifecycleActionHeartbeat または CompleteLifecycleAction への API コールがスロットルされました。

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

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

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

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

  1. 以下のいずれかを実行します。

    • delete-deployment-group コマンドを呼び出して、ハートビートタイムアウトの原因となっている Auto Scaling グループに関連付けられたデプロイグループを削除します。

    • Auto Scaling グループ名の NULL ではない空のリストを指定して、update-deployment-group コマンドを呼び出し、CodeDeploy が管理する全ての Auto Scaling ライフサイクルフックをデタッチすることができます。

      たとえば、AWS CLI コマンドを使用して以下を入力します。

      aws deploy update-deployment-group --application-name my-example-app --current-deployment-group-name my-deployment-group --auto-scaling-groups

      別の例として、 CodeDeploy Java でAPI、呼び出しUpdateDeploymentGroupと設定するautoScalingGroupsnew ArrayList<String>()。これにより、autoScalingGroups を空のリストに設定し、既存のリストを削除します。デフォルトの null を使用すると、autoScalingGroups がそのまま残ってしまうので使用しないでください。

    呼び出しの出力を確認します。出力に hooksNotCleanedUp 構造と Amazon EC2 Auto Scaling ライフサイクルフックの一覧が含まれている場合、ライフサイクルフックの残りがあります。

  2. describe-lifecycle-hooks コマンドを呼び出し、起動に失敗した EC2 インスタンスに関連付けられている Amazon EC2 Auto Scaling グループの名前を指定します。出力で、次のいずれかを確認します。

    • Amazon EC2 Auto Scaling ライフサイクルフック名で、ステップ 1 で特定した hooksNotCleanedUp 構造に対応するもの

    • Amazon EC2 Auto Scaling ライフサイクルフック名で、失敗している Auto Scaling グループに関連するデプロイグループの名前を含むもの

    • Amazon EC2 Auto Scaling のライフサイクルフック名で、 CodeDeploy デプロイ。

  3. フックがステップ 2 でリストされたカテゴリのいずれかに該当する場合は、delete-lifecycle-hook コマンドを呼び出して削除します。Amazon EC2 Auto Scaling グループとライフサイクルフックをコールで指定します。

    重要

    ステップ 2 で説明したように、問題の原因となっているフックのみを削除してください。実行可能なフックを削除すると、デプロイに失敗することがあります。 CodeDeploy は、スケールアウトされた EC2 インスタンスにアプリケーションリビジョンをデプロイできないこともあります。

  4. update-deployment-group または create-deployment-group コマンドを、必要な Auto Scaling グループ名で呼び出します。CodeDeploy は、新しい UUID を持つ Auto Scaling フックを再インストールします。

注記

から Auto Scaling グループをデタッチした場合 CodeDeploy デプロイグループでは、Auto Scaling グループへの進行中のデプロイはすべて失敗し、Auto Scaling グループによってスケールアウトされた新しい EC2 インスタンスは CodeDeploy からアプリケーションリビジョンを受けとれなくなる可能性があります。CodeDeploy で Auto Scaling を再度動作させるには、Auto Scaling グループをデプロイグループに再アタッチし、新しい CreateDeployment を呼び出しして、フリート全体のデプロイを開始する必要があります。

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

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

Amazon EC2 Auto Scaling グループへのデプロイが失敗する場合、Amazon EC2 Auto Scaling のライフサイクルフック名と CodeDeploy match。一致しない場合は、次の 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. を呼び出します。アップデート展開グループコマンドで、元の 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 グループに既に存在するインスタンスに対しては、デプロイは自動的に行われません。

「デプロイグループのインスタンスが見つからないため、デプロイに失敗しました」というエラー

以下が表示されている場合は、このセクションをお読みください。 CodeDeploy エラー:

The deployment failed because no instances were found for your deployment group. Check your deployment group settings to make sure the tags for your EC2 instances or Auto Scaling groups correctly identify the instances you want to deploy to, and then try again.

このエラーの原因として考えられるのは、以下の通りです。

  1. デプロイグループの設定には、正しくない Auto Scaling グループ、EC2 インスタンス、またはオンプレミスインスタンスのタグが含まれています。この問題を解決するには、タグが正しいことをチェックしてから、アプリケーションを再デプロイしてください。

  2. デプロイ開始後、フリートがスケールアウトしました。このシナリオでは、フリートで InService 状態の正常なインスタンスが表示されますが、上記のエラーも表示されます。この問題を解決するには、アプリケーションを再デプロイします。

  3. Auto Scaling グループには、InService 状態のインスタンスは含まれません。このシナリオでは、フリート全体のデプロイを実行しようとすると、上記のエラーメッセージが表示されてデプロイが失敗します。 CodeDeploy に、少なくとも 1 つのインスタンスが必要です。InService状態。InService 状態でインスタンスがない場合、様々な理由が考えられます。その一部を紹介します。

    • Auto Scaling グループのサイズを 0 にスケジュール (または手動で設定) しました。

    • Auto Scaling は、不正な EC2 インスタンスを検出したため (例えば、EC2 インスタンスにハードウェア障害が発生した)、すべてキャンセルし、InService 状態には何も残さないようにしました。

    • からのスケールアウトイベント中01, CodeDeploy 以前に成功したリビジョンをデプロイした(最後に成功したリビジョン) 前回の展開から不健康になってしまった。これにより、スケールアウトしたインスタンスのデプロイが失敗し、そのため、Auto Scaling がインスタンスをキャンセルし、InService 状態のインスタンスが一つも残らないという事態が発生しました。

      InService 状態のインスタンスがないことがわかった場合、次の手順 To troubleshoot the error if there are no instances in the InService state の説明に従ってトラブルシューティングします。

にインスタンスが存在しない場合のエラーのトラブルシューティングについて InService state

  1. Amazon EC2 コンソールで、希望する容量設定設定。ゼロの場合は、正の数に設定します。インスタンスが InService になるのを待ちます。これは、デプロイが成功したことを意味します。問題が解決されたので、このトラブルシューティングの手順の残りのステップはスキップできます。[Desired Capacity] (希望する容量) の設定については、「Amazon EC2 Auto Scaling ユーザーガイド」の「Auto Scaling グループの容量制限を設定する」を参照してください。

  2. Auto Scaling が希望する容量を満たすために新しい EC2 インスタンスを起動し続けようとするが、スケールアウトを実行できない場合は、通常、Auto Scaling のライフサイクルフックが失敗していることが原因です。この問題については、次のようにトラブルシューティングします。

    1. 失敗している Auto Scaling ライフサイクルフックイベントを確認するには、Amazon EC2 Auto Scaling ユーザーガイドの「Auto Scaling グループのスケーリングアクティビティの確認」を参照してください。

    2. 失敗したフックの名前が CodeDeploy-managed-automatic-launch-deployment-hook-DEPLOYMENT_GROUP_NAME の場合、CodeDeploy に移動し、デプロイグループを見つけて、Auto Scaling によって開始され、失敗したデプロイを見つけます。次に、デプロイが失敗した理由を調べます。

    3. デプロイが失敗した理由を理解している場合(たとえば、 CloudWatch アラームが発生していた)、リビジョンを変更せずに問題を修正し、今すぐ実行してください。

    4. 調査の結果、CodeDeploy の最後に成功したリビジョンが正常ではなくなり、Auto Scaling グループ内の正常なインスタンスがゼロであると判断された場合、デプロイのデッドロックシナリオに陥っています。この問題を解決するには、不良を修正する必要があります CodeDeploy Auto Scaling グループから CodeDeploy のライフサイクルフックを一時的に削除し、フックを再インストールして新しい (正しい) リビジョンを再デプロイすることで、リビジョンを行います。手順については、こちらを参照してください。

デプロイのデッドロックの問題を解決するには (CLI)

  1. (オプション) 原因となる CI/CD パイプラインをブロックします。 CodeDeploy エラー。この問題を解決している間に予期しないデプロイが発生しないようにします。

  2. Auto Scaling の現在の [DesiredCapacity] 設定を書き留めます:

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASG_NAME

    場合によっては、この手順の最後に、この数値にスケールバックする必要があります。

  3. Auto Scaling の [DesiredCapacity] 設定を 1 にしてください。開始の際に希望する容量が 1 より大きい場合、オプションとなります。それを 1 に減らすことで、インスタンスのプロビジョニングとデプロイにかかる時間が短くなり、トラブルシューティングが高速化されます。Auto Scaling の希望する容量がもともと 0 に設定されている場合、1 に増やす必要があります。これは必須です。

    AWS 自動スケーリング set-desired-capacity —Auto Scaling-group-nameASG_NAME—希望容量 1

    注記

    この手順の残りのステップでは、[DesiredCapacity]1 に 設定したものとします。

    この時点で、Auto Scaling は 1 つのインスタンスへのスケーリングを試みます。それでは、フックなので CodeDeploy 追加はまだ存在し、 CodeDeploy はデプロイを試みて、デプロイは失敗し、Auto Scaling はインスタンスをキャンセルし、Auto Scaling は必要な容量の 1 に達するようにインスタンスを再起動しようとして、その場合は再び失敗します。キャンセル再起動ループに入っています。

  4. デプロイグループから Auto Scaling グループの登録を解除します。

    警告

    次のコマンドは、ソフトウェアなしで新しい EC2 インスタンスを起動します。コマンドを実行する前に、ソフトウェアを実行していない Auto Scaling InService インスタンスが許容されることを確認します。例えば、ロードバランサーがソフトウェアなしでこのホストにトラフィックを送信していないことを確認してください。

    重要

    を使用する CodeDeploy 以下に示すコマンドで、フックを削除します。Auto Scaling サービスによるフック削除は、CodeDeploy で認識されないため、削除しないでください。

    aws deploy update-deployment-group --application-name APPLICATION_NAME --current-deployment-group-name DEPLOYMENT_GROUP_NAME --auto-scaling-groups

    このコマンドを実行すると、次の処理が実行されます。

    1. CodeDeployは、デプロイグループから Auto Scaling グループを登録解除します。

    2. CodeDeploy は Auto Scaling グループから Auto Scaling ライフサイクルフックを削除します。

    3. デプロイ失敗の原因となっていたフックが存在しなくなるため、Auto Scaling は既存の EC2 インスタンスをキャンセルし、希望容量にスケーリングする新しいインスタンスを直ちに起動します。新しいインスタンスは、InService 状態にまもなく移行するはずです。新しいインスタンスには、ソフトウェアは含まれません。

  5. EC2 インスタンスが InService 状態になるのを待ちます。その状態を確認するには、次のコマンドを使用します。

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names ASG_NAME --query AutoScalingGroups[0].Instances[*].LifecycleState

  6. EC2 インスタンスにフックを追加し直します。

    重要

    を使用する CodeDeploy 以下に示すコマンドで、フックを追加します。Auto Scaling サービスによるフックの追加は、CodeDeploy で認識されないため、利用しないでください。

    aws deploy update-deployment-group --application-name APPLICATION_NAME --current-deployment-group-name DEPLOYMENT_GROUP_NAME --auto-scaling-groups ASG_NAME

    このコマンドを実行すると、次の処理が実行されます。

    1. CodeDeploy は、Auto Scaling ライフサイクルフックを EC2 インスタンスに再インストールします。

    2. CodeDeploy は、Auto Scaling グループをデプロイグループに再登録します。

  7. Amazon S3 を使用してフリート全体のデプロイを作成するか、 GitHub 正常であることがわかり、使用したいというリビジョン。

    たとえば、リビジョンが、my-revision-bucket という Amazon S3 バケットにある .zip ファイルで、オブジェクトキーが httpd_app.zip である場合、次のコマンドを入力します。

    aws deploy create-deployment --application-name APPLICATION_NAME --deployment-group-name DEPLOYMENT_GROUP_NAME --revision "revisionType=S3,s3Location={bucket=my-revision-bucket,bundleType=zip,key=httpd_app.zip}"

    現在、Auto Scaling グループに InService インスタンスが一つ存在するため、このデプロイは機能するはずで、エラー [デプロイグループのインスタンスが見つからないため、デプロイに失敗しました] は表示されなくなります。

  8. 以前にスケールインしていた場合、デプロイが成功したら、Auto Scaling グループをスケールアウトして元の容量に戻します。

    aws autoscaling set-desired-capacity --auto-scaling-group-name ASG_NAME --desired-capacity ORIGINAL_CAPACITY

デプロイのデッドロックの問題を解決するには (コンソール)

  1. (オプション) 原因となる CI/CD パイプラインをブロックします。 CodeDeploy エラー。この問題を解決している間に予期しないデプロイが発生しないようにします。

  2. Amazon EC2 コンソールにアクセスし、Auto Scaling を書き留めます。希望する容量設定設定。場合によっては、この手順の最後に、この数値にスケールバックする必要があります。この設定の見つけ方の詳細については、「Auto Scaling グループの容量制限の設定」を参照してください。

  3. 必要な EC2 インスタンスの数を 1 に設定:

    希望する容量が 1 より大きい場合、オプションとなります。それを 1 に減らすことで、インスタンスのプロビジョニングとデプロイにかかる時間が短くなり、トラブルシューティングが高速化されます。Auto Scaling の 希望する容量 がもともとに 0 設定されている場合、1 に増やす必要があります。これは必須です。

    注記

    この手順の残りのステップでは、1希望する容量 を設定したものとします。

    1. Amazon EC2 Auto Scaling コンソール (https://console.aws.amazon.com/ec2autoscaling/) を開きます。

    2. 適切なリージョンを選択します。

    3. 問題がある Auto Scaling グループに移動します。

    4. [グループの詳細] で、[編集] を選択します。

    5. 1希望する容量 を設定。

    6. [Update] (アップデート) を選択します。

  4. デプロイグループから Auto Scaling グループの登録を解除します。

    警告

    次のサブステップでは、ソフトウェアなしで新しい EC2 インスタンスを起動します。コマンドを実行する前に、ソフトウェアを実行していない Auto Scaling InService インスタンスが許容されることを確認します。例えば、ロードバランサーがソフトウェアなしでこのホストにトラフィックを送信していないことを確認してください。

    1. を開く CodeDeploy コンソール)https://console.aws.amazon.com/codedeploy/

    2. 適切なリージョンを選択します。

    3. ナビゲーションペインで、[アプリケーション] を選択します。

    4. 名前を選択します。 CodeDeploy アプリケーションをデプロイします。

    5. 名前を選択します。 CodeDeploy デプロイグループ。

    6. [Edit] (編集) を選択します。

    7. 環境設定 では、Amazon EC2 Auto Scaling グループ の選択を解除します。

      注記

      環境設定が定義されていない場合、コンソールでは設定を保存できません。チェックをバイパスするには、どのホストにも解決しないことがわかっている EC2 または On-premises のタグを一時的に追加してください。タグを追加するには、Amazon EC2 インスタンス または オンプレミスインスタンス を選択し、タグの キー として EC2 または On-premises を追加します。タグの は、空欄でも構いません。

    8. [Save changes] (変更の保存) を選択します。

      これらのサブステップを完了すると、次のようになります。

      1. CodeDeployは、デプロイグループから Auto Scaling グループを登録解除します。

      2. CodeDeploy は Auto Scaling グループから Auto Scaling ライフサイクルフックを削除します。

      3. デプロイ失敗の原因となっていたフックが存在しなくなるため、Auto Scaling は既存の EC2 インスタンスをキャンセルし、希望容量にスケーリングする新しいインスタンスを直ちに起動します。新しいインスタンスは、InService 状態にまもなく移行するはずです。新しいインスタンスには、ソフトウェアは含まれません。

  5. EC2 インスタンスが InService 状態になるのを待ちます。その状態を確認するには:

    1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

    2. ナビゲーションペインで、[Auto Scaling Groups] をクリックします。

    3. [Auto Scaling グループ] を選択します。

    4. コンテンツペインで、インスタンス管理 タブを選択します。

    5. インスタンス で、ライフサイクル 列がインスタンスの横で InService と表示されていることを確認します。

  6. に Auto Scaling グループを再登録します。 CodeDeploy 削除に使用したのと同じ方法を使用したデプロイグループ:

    1. を開く CodeDeploy コンソール)https://console.aws.amazon.com/codedeploy/

    2. 適切なリージョンを選択します。

    3. ナビゲーションペインで、[アプリケーション] を選択します。

    4. 名前を選択します。 CodeDeploy アプリケーションをデプロイします。

    5. 名前を選択します。 CodeDeploy デプロイグループ。

    6. [Edit] (編集) を選択します。

    7. 環境設定 で、Amazon EC2 Auto Scaling グループ を選択し、リストから Auto Scaling グループを選択します。

    8. Amazon EC2 インスタンス または オンプレミスインスタンス で、追加したタグを見つけて削除します。

    9. Amazon EC2 インスタンスまたはオンプレミスインスタンス の横にあるチェックボックスの選択を解除します。

    10. [Save changes] (変更の保存) を選択します。

    この設定により、ライフサイクルフックが Auto Scaling グループに再インストールされます。

  7. Amazon S3 を使用してフリート全体のデプロイを作成するか、 GitHub 正常であることがわかり、使用したいというリビジョン。

    たとえば、リビジョンが、my-revision-bucket という Amazon S3 バケットにある .zip ファイルで、オブジェクトキーが httpd_app.zip である場合、以下を実行します。

    1. 左 CodeDeploy コンソール、デプロイグループ[] ページで、[]デプロイの作成

    2. [Revision type (リビジョンのタイプ)] の場合は、[My application is stored in Amazon S3 (Amazon S3 に保存されているアプリケーション)] を選択します。

    3. リビジョンの場所 は、s3://my-revision-bucket/httpd_app.zip を選択します。

    4. [リビジョンファイルの種類] で、[.zip] を選択します。

    5. [Create deployment] を選択します。

    現在、Auto Scaling グループに InService インスタンスが一つ存在するため、このデプロイは機能するはずで、エラー [デプロイグループのインスタンスが見つからないため、デプロイに失敗しました] は表示されなくなります。

  8. 以前にスケールインしていた場合、デプロイが成功したら、Auto Scaling グループをスケールアウトして元の容量に戻します。

    1. Amazon EC2 Auto Scaling コンソール (https://console.aws.amazon.com/ec2autoscaling/) を開きます。

    2. 適切なリージョンを選択します。

    3. Auto Scaling グループに移動します。

    4. [グループの詳細] で、[編集] を選択します。

    5. 希望する容量 元の値に戻す設定をします。

    6. [Update] (アップデート) を選択します。