Skip to content

CloudFormation テンプレートまたは OpenAPI 定義を使用して、Lambda 統合で REST API を作成しました。API Gateway が「Execution failed」エラーを返す理由を知りたいです。

所要時間3分
0

AWS CloudFormation テンプレートを使用して、AWS Lambda 統合で Amazon API Gateway REST API を作成しました。その API メソッドを使用して Lambda 関数を呼び出すと、エラーメッセージとステータスコード 500 が表示されます。

簡単な説明

Lambda 統合と API Gateway REST API を併用する場合、その API は、POST HTTP メソッドを使用してバックエンド Lambda 関数を呼び出す必要があります。バックエンド統合リクエストに他の HTTP メソッド (ANYGET など) を使用した場合、呼び出しは失敗します。その場合、API Gateway はエラーを返します。Amazon CloudWatch Logs では次の例のような形式です。

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 msMon 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 に設定されます。

解決策

注: AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI でのエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

AWS CloudFormation 経由ですべてのスタックリソースを管理し、CloudFormation の外部ではスタックリソースの変更は避けることをおすすめします。

バックエンド統合リクエストの HTTP メソッドを POST に変更する方法は、元のテンプレート定義によって異なります。CloudFormation がデプロイした API Gateway を更新するプロセスは、OpenAPI が作成した API Gateway を更新するプロセスとは異なります。

CloudFormation で作成した API Gateway

CloudFormation が作成した API Gateway では、スタックテンプレートを更新する必要があります。CloudFormation テンプレートで AWS::ApiGateway::Method リソースを定義してメソッドを作成した場合は、HttpMethod プロパティを POST に更新します。手順については、「」を参照してください。

メソッドで AWS::ApiGateway::RestAPI リソースの Body プロパティに OpenAPI の定義を使用している場合は、API 定義ファイルの httpMethodPOST に設定します。手順については、x-amazon-apigateway-integration object を参照してください。GitHub リポジトリ aws-samples にある Swagger テンプレートの例も参照してください。

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

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

    "httpMethod" : "POST"

CloudFormation の外部で作成した API Gateway

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

次の手順を実行します。

  1. API Gateway コンソールを開きます。
  2. 該当する API を選択します。
  3. [リソース] で Lambda と統合されている HTTP メソッドを選択します。
  4. [メソッド実行][統合リクエスト] を選択します。
  5. [統合リクエスト][HTTP メソッド] で Lambda 関数名を編集します。
  6. Lambda 関数にアクセス許可を追加するように求められたら、[OK] を選択します。
  7. API をデプロイします。
  8. (オプション) Lambda と統合されている HTTP メソッドをテストします。

注: [Lambda 関数にアクセス許可を追加] プロンプトで [OK] を選択するたびに、コンソールは Lambda 関数のリソースポリシーに新しいステートメントを追加します。リソースポリシーのサイズ制限を超えないようにしてください。詳細については、「関数の設定、デプロイ、実行」および「API Gateway コンソールを使用して API 統合リクエストを設定する」を参照してください。

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

次の手順を実行します。

  1. 統合の HTTP メソッドを POST に更新するには、put-integration コマンドを実行します。

    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 用に設定したリソースを既存のステージにデプロイするには、create-deployment コマンドを実行します。

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

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

次の手順を実行します。

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

関連情報

AWS::ApiGateway::Method 統合

チュートリアル: 2 つの AWS サービス統合と 1 つの Lambda 非プロキシ統合を含む calculator REST API を作成する

ステージ変数を使用して API Gateway で Lambda 統合を定義しました。API メソッドの呼び出し時に Internal server エラーが発生し、500 ステータスコードが表示される理由を知りたいです

Lambda プロキシ統合で API Gateway REST API が返す HTTP 502 エラーの解決方法を教えてください

API Gateway で発生する「Invalid mapping expression specified」エラーを解決する方法を教えてください

コメントはありません

関連するコンテンツ