AWS CloudFormation で、「指定された期間内に X 個のリソースシグナルを受信できませんでした」というエラーメッセージが表示されます。 このエラーの解決方法を教えてください。
簡単な説明
Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、Auto Scaling グループ、または WaitCondition が CreationPolicy 属性で指定された期間内に 1 つ以上のインスタンスから成功シグナルを受信しない場合にこのエラーが発生します。
このエラーは、次のいずれかのシナリオで発生する可能性があります:
- シナリオ 1: cfn-signal スクリプトが AWS CloudFormation スタックの 1 つ以上のインスタンスにインストールされていません。
- シナリオ 2: AWS CloudFormation テンプレートに構文エラーまたは正しくない値があります。
- シナリオ 3: CreationPolicy 属性の Timeout プロパティの値が小さすぎます。
- シナリオ 4: Amazon EC2 インスタンスから cfn-signal が送信されていません。
注意: このエラーのトラブルシューティングシナリオは、Linux インスタンスで作成された AWS CloudFormation スタックにのみ適用されます。これらは Windows インスタンスに適用されません。詳細については、「スタック作成に関する問題のトラブルシューティング方法」を参照してください。
解決方法
トラブルシューティングシナリオの手順を実行する前に、AWS CloudFormation スタックの [失敗時にロールバック] オプションを [いいえ] に設定してください。
シナリオ 1:cfn-signal スクリプトが AWS CloudFormation スタックの 1 つ以上のインスタンスにインストールされない
AWS CloudFormation リソースにシグナルを送信するように設定されているインスタンスに cfn-signal スクリプトがインストールされていることを確認するには、次の手順を実行します :
1. SSH を使用して Linux インスタンスに接続します。
2. 次のいずれかのコマンドを使って、cfn-signal スクリプトがインストールされていることを確認してください。
cfn-signal スクリプトが自分のディレクトリにあることを確認するには、次のコマンドを実行します:
$ sudo find / -name cfn-signal
/opt/aws/bin/cfn-signal
/opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-signal
cfn-signal スクリプトを含む AWS CloudFormation ヘルパースクリプトパッケージがインストールされていることを確認するには、次のコマンドを実行します:
$ sudo rpm -q aws-cfn-bootstrap
aws-cfn-bootstrap-1.4-30.amzn2.noarch
重要 : 前述のコマンドは、RPM Package Manager を使用するディストリビューションでのみ機能します。
注意: デフォルトでは、AWS CloudFormation ヘルパースクリプトが Amazon Linux Amazon Machine Images (AMIs) にインストールされています。AWS CloudFormation ヘルパースクリプトがインストールされていない場合は、インストール手順について 「 CloudFormation ヘルパースクリプトリファレンス」を参照してください。
シナリオ 2: AWS CloudFormation テンプレートに構文エラーまたは正しくない値があります
UserData プロパティが CreationPolicy 属性で指定された AWS CloudFormation リソースに通知するように設定されていることを確認するには、次の手順を実行します :
1. コードエディタで、スタック用の AWS CloudFormation テンプレートを開き、UserData プロパティセクションを見つけます。
2. 構文エラー、スペースの欠落、つづりの間違い、この他の誤字を含むエラーを確認してください。
3. スタック、リソース、およびリージョンのプロパティの値が正しいことを確認してください。
注意: UserData プロパティを含み、cfn-signal スクリプトを呼び出すブートストラップスクリプトを使用する場合は、ブートストラップスクリプトの構文エラーまたは正しくない値を確認してください。
cfn-init コマンドキー内でシグナルを送信する場合は、cfn-init ログでシグナルに関する情報を探します。cloud-init ログまたは cfn-init ログ内のエラーを検索するには、SSH を使って Amazon EC2 インスタンスに接続します。次に、次のログでキーワード「error」または「failure」を検索して、詳細なエラーメッセージまたはエラーメッセージを検索します。
/var/log/cloud-init-output.log
/var/log/cloud-init.log
/var/log/cfn-init.log
/var/log/cfn-init-cmd.log
/var/log/cfn-wire.log
任意の /var/log/cfn ファイルまたは /var/log/cloud-init ファイル内の単語「error」または「failure」のすべてのインスタンスを解析するには、次のコマンドを実行します。
grep -ni 'error\|failure' $(sudo find /var/log -name cfn\* -or -name cloud-init\*)
注意: 前述のコマンドは、ファイル名、行番号、およびエラーメッセージを返します。
シナリオ 3: CreationPolicy 属性の Timeout プロパティの値が小さすぎます
Timeout プロパティの値は、CreationPolicy 属性によって定義されます。cfn-signal スクリプトが AWS CloudFormation リソースにシグナルを送信する前にタスクの実行に十分な値になっていることを確認するには、次の手順を実行します。
重要: 次の手順は、(Auto Scaling グループなどによって) インスタンスが終了されていない場合に限り有効です。AWS CloudFormation スタックの [失敗時にロールバック] オプションをすでに [いいえ] に設定しています。このオプションは、失敗のロールバックがなく、スタックを削除するまでインスタンスが終了しないことを意味します。SSH を使ってしてインスタンスに接続してから、次のトラブルシューティング手順を続行できます。
1. コードエディタで、スタック用の AWS CloudFormation テンプレートを開き、Timeout プロパティの値を見つけます。
**注 :**Timeout プロパティの値は、エラーが返されるまでに AWS CloudFormation がシグナルを待機する最大時間です。
2. cfn-signal スクリプトがいつトリガーされたかを見積もるには、SSH を使ってインスタンスに接続してから、次のコマンドを実行します:
less /var/log/cfn-init.log
SUCCESS シグナルが AWS CloudFormation リソースに送信されたときに、ログファイルにタイムスタンプが表示されます。次の例を参照してください。
2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
3. AWS CloudFormation コンソールを開きます。
4. 「指定された期間内に X 個のリソース信号を受信できませんでした」というイベントのリソース障害タイムスタンプを確認するには、[イベント] ビューを選択します。
5. [ステータスの理由] で、ステータスの理由「指定された期間内に X 個のリソース信号を受信できませんでした」でイベントの行を展開します。
6. シグナリングタイムスタンプをリソース障害タイムスタンプと比較します。
**注 :**Amazon EC2 リソースの作成に失敗した後にシグナルが送信されたことに注意してください。Amazon EC2 リソースが作成される、または作成に失敗する前にシグナルが送信されます。
シナリオ 4: cfn-signal が Amazon EC2 インスタンスから送信されません
SignalResource API は、Amazon EC2 インスタンス以外からのシグナルを送信したい場合に役立ちます。
例えば、AWS Lambda 関数を使用して SignalResource API を呼び出してから、そのシグナルを AWS CloudFormation スタックに送信することができます。そのようなシナリオでは、Amazon CloudWatch Logs で Lambda ログを確認してください。これらのログは、シグナルが AWS CloudFormation スタックに送信されない理由を把握するのに役立ちます。