AWS CloudFormation の Windows Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで、次のエラーメッセージが発生しています。 「指定した期間内で X 件のリソースシグナルを受信できませんでした」
簡単な説明
CloudFormation が、ResourceSignal で指定された CreationPolicy 属性を持つリソースの成功シグナルを受信しない場合に、このエラーが発生します。このエラーは、Amazon EC2 インスタンス、Auto Scaling グループ、または待機条件に対して発生する場合があります。
注: 次の解決策は、Windows インスタンスを使用して作成する CloudFormation スタックにのみ適用されます。Linux インスタンスについては、「AWS CloudFormation で発生する、「指定した期間内で X 件のリソースシグナルを受信できませんでした」というエラーの解決方法を教えてください」を参照してください。
解決方法
ユースケースに基づいて、次のトラブルシューティング手順を使用して問題を解決します。
注: スタックのロールバックを防ぐには、CloudFormation コンソールの [スタック障害] オプションで [正常にプロビジョニングされたリソースを保持する] を選択します。このオプションを選択した場合、障害が発生したインスタンスは、スタックを削除するまで終了しません。
cfn-bootstrap MSI パッケージが AWS CloudFormation スタックの 1 つ以上のインスタンスにインストールされていない
スタックにシグナルを送信するように設定されたインスタンスに cfn-signal スクリプトがインストールされていることを確認するには、次の手順を実行します。
- RDP を使用して、Windows インスタンスに接続します。
- cfn ヘルパースクリプトパッケージがインストールされていることを確認します。Windows PowerShell で次のコマンドを実行します。
Get-Package -name aws-cfn-bootstrap
重要: デフォルトでは、CloudFormation ヘルパースクリプトは Amazon Windows Amazon マシンイメージ (AMI) にインストールされます。ヘルパースクリプトをインストールするには、「CloudFormation ヘルパースクリプトのリファレンス」を参照してください。
AWS CloudFormation テンプレートに構文エラーまたは正しくない値がある
エラーと不正な値を見つけるには、次の手順を実行します。
- コードエディターで、スタックの CloudFormation テンプレートを開きます。次に、UserData プロパティセクションを探します。
- 構文エラー、スペースの欠落、スペルミス、その他のタイプミスがないかを確認します。
- スタック、リソース、AWS リージョンのプロパティの値が正しいことを確認します。
注: UserData プロパティに含まれるブートストラップスクリプトに構文エラーや誤った値がないかどうかを確認します。スクリプトは cfn シグナルを呼び出します。
cfn-init コマンドでシグナルを送る場合は、cfn-init ログでシグナルに関する情報を特定します。cloud-init ログまたは cfn-init ログのエラーを特定するには、RDP を使用してインスタンスに接続します。次に、"error" または "failure" というキーワードを使用して、次のログで詳細なエラーまたは失敗に関するメッセージを検索します。
C:\cfn\log\cfn-init.log
C:\cfn\log\cfn-init-cmd.log
C:\cfn\log\cfn-wire.log
CreationPolicy アトリビュートの timeout プロパティが非常に低い
timeout プロパティの値は、CreationPolicy 属性によって定義されます。cfn-signal スクリプトが CloudFormation リソースにシグナルを送信する前に、タスクを実行するのに十分な値であることを確認します。
timeout プロパティの値を確認し、シグナリングとリソース障害に関するタイムスタンプを比較するには、次の手順を実行します。
-
コードエディターでスタックの CloudFormation テンプレートを開き、timeout プロパティ値を確認します。
注: timeout プロパティ値は、CloudFormationがエラーを返すまでにシグナルを待つ最大時間です。
-
cfn-signal スクリプトがいつアクティブになるかを推定するには、RDP を使用してインスタンスに接続します。次のコマンドを実行します。
C:\cfn\log\cfn-init.log
ファイルに記録されている開始タイムスタンプと終了タイムスタンプを比較して、ブートストラップにかかった推定時間を取得します。必要に応じて timeout 値を変更します。指定できる最大時間は 12 時間です。
ログファイルは、SUCCESS シグナルが CloudFormation リソースに送信されたときのタイムスタンプを示しています。
例
2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
-
CloudFormation コンソールを開きます。
-
[イベント] ビューを選択します。
-
[ステータスの理由] を選択します。ステータス理由が「指定した期間内で X 件のリソースシグナルを受信できませんでした」であるイベントの行を展開します。
-
シグナリングタイムスタンプをリソース障害タイムスタンプと比較します。
注: 正常に完了するには、インスタンスが作成される前にスクリプトがシグナルを送信する必要があります。そうしないと、作成に失敗します。
** CFN シグナルが Amazon EC2 インスタンスから送信されない**
CloudFormation が受信したシグナルがインスタンスからのものであることを確認します。C:\cfn\log\cfn-wire.log にある cfn wire ログを確認します。レスポンスが 200 でない場合は、インスタンスと CloudFormation のエンドポイントとの接続に問題がある可能性があります。
インスタンスで再起動を設定しており、[UserData] セクションに cfn-signal が設定されている場合、シグナルが送信されないことがあります。これは、UserData は 1 回しか実行されないためです。詳細については、「Amazon EC2 Windows インスタンスがブートストラップを完了する前に CREATE_COMPLETE としてシグナルを返さないようにする方法を教えてください」を参照してください。
お使いのインスタンス以外の場所からシグナルを送信する場合は、SignalResource API を使用します。たとえば、AWS Lambda 関数を使用して SignalResource API を呼び出すと、シグナルをスタックに送信できます。エラーが発生した場合は、CloudWatch Logs を使用して Lambda ログをチェックし、シグナルがスタックに送信されなかった理由を確認してください。