AWS CloudFormation のカスタムリソースのエラーを解決したいです。
簡単な説明
カスタムリソースの障害は、次の 2 つのカテゴリに分類されます。
- AWS Lambda 関数でエラーが発生したため、操作が失敗しました。 この障害は、カスタムリソースが FAILED シグナルを CloudFormation に返したときに発生します。この障害は通常、カスタムリソースをバックアップする AWS Lambda 関数の実行時にエラーが発生したことを示しています。
- タイムアウト障害: これは、CloudFormation が予想される時間枠内にカスタムリソースから応答を受け取らず、タイムアウトになった場合に発生します。
解決策
エラーをトラブルシューティングするには、次の手順を実行します。
Amazon CloudWatch ログを確認する
最初のステップとして、どちらのタイプの障害についても、AWS Lambda の Amazon CloudWatch ログを確認します。
- CloudFormation コンソールで、障害が発生したスタックを選択します。次に、[リソース] タブを選択して、カスタムリソースをサポートする Lambda 関数の物理 ID を確認します。
- 新しいウィンドウで開く Lambda 関数を選択します。
- [モニター] タブを選択します。次に、[CloudWatch ログを表示] ボタンを選択します。エラーをトラブルシューティングするための Lambda 関数ログが表示されます。
Lambda 関数は CloudFormation のロールバック中に削除された可能性があります。ただし、ロググループにはまだ CloudWatch ログが保持されている可能性があります。ログを検索するには、次の手順に従います。
-
CloudWatch コンソールに移動します。
-
左側のメニューで [ロググループ] を選択します。
-
[検索] ボックスに、次のように入力します。
/aws/lambda/<LambdaPhysicalName>
注: LambdaPhysicalName は、CloudFormation リソースにあります。
CloudWatch ログが見つからない場合は、ロールバック機能を無効にしてスタックを再デプロイします。これにより、Lambda 関数の動作と潜在的な問題を調査できます。
各障害タイプとその潜在的な原因を調べる
FAILED シグナルの処理
次のエラーが表示される場合があります。 「カスタムリソースから応答ステータス FAILED を受信しました。メッセージが返されました:<reason here>。」
このメッセージは、カスタムリソースをサポートしている Lambda 関数でエラーが発生し、例外処理ロジックが設定されていることを示しています。
次のオプションに従ってエラーを修正します。
- 応答に理由が含まれている場合は、エラーメッセージを確認してください。通常、これらの理由はわかりやすく、CloudFormation イベントのエラーメッセージに直接表示されます。
- Lambda の CloudWatch ログを確認します。エラーメッセージが不明確な場合や、エラーの原因が記載されていない場合があります。
CloudFormation が応答を受信していない
CloudFormation がカスタムリソースから応答を受け取っていないため、タイムアウトによりスタックが失敗します。この問題の要因となる可能性となるものが、複数あります。次のオプションを確認して、障害の原因を特定します。
cfn-response モジュールを正しく使用する必要があります。 カスタムリソースの Lambda 関数の cfn-response モジュールを使用すると、CloudFormation スタックにシグナルを返すことができます。モジュールをコードで正しく使用していない場合、CloudFormation は必要な応答を得られません。
**CloudWatch ログを確認します。**CloudWatch ログを確認して、コード実行中にエラーが発生していないかどうかを確認します。これらのエラーにより、特にコードに例外処理ロジックがない場合、関数が CloudFormation にシグナルを送信できなくなる可能性があります。
**Lambda の実行タイムアウトを確認します。**Lambda 関数のタイムアウト設定がタスクを完了するのに十分な長さであることを確認してください。Lambda 関数の最大制限は 15 分であることに注意してください。
**Amazon Simple Storage Service (Amazon S3) のエンドポイントアクセスを確認します。**CloudFormation がシグナルを受信するには、カスタムリソースが署名済みの Amazon Simple Storage Service (Amazon S3) にアクセスする必要があります。Lambda 関数が仮想プライベートクラウド内にある場合は、サブネット内にあることを確認してください。サブネットは、NAT ゲートウェイ経由のアウトバウンドトラフィックを許可し、Amazon S3 エンドポイントへのアクセス用の適切なルーティングを備えている必要があります。
**Lambda の同時実行問題を考慮します。**Lambda ログにタイムアウト後に送信されたシグナルがある場合は、Lambda の同時実行を潜在的な原因として調査してください。同じリージョンで多数の Lambda 関数が同時に実行されると、タイムアウトが発生します。同時実行の Lambda メトリクスを監視します。タイムアウトを減らすには、関数用に予約された同時実行数を使用します。
**IN_PROGRESS ステータスからスタックを手動で削除します。**このエラーでは、カスタムリソースがタイムアウトになるまで CloudFormation は *_IN_PROGRESS のままになります。リソースが FAIL とマークされるまでしばらく時間がかかる場合があります。カスタムリソースをすばやく安定させるには、cURL を使用して直接 HTTP リクエストを行います。このアクションにより、遅延をバイパスしてタイムアウトを防止できることがあります。このリクエストを行うために必要な情報を収集するには、リクエストオブジェクトの詳細が必要であることに注意してください。
例:
$ curl -H 'Content-Type: ''' -X PUT -d '{ "Status": "SUCCESS",
"PhysicalResourceId": "test-CloudWatchtrigger-1URTEVUHSKSKDFF",
"StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2
",
"RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
"LogicalResourceId": "CloudWatchtrigger"
}' 'https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb
'
リクエストオブジェクトが正しくログに記録されていれば、RequestId と S3 の署名済み URL を CloudWatch Logs で確認できます。詳細については、「CloudFormation で DELETE_FAILED ステータスまたは DELETE_IN_PROGRESS ステータスのままになっている Lambda-backed カスタムリソースを削除する方法を教えてください」を参照してください。
関連情報
CloudFormation を使用して Lambda ベースのカスタムリソースを実装する場合のベストプラクティスを教えてください