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 メソッドを指定する必要があります。
- CloudFormation テンプレート
- OpenAPI 定義
- AWS Command Line Interface (AWS CLI)
- ソフトウェア開発キット (SDK)
- Cloud Development Kit (CDK)
注: 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 に変更するには
コンソールを使用してメソッドを更新する
- API Gateway コンソールで、API を選択します。
- [リソース] ペインで、Lambda 統合を含む HTTP メソッドを選択します。
- [Method Execution] (メソッドの実行) ペインで、[Integration Request] (統合リクエスト) を選択します。
- [Integration Request] (統合リクエスト) ペインの [HTTP method] (HTTP メソッド) で、関数名の右側にある鉛筆アイコンをクリックして Lambda 関数名を編集し、右側に表示されるチェックマークアイコンをクリックします。
- [Add Permission to Lambda Function] (Lambda 関数に許可を追加) プロンプトが表示されたら、[OK] を選択します。
- API をデプロイします。
- (オプション) Lambda 統合を含む HTTP メソッドをテストします。
注: コンソールは、[Add Permission to Lambda Function] (Lambda 関数に許可を追加) プロンプトで [OK] を選択するたびに、新しいステートメントを Lambda 関数のリソースポリシーに追加します。リソースポリシーのサイズ制限に達しないよう、関数のリソースポリシーのサイズに留意します。参照:「関数の設定、デプロイ、実行」。
詳細については、「API Gateway の開始方法」および「API Gateway コンソールを使用して API 統合リクエストを設定する」を参照してください。
AWS CLI を使用してメソッドを更新する
- 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 定義インポートを使用してメソッドを更新する
- API 定義ファイルの [httpMethod] プロパティ値を [POST] に設定します。手順については、「x-amazon-apigateway-integration オブジェクト」および aws-samples GitHub リポジトリの「example Swagger template」を参照してください。
- 編集した API 定義ファイルを API Gateway にインポートし、API を更新します。「OpenAPI ファイルをインポートして既存の API 定義を更新する」を参照してください。