web-dev-qa-db-ja.com

AWS APIGateway Lambdaプロキシ統合-構成エラーのため実行に失敗しました:Lambda関数の無効なアクセス許可

AWSと獣には比較的新しいです。 API GatewayからLambdaプロキシへの統合に取り組んだ後、Execution failed due to configuration error: Invalid permissions on Lambda function

私は本当によく文書化されたterraform documentationそして私に必要なことを正確に行います。しかし、API Gatewayコンソールでテストしているときに上記のエラーが発生します。

resource "aws_lambda_permission" "apigw" {
    statement_id  = "AllowAPIGatewayInvoke"
    action        = "lambda:InvokeFunction"
    function_name = "${aws_lambda_function.resource_name.arn}"
    principal     = "apigateway.amazonaws.com"

    # The /*/* portion grants access from any method on any resource
    # within the API Gateway "REST API".
    source_arn = "${aws_api_gateway_deployment.resource_name_of_deployment.execution_arn}/*/*"
  }
9
Pat

API Gateway Lambdaプロキシ統合からの学び

  • API Gatewayはさまざまなステージでデプロイされ、APIゲートウェイのARNはステージとテストコンソールで多少異なります。 (少なくとも私がテラフォーム出力で得たものです)

問題の多くのドキュメントと修正により、詳細パスを"arn:aws:execute-api:region_name:account_id:${aws_api_gateway_rest_api.api_resource.id}/*/*"として明示的に構成することが推奨されます

 arn:aws:execute-api:region:accountid:fu349z93pa/*/*

Terraformドキュメントから"${aws_api_gateway_deployment.deployment_rsc_name.execution_arn}"

アクセス許可が付与された構成済みソースは

arn:aws:execute-api:region:accountid:fu349z93pa/stage/*/*

API Gatewayコンソールからテストすると、同じエラーが発生し、ラムダへの権限を手動で追加するか、メソッド統合コンソールでラムダ関数名を再選択する必要があります(同じことを行います)。これにより、2つのAPIゲートウェイがLambdaにアクセスするように構成されます。 (/stageがデプロイされたARNと他の/*/METHOD/*-used for test consoleを含むもの) Lambda console

しかし、postmanのステージ環境のARNからAPIゲートウェイをテストすると、Teraformで構築されたインフラストラクチャを手動で更新しなくても同じように機能します。そして、ほとんどの場合、それが問題になります。

  • 最初のエラーを手動で修正した後でも、2番目の課題はMalformed response from lambdaではありません

これはかなり簡単で、十分に文書化されています。 AWSドキュメント

指定するフォーマットで応答するようにラムダを更新するだけです。

ために。例えば以下に追加

callback(null, { "statusCode": 200, "body" : JSON.stringify(sampleResponseJSON) }); on lambda `js`

エンドツーエンドで機能するようになったら、いつでもエラー処理シナリオを追加できます。

うまくいけば、これは私のような初心者のためのいくつかの時間を節約するはずです。

11
Pat

だから代わりに:

resource "aws_lambda_permission" "apigw" {
    ... ...
    source_arn = "${aws_api_gateway_deployment.resource_name_of_deployment.execution_arn}/*/*"
}

replaceメソッドを使用してstage_nameexecution_arnから削除します。

resource "aws_lambda_permission" "apigw" {
    ... ...
    source_arn = "${replace(aws_api_gateway_deployment.resource_name_of_deployment.execution_arn, var.stage_name, "")}*/*"
}

そして今、すべてが私のために働きます

0
Steven Yue