CloudFormation テンプレートまたは OpenAPI 定義を使用して Lambda 統合で REST API を作成した後、API Gateway から「Execution failed due to configuration」(設定エラーのため実行に失敗しました) というエラーが発生するのはなぜですか?

最終更新日: 2022 年 5 月 4 日

AWS CloudFormation テンプレートまたは OpenAPI の定義を使用して、AWS Lambda 統合による Amazon API Gateway REST API を作成しました。API メソッドを使用して Lambda 関数を呼び出そうとすると、「設定エラーのため実行に失敗しました」というエラーメッセージと 500 ステータスコードが表示されます。 エラーの原因は何ですか? また、問題のトラブルシューティング方法を教えてください。

簡単な説明

Lambda 統合を使用した API Gateway REST APIがある場合、API は HTTP メソッド POST を使用してバックエンド Lambda 関数を呼び出す必要があります。バックエンド統合リクエストに他の HTTP メソッド (例えば、[ANY] や [GET]) を使用すると、呼び出しは失敗します。API Gateway は、Amazon CloudWatch Logs に次の例のようなエラーメッセージを返します。

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 ms
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response headers: {Date=Mon, 14 Oct 2019 14:08:49 GMT, Content-Length=130, Connection=keep-alive, x-amzn-RequestId=abc1d2ef-34ab-56c7-de8f-90123a456789}
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response body before transformations: <AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
Mon Oct 14 14:08:49 UTC 2019 : Lambda invocation failed with status: 403. Lambda request id: abc1d2ef-34ab-56c7-de8f-90123a456789
Mon Oct 14 14:08:49 UTC 2019 : Execution failed due to configuration error:
Mon Oct 14 14:08:49 UTC 2019 : Method completed with status: 500

注: REST API のフロントエンドには任意の HTTP メソッドを設定できます。

以下のいずれかを使用して Lambda 統合で REST API を作成する場合は、バックエンド統合リクエストの POST メソッドを指定する必要があります。

注: API Gateway コンソールを使用して Lambda 統合を設定すると、バックエンド統合リクエストは自動的に POST に設定されます。

解決方法

CloudFormation のベストプラクティスは、AWS CloudFormation を介してすべてのスタックリソースを管理することであり、CloudFormation の外部でスタックリソースを変更しないことです。

バックエンド統合リクエストについて HTTP メソッドを POST に変更するために使用されるメソッドは、元のテンプレート定義によって異なります。例えば、CloudFormation を使用してデプロイされた API Gateway を更新するプロセスと、OpenAPI または AWS CLI で作成された API Gateway を更新するプロセスは異なります。

CloudFormation を使用して作成された API Gateway の統合のリクエストメソッドを POST に変更するには

手順については、「スタックテンプレートの変更」を参照してください。

A.CloudFormation テンプレートで AWS::ApiGateway::Method リソースを定義してメソッドが作成された場合は、[HttpMethod] プロパティを [POST] に更新します。手順については、AWS::ApiGateway::Method ドキュメントの「Examples」(例) セクションを参照してください。

B.メソッドに AWS::ApiGateway::RestAPI リソースの [Body] (本文) プロパティの値として OpenAPI 定義が含まれている場合: API 定義ファイルの [httpMethod] プロパティ値を [POST] に設定します。  手順については、「x-amazon-apigateway-integration オブジェクト」および aws-samples GitHub リポジトリの「example Swagger template」を参照してください。

編集したテンプレートで AWS CloudFormation スタックの更新を実行して、API を更新します。

"x-amazon-apigateway-integration" : {
    "type" : "aws",

    "httpMethod" : "POST"

CloudFormation の外部で作成された API Gateway のバックエンド統合の HTTP メソッドを POST に変更するには

コンソールを使用してメソッドを更新する

  1. API Gateway コンソールで、API を選択します。
  2. [リソース] ペインで、Lambda 統合を含む HTTP メソッドを選択します。
  3. [Method Execution] (メソッドの実行) ペインで、[Integration Request] (統合リクエスト) を選択します。
  4. [Integration Request] (統合リクエスト) ペインの [HTTP method] (HTTP メソッド) で、関数名の右側にある鉛筆アイコンをクリックして Lambda 関数名を編集し、右側に表示されるチェックマークアイコンをクリックします。
  5. [Add Permission to Lambda Function] (Lambda 関数に許可を追加) プロンプトが表示されたら、[OK] を選択します。
  6. API をデプロイします
  7. (オプション) Lambda 統合を含む HTTP メソッドをテストします。

注: コンソールは、[Add Permission to Lambda Function] (Lambda 関数に許可を追加) プロンプトで [OK] を選択するたびに、新しいステートメントを Lambda 関数のリソースポリシーに追加します。リソースポリシーのサイズ制限に達しないよう、関数のリソースポリシーのサイズに留意します。参照:「関数の設定、デプロイ、実行」。

詳細については、「API Gateway の開始方法」および「API Gateway コンソールを使用して API 統合リクエストを設定する」を参照してください。

AWS CLI を使用してメソッドを更新する

  1. put-integration メソッドを実行して、統合 http メソッドを [POST] に更新します。
aws apigateway put-integration \
--rest-api-id 1234123412 \
--resource-id a1b2c3 \
--http-method ANY \
--type AWS \
--integration-http-method POST \
--uri 'arn:aws:apigateway:us-west-2:lambda:path//2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:function_name/invocations

2.API 用に設定されたリソースを既存のステージにデプロイします。

aws apigateway create-deployment \
--rest-api-id 1234123412 \
--stage-name dev \
--description 'Deployment to an existing dev stage'

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

OpenAPI 定義インポートを使用してメソッドを更新する

  1. API 定義ファイルの [httpMethod] プロパティ値を [POST] に設定します。手順については、「x-amazon-apigateway-integration オブジェクト」および aws-samples GitHub リポジトリの「example Swagger template」を参照してください。
  2. 編集した API 定義ファイルを API Gateway にインポートし、API を更新します。「OpenAPI ファイルをインポートして既存の API 定義を更新する」を参照してください。