web-dev-qa-db-fra.com

Comment puis-je accorder l'autorisation à API Gateway d'appeler des fonctions lambda via CloudFormation?

J'ai parcouru le Web à la recherche d'une réponse à cela.

Essentiellement, nous faisons tourner une API à l'aide de Swagger, ce qui est génial et fonctionne très bien, mais une chose ne fonctionne pas ... Lorsque nous appelons un point de terminaison, nous obtenons une erreur 500 (ce n'est pas une erreur 500 qui nous fournissons soit un de AWS). L'erreur indique "L'exécution a échoué en raison d'une erreur de configuration: autorisations non valides sur la fonction Lambda" ( https://youtu.be/H4LM_jw5zzs <- Il s'agit d'une vidéo, d'un autre utilisateur, de l'erreur I ' m obtenir).

J'ai descendu de nombreux trous et j'ai trouvé une réponse ... Cela implique d'utiliser l'AWS CLI et ressemble un peu à ceci:

aws lambda add-permission \
--function-name FUNCTION_NAME \
--statement-id STATEMENT_ID \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn "arn:aws:execute-api:us-east-1:ACCOUNT_ID:API_ID/*/METHOD/ENDPOINT"

C'est génial et tout, mais nous utilisons CloudFormation pour tout faire tourner et nous voulons que cela soit automatisé. Existe-t-il un moyen plus simple de procéder? Y a-t-il quelque chose dans CloudFormation qui nous donnera la politique de ressources dont nous avons besoin?

Je heurte un peu le mur avec cela, mais je travaille dessus depuis quelques heures aujourd'hui et c'est un peu un bloqueur pour notre version d'API, donc toute aide serait très appréciée. :)

17
Sam Bantner

Il existe une solution CloudFormation à ce problème. Consultez l'extrait CloudFormation suivant:

"Permission": {
    "Type": "AWS::Lambda::Permission",
    "Properties": {
        "FunctionName": { "Fn::GetAtt": [ "Lambda", "Arn" ] },
        "Action": "lambda:InvokeFunction",
        "Principal": "apigateway.amazonaws.com",
        "SourceArn": { "Fn::Join": [ "", [
            "arn:aws:execute-api:",
            { "Ref": "AWS::Region" }, ":",
            { "Ref": "AWS::AccountId" }, ":",
            { "Ref": "API" },
            "/*/*/*"
        ] ] }
    }
}

Cela accorde API Gateway autorisations pour lancer votre fonction Lambda. Les variables de cet extrait que vous devez modifier sont Lambda (ligne 4) et API (ligne 11).

21
kixorz

Pour les autorisations d'invocation:

    "APIInvokePermission": {
  "Type": "AWS::Lambda::Permission",
  "Properties": {
    "FunctionName": {
      "Ref": "YOUR_LAMBDA_FUNCTION_RESOURCE_NAME"
    },
    "Action": "lambda:InvokeFunction",
    "Principal": "apigateway.amazonaws.com",
    "SourceArn": {
      "Fn::Sub": "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${YOUR_REST_API_RESOURCE_NAME}/*/*/*"
    }
  }
},
1
user6118264