AWS CloudFormation の Linux Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで、 「Failed to receive X resource signal(s) within the specified duration」というエラーメッセージが表示されます。
簡単な説明
このエラーは、CloudFormation が ResourceSignal で指定された CreationPolicy 属性を持つリソースに関する成功シグナルを受信しなかった場合に発生します。このエラーは、Amazon EC2 インスタンス、Auto Scaling グループ、または AWS::CloudFormation::WaitCondition で発生する可能性があります。
注: 次の解決策は、Linux インスタンスで作成した CloudFormation スタックにのみ適用されます。Windows インスタンスの場合は、「AWS CloudFormation の EC2 Windows インスタンスで「Failed to receive X resource signal(s) within the specified duration」エラーを解決するにはどうすればよいですか?」を参照してください。
解決策
ユースケースに基づいて、次のトラブルシューティング手順を使用して問題を解決します。
注: スタックのロールバックを防ぐには、CloudFormation コンソールの [スタック障害] オプションで [正常にプロビジョニングされたリソースを保持する] を選択します。このオプションでは失敗のロールバックは行われず、スタックを削除しない限りインスタンスは停止しません。
cfn-signal スクリプトが CloudFormation スタックのインスタンスにインストールされていない
スタックにシグナルを送信するように設定したインスタンスに cfn-signal スクリプトがインストールされていることを確認するには、次の手順を実行します。
- SSH を使用して Linux インスタンスに接続します。
- 次のスクリプトのいずれかを使用して 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-sign
cfn-signal スクリプトを含む CloudFormation ヘルパースクリプトパッケージがインストールされていることを確認するには、次のコマンドを実行します。
$ sudo rpm -q aws-cfn-bootstrapaws-cfn-bootstrap-1.4-30.amzn2.noarch
重要: 上記のコマンドは、RPM Package Manager (RPM) を使用するディストリビューションでのみ機能します。RPM Package Manager の詳細については、Red Hat のウェブサイトで「第1章 RPM の概要」を参照してください。CloudFormation ヘルパースクリプトは、デフォルトで Amazon Linux Amazon マシンイメージ (AMI) にインストールされます。ヘルパースクリプトをインストールする方法については、「CloudFormation ヘルパースクリプトのリファレンス」を参照してください。
CloudFormation テンプレートに構文エラーまたは誤った値が含まれている
エラーと不正な値を見つけるには、次の手順を実行します。
- コードエディターでスタックのテンプレートを開き、UserData プロパティのセクションを見つけます。
- 構文エラー、スペースの欠落、スペルミス、その他のタイプミスがないかを確認します。
- スタック、リソース、AWS リージョンのプロパティの値が正しいことを確認します。
注: UserData プロパティに含まれるブートストラップスクリプトを確認してください。このスクリプトは cfn-signal を呼び出します。構文エラーや不正な値がないか確認してください。
cfn-init コマンドでシグナルを送る場合は、cfn-init ログでシグナルに関する情報を特定します。cloud-init ログまたは cfn-init ログのエラーを検索するには、SSH を使用してインスタンスに接続します。次に、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\*)
**注:**上記のコマンドは、ファイル名、行番号、およびエラーメッセージを返します。
CreationPolicy 属性のタイムアウトプロパティ値が低すぎる
CreationPolicy 属性は、timeout プロパティ値を定義します。cfn-signal スクリプトが CloudFormation リソースにシグナルを送信する前に、タスクを実行するのに十分な値であることを確認します。
timeout プロパティの値を確認し、シグナリングとリソース障害に関するタイムスタンプを比較するには、次の手順を実行します。
- コードエディターでスタックの CloudFormation テンプレートを開き、timeout プロパティ値を確認します。
**注:**timeout プロパティの値は、CloudFormationがエラーを返すまでにシグナルを待機する最長の時間です。
- cfn-signal スクリプトがいつ有効になったかを推定するには、SSH を使用してインスタンスに接続し、以下のコマンドを実行します。
less /var/log/cfn-init.log
ログファイルには、SUCCESS シグナルが CloudFormation リソースに送信されたときのタイムスタンプが表示されます。
- CloudFormation コンソールを開きます。
- [イベント] ビューを選択します。
- [ステータスの理由] を選択します。ステータスの理由が「Failed to receive X resource signal(s) within the specified duration」であるイベントの行を展開します。
- シグナルのタイムスタンプをリソース障害のタイムスタンプと比較します。
**注:**正常に完了するには、インスタンスが作成されるか、作成に失敗前に、スクリプトによってシグナルが送信される必要があります。
cfn-signal はインスタンスから送信されません
CloudFormation が受信したシグナルがインスタンスからのものであることを確認します。/var/log/cfn-wire.log にある cfn wire ログを確認します。応答が 200 以外の場合は、インスタンスと CloudFormation のエンドポイントとの接続に問題がある可能性があります。
お使いのインスタンス以外の場所からシグナルを送信する場合は、SignalResource API を使用します。たとえば、AWS Lambda 関数を使用して SignalResource API を呼び出し、シグナルをスタックに送信することができます。エラーが発生した場合は、CloudWatch Logs を使用して Lambda ログをチェックし、シグナルがスタックに送信されなかった理由を確認してください。