スキップしてコンテンツを表示

CloudFormation のカスタムリソースに関する障害をトラブルシューティングする方法を教えてください。

所要時間2分
0

AWS CloudFormation のカスタムリソースで発生するエラーを解決したいです。

簡単な説明

カスタムリソースの障害は、リソースに関連付けられた AWS Lambda 関数の実行時に問題が起こった場合に発生します。その後、カスタムリソースは CloudFormation に FAILED ステータスを送信します。

CloudFormation が想定した期間内にカスタムリソースからの応答を受信せず、タイムアウトした場合も、カスタムリソースに障害が発生する可能性があります。

カスタムリソースの問題をトラブルシューティングするには、AWSSupport-TroubleshootCFNCustomResource ランブックを実行するか、CloudFormation スタックを手動でトラブルシューティングします。

Lambda カスタムリソースに対し、ランブックは Lambda が Amazon Simple Storage Service (Amazon S3) に到達し、CloudFormation に応答を送信していることを確認します。CloudFormation への応答では、Lambda のネットワーク設定とセキュリティグループを確認します。

解決策

AWSSupport-TroubleshootCFNCustomResource ランブックを実行する

開始する前に、AWS Identity and Access Management (IAM) ユーザーまたはロールに必要な IAM アクセス許可があることを確認してください。

オートメーションを実行するには、次の手順を実行します。

  1. AWS Systems Manager コンソールを開きます。
  2. ナビゲーションペインで [ドキュメント] を選択します。
  3. 検索バーに AWSSupport-TroubleshootCfnCustomResource と入力します。
  4. AWSSupport-TroubleshootCfnCustomResource ドキュメントを選択します。
  5. [オートメーションの実行] を選択します。
  6. 入力パラメータに次の情報を入力します。
    (オプション) AutomationAssumeRoleAWS Systems Manager の機能である Automation が、ユーザーに代わってアクションを実行することを許可する IAM ロールの ARN を入力します。ロールを指定しない場合、Automation はランブックを起動したユーザーのアクセス許可を使用します。
    StackNameカスタムリソースの障害が発生した CloudFormation スタックの名前を入力します。
  7. [実行] を選択します。
  8. [出力] セクションで、次の詳細結果を確認します。
    validateCloudFormationStack ステップは、CloudFormation スタックが同じ AWS アカウントと AWS リージョンに配置されていることを確認します。
    checkCustomResource ステップは、CloudFormation スタックを分析し、障害が発生したカスタムリソースをチェックし、障害が発生したカスタムリソースのトラブルシューティング方法に関する情報を提供します。

CloudFormation スタックを手動でトラブルシューティングする

Amazon CloudWatch ログを確認する

次の手順を実行します。

  1. CloudFormation コンソールを開きます。
  2. 障害が発生したスタックを選択した後、[リソース] タブを選択し、カスタムリソースに関連付けられている Lambda 関数の物理 ID を取得します。
  3. 該当する Lambda 関数を選択します。
  4. [監視] タブを選択し、[CloudWatch ログを表示] を選択します。

CloudFormation のロールバック中に Lambda 関数が削除された場合、ロググループにはまだ CloudWatch ログが含まれている可能性があります。

ログを取得するには、次の手順を実行します。

  1. CloudWatch コンソールを開きます。
  2. ナビゲーションペインで [ロググループ] を選択します。
  3. 検索フィールドで次のコマンドを実行します。
    /aws/lambda/LambdaPhysicalName

注: LambdaPhysicalName は、実際の Lambda 関数名に置き換えます。

ログが見つからない場合は、ロールバック機能を無効化してスタックを再デプロイしてから、Lambda 関数の動作をトラブルシューティングします。

障害の潜在的原因のトラブルシューティング

FAILED ステータスを解決する

次のエラーメッセージが表示される場合があります。

Received response status FAILED from custom resource.Message returned: <reason here>.

上記のエラーメッセージは、カスタムリソースに関連付けられている Lambda 関数で問題が発生し、例外処理ロジックが発生した場合に表示されます。

この問題をトラブルシューティングするには、エラーメッセージと Lambda の CloudWatch ログに含まれる障害の理由を確認してください。

CloudFormation が応答を受信していない

CloudFormation がカスタムリソースからの応答を受信していないことが原因で、スタックで障害が発生します。

この問題を解決するには、次の手順を実行します。

  • カスタムリソースの Lambda 関数で、cfn-response module を適切に使用して CloudFormation スタックに応答を送信していることを確認します。

  • CloudWatch ログを確認し、コードの実行時にエラーが発生するかどうかを判断します。

  • Lambda 関数のタイムアウト設定を増やすことで、関数がタスクを完了するのに十分な時間を確保できるようにします。設定できる最大時間は 15 分です。

  • Lambda 関数が仮想プライベートクラウド (VPC) 内にある場合は、サブネット内にあることを確認します。サブネットは、NAT ゲートウェイ経由のアウトバウンドトラフィックを許可する必要があります。カスタムリソースが署名済みの Amazon S3 URL にアクセスするために、サブネットには Amazon S3 エンドポイントアクセスへのルーティングも必要です。

  • タイムアウト後に応答が送信された場合は、Lambda メトリクスで同じリージョンで多数の同時関数が実行されているかどうかを確認します。タイムアウトを減らすには、関数用に予約された同時実行数を使用します。

  • カスタムリソースがタイムアウトするまでスタックが IN PROGRESS ステータスのままである場合は、cURL を使用して直接 HTTP リクエストを行います。直接リクエストを行うことで、タイムアウトを回避できる可能性があります。
    curl コマンドの例

    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 と Amazon S3 の事前署名済み URL は、CloudWatch ログで確認できます。詳細については、「CloudFormation で DELETE_FAILED ステータスまたは DELETE_IN_PROGRESS ステータスのままになっている Lambda-backed カスタムリソースを削除する方法を教えてください」を参照してください。

関連情報

シンプルなオートメーションを実行する (コンソール)

オートメーションを設定する

Systems Manager Automation ランブックのリファレンス

CloudFormation を使用して Lambda ベースのカスタムリソースを実装するためのベストプラクティスを教えてください

コメントはありません