web-dev-qa-db-fra.com

Intégration du proxy AWS APIGateway Lambda - Échec de l'exécution en raison d'une erreur de configuration: autorisations non valides sur la fonction Lambda

Je suis relativement nouveau sur AWS et la bête. Après avoir travaillé sur l'intégration d'API Gateway à Lambda proxy, je reçois Execution failed due to configuration error: Invalid permissions on Lambda function

J'ai suivi la configuration ci-dessous référencée à partir de très bien documenté terraform documentation et fait exactement ce dont j'avais besoin. Mais lors des tests sur la console API Gateway donnant l'erreur ci-dessus.

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

Quelques enseignements de l'intégration du proxy Lambda API Gateway

  • API Gateway est déployé en différentes étapes et ARN pour la passerelle API en phase vs sur console de test est quelque peu différent. (au moins c'est ce que j'ai obtenu sur la sortie terraform)

Autant de documentations et de correctifs pour le problème suggèrent de configurer explicitement le chemin détaillé comme "arn:aws:execute-api:region_name:account_id:${aws_api_gateway_rest_api.api_resource.id}/*/*" La source configurée avec l'autorisation d'accès accordée

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

De la documentation de terraform Pour "${aws_api_gateway_deployment.deployment_rsc_name.execution_arn}"

La source configurée avec l'autorisation d'accès accordée est

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

Si vous testez à partir de la console API Gateway, vous vous retrouvez avec la même erreur et devez ajouter manuellement l'autorisation à lambda ou resélectionner le nom de la fonction lambda sur la console d'intégration de méthode (qui fait la même chose). Cela configure 2 passerelles API pour accéder à Lambda. (un avec /stage déployé ARN et autres /*/METHOD/* - used for test console) Lambda console

Mais si vous testez la passerelle API à partir d'ARN de l'environnement de scène sur postman, cela fonctionne aussi bien sans aucune mise à jour manuelle de l'infrastructure construite avec terraform. Et dans la plupart des cas, c'est celui qui compte.

  • Même après avoir corrigé manuellement la première erreur/pas le deuxième défi est Malformed response from lambda

Celui-ci est assez facile et bien documenté. AWS Doc

Tout ce que nous avons à faire est de mettre à jour lambda pour répondre avec un format spécifié.

pour. par exemple. ajouter ci-dessous

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

Une fois qu'il fonctionne de bout en bout, nous pourrions toujours ajouter des scénarios de gestion des erreurs.

Espérons que cela devrait faire gagner du temps aux débutants comme moi.

11
Pat

Donc au lieu d'utiliser:

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

J'utilise la méthode replace pour supprimer le stage_name du execution_arn:

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

Et maintenant tout fonctionne pour moi

0
Steven Yue