web-dev-qa-db-fra.com

L'exécution a échoué en raison d'une erreur de configuration: autorisations non valides sur la fonction Lambda

Je construis une application sans serveur utilisant AWS Lambda et API Gateway via Visual Studio. Je travaille dans C # et utilise le modèle d'application sans serveur (SAM) afin de déployer mon API. Je construis le code dans Visual Studio, puis déployez via Publish à Lambda. Cela fonctionne, sauf chaque fois que je fais une nouvelle construction et essayez d'exécuter un appel d'API, je reçois cette erreur:

EXACTION a échoué en raison d'une erreur de configuration: autorisations non valides sur la fonction Lambda

Faire des recherches, j'ai trouvé ce correctif mentionné ailleurs (à faire via la console AWS):

Correction: allé à API Gateway> Nom de l'API> Ressources> Nom de la ressource> Méthode> Demande d'intégration> Lambda Fonction et renvoyé ma fonction existante, avant de "sauver" avec la petite coche.

Maintenant, cela fonctionne pour moi, mais il brise l'automatisation de l'utilisation du serveur.Template (JSON) pour construire mon API. Est-ce que quelqu'un sait comment résoudre ce problème dans le fichier Server.Template? Pour que je n'ai pas besoin de prendre des mesures dans la console pour résoudre? Voici un échantillon de l'une de mes méthodes à partir du fichier Server.Template

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Transform" : "AWS::Serverless-2016-10-31",
  "Description" : "An AWS Serverless Application.",

  "Resources" : {

    "Get" : {
      "Type" : "AWS::Serverless::Function",
      "Properties": {
        "VpcConfig":{
          "SecurityGroupIds" : ["sg-111a1476"],
          "SubnetIds" : [ "subnet-3029a769","subnet-5ec0b928"]
        },
        "Handler": "AWSServerlessInSiteDataGw::AWSServerlessInSiteDataGw.Functions::Get",
        "Runtime": "dotnetcore2.0",
        "CodeUri": "",
        "MemorySize": 256,
        "Timeout": 30,
        "Role": null,
        "Policies": [ "AWSLambdaBasicExecutionRole","AWSLambdaVPCAccessExecutionRole","AmazonSSMFullAccess"],
        "Events": {
          "PutResource": {
            "Type": "Api",
            "Properties": {
              "Path": "/",
              "Method": "GET"
            }
          }
        }
      }
    },
16
JamesMatson

J'avais le même problème, mais je me suis déployé sur Terraform. Après une suggestion d'un autre utilisateur, j'ai redéligé ma fonction Lambda dans la partie intégration de la passerelle API, puis vérifiait ce qui a changé dans mes autorisations de Lambda. S'avère que je devais ajouter un "*" où je mettais le nom de scène dans la section Source_arn du déclencheur de la passerelle API dans ma ressource Lambda. Je ne sais pas comment SAM se compare à Terraform mais peut-être que vous pouvez modifier le nom de la scène ou essayez simplement cette technique de dépannage que j'ai essayé.

Mon SO POSTATION: Fonction AWS API et Lambda Fonction déployée via Terraform - Exécution a échoué en raison d'une erreur de configuration: autorisations non valides sur la fonction Lambda

1
transposeglobal

Vous pouvez avoir un problème dans la configuration de permission, c'est pourquoi API ne pouvait pas appeler votre Lambda. Essayez de explicitement Ajouter au modèle.YAML Fichier invoke Permission de votre Lambda à partir de apigateway en tant que principal Voici un exemple ci-dessous:

  ConfigLambdaPermission:
    Type: "AWS::Lambda::Permission"
    DependsOn:
    - MyApiName
    - MyLambdaFunctionName
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !Ref MyLambdaFunctionName
      Principal: apigateway.amazonaws.com

Voici la question qui a été rapportée dans Sam GitHub Repo pour une référence complète et voici un exemple du projet Hello Sam

Si vous souhaitez ajouter une autorisation par AWS CLI pour avoir testé les choses, vous voudrez peut-être utiliser aws lambda add-permission. S'il vous plaît visitez Site officiel de la documentation Pour plus de détails.

1
Muhammad Soliman

J'ai eu un problème similaire - j'ai supprimé puis réinstallé une fonction Lambda. Ma passerelle API portait toujours à l'ancien, alors je devais entrer dans la passerelle de l'API et modifier mes méthodes de ressource pour modifier le paramètre de demande d'intégration à pointer vers le nouveau (on peut sembler en pointe vers la bonne mais 't dans mon cas)

1
Liam

J'ai eu le même problème que j'ai supprimé puis j'ai créé la pile et cela a fonctionné.

0
T. Cervenka

Face au même problème, j'ai trouvé le problème est que la passerelle API n'est pas capable d'appeler la fonction Lambda car je ne pouvais pas voir des journaux CloudWatch pour la fonction Lambda.

Donc, tout d'abord, j'ai traversé Console de la passerelle API et sous la (demande d'intégration - a donné l'ARN complet pour la fonction Lambda. et il commence à travailler.

Deuxièmement, à travers le cloudformation

x-Amazon-apigateway-integration:
        credentials:
          Fn::Sub: "${ApiGatewayLambdaRole.Arn}"
        type: "aws"
        uri:
          Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${lambda_function.Arn}/invocations"
0
DHEERAJ

J'ai eu le même problème. J'ai changé l'intégration en simulacteur d'abord, c'est-à-dire désapprouver le type d'intégration à Lambda, puis après un déploiement, définissez à nouveau le type d'intégration sur Lambda. Cela a fonctionné parfaitement par la suite.

J'espère que ça vous aide.

0
Dikshit Kathuria