由于配置错误,执行失败:Lambda函数的权限无效

时间:2019-01-07 00:29:23

标签: aws-lambda aws-api-gateway serverless-application-model

我正在通过Visual Studio使用AWS Lambda和API网关构建无服务器应用程序。我正在C#中工作,并使用无服务器应用程序模型(SAM)来部署我的API。我在Visual Studio中构建代码,然后通过发布到Lambda进行部署。这是可行的,除了每次我进行新的构建并尝试执行API调用时,都会收到此错误:

由于配置错误,执行失败:Lambda函数的权限无效

做一些研究后,我发现此修复已在其他地方提到(通过AWS控制台完成):

修复:转到“ API网关”>“ API名称”>“资源”>“资源名称”>“方法”>“集成请求”>“ Lambda函数”并重新选择我现有的函数,然后用小勾号“保存”。

现在这对我有用,但是它破坏了使用serverless.template(JSON)来构建我的API的自动化。有谁知道如何在serverless.template文件中解决此问题?这样我就无需在控制台中采取任何措施来解决?这是来自serverless.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"
            }
          }
        }
      }
    },

9 个答案:

答案 0 :(得分:9)

您可能在权限配置中遇到了问题,这就是API无法调用您的lambda的原因。尝试明确地invoke的形式向{。

apigateway

以下是SAM github repo中报告的问题,以供完全参考,这是一个example的Hello SAM项目

如果您想通过AWS CLI添加权限以进行测试,则可能要使用principal。请访问official documentation website了解更多详情。

答案 1 :(得分:8)

我有一个类似的问题-我删除了,然后重新安装了lambda函数。我的API网关仍然指向旧的API,因此我不得不进入API网关并更改“资源方法”以更改“集成请求”设置以指向新的API(它似乎指向正确的API,但没有就我而言)

答案 2 :(得分:3)

相同的错误,解决方案很简单:在API网关的集成设置中再次清除并应用“ Lambda函数”映射。

我的映射如下所示:MyFunction-894AR653OJX:test,其中“ test”是指向我的lambda的正确版本的别名

该问题是由于在lambda上删除了ALIAS“测试”,然后在另一个版本上(在发布之后)重新创建的。看来,API网关内部仍旧链接到“旧” ALIAS 实例。 您可能希望完全按照名称进行匹配...

奖金:因此,无法通过AWS控制台移动该ALIAS,但是可以使用以下命令通过AWS CLI进行此操作:

aws lambda --profile <YOUR_PROFILE> update-alias --function-name <FUNCTION_NAME> --name <ALIAS_NAME> --function-version <VERSION_NUMBER>

答案 3 :(得分:1)

我遇到了同样的问题,但是我正在通过Terraform进行部署。在收到另一个用户的建议后,我在API网关的“集成”部分中重新选择了Lambda函数,然后检查了Lambda权限中发生了什么变化。事实证明,我需要在Lambda资源中的API Gateway触发器的source_arn部分中放置阶段名称的地方添加一个“ *”。不知道SAM与Terraform相比如何,但是也许您可以更改阶段名称,或者只是尝试我尝试过的这种故障排除技术。

我的SO发布:AWS API Gateway and Lambda function deployed through terraform -- Execution failed due to configuration error: Invalid permissions on Lambda function

答案 4 :(得分:0)

我有一个类似的问题,并且正在使用Terraform。它需要其中带有“ POST”的策略。出于某种原因,/ * /(通配符)策略不起作用?

这是我用来解决此问题的策略和示例地形。

非常感谢以上所有内容。

这是我的Lambda函数策略JSON的样子和地形:

    {
      "Version": "2012-10-17",
      "Id": "default",
      "Statement": [
        {
          "Sid": "AllowAPIGatewayInvoke",
          "Effect": "Allow",
          "Principal": {
            "Service": "apigateway.amazonaws.com"
          },
          "Action": "lambda:InvokeFunction",
          "Resource": "arn:aws:lambda:us-east-1:999999999999:function:MY-APP",
          "Condition": {
            "ArnLike": {
              "AWS:SourceArn": "arn:aws:execute-api:us-east-1:999999999999:d85kyq3jx3/test/*/MY-APP"
            }
          }
        },
        {
          "Sid": "e841fc76-c755-43b5-bd2c-53edf052cb3e",
          "Effect": "Allow",
          "Principal": {
            "Service": "apigateway.amazonaws.com"
          },
          "Action": "lambda:InvokeFunction",
          "Resource": "arn:aws:lambda:us-east-1:999999999999:function:MY-APP",
          "Condition": {
            "ArnLike": {
              "AWS:SourceArn": "arn:aws:execute-api:us-east-1:999999999999:d85kyq3jx3/*/POST/MY-APP"
            }
          }
        }
      ]
    }

    add in a terraform like this:


    //************************************************
    // allows you to read in the ARN and parse out needed info, like region, and account
    //************************************************
    data "aws_arn" "api_gw_deployment_arn" {
        arn = aws_api_gateway_deployment.MY-APP_deployment.execution_arn 
    }

    //************************************************
    // Add in this to support API GW testing in AWS Console.
    //************************************************
    resource "aws_lambda_permission" "apigw-post" {
        statement_id  = "AllowAPIGatewayInvokePOST"
        action        = "lambda:InvokeFunction"
        //function_name = aws_lambda_function.lambda-MY-APP.arn
        function_name = module.lambda.function_name
        principal     = "apigateway.amazonaws.com"

        // "arn:aws:execute-api:us-east-1:473097069755:708lig5xuc/dev/POST1/cloudability-church-ws"
        source_arn = "arn:aws:execute-api:${data.aws_arn.api_gw_deployment_arn.region}:${data.aws_arn.api_gw_deployment_arn.account}:${aws_api_gateway_deployment.MY-APP_deployment.rest_api_id}/*/POST/${var.api_gateway_root_path}"
    }

答案 5 :(得分:0)

我遇到了同样的问题,所以我删除了然后创建了堆栈,然后它起作用了。

答案 6 :(得分:0)

我有同样的问题。我将集成更改为模拟,即将集成类型设置为Lambda,然后在进行一次部署后将集成类型再次设置为Lambda。此后,它完美地工作了。

我希望这会有所帮助。

答案 7 :(得分:0)

面对相同的问题,我发现问题是:API网关无法调用Lambda函数,因为我看不到lambda函数的任何CloudWatch日志。

因此,我首先浏览了 API网关控制台,并在集成请求下-给出了Lambda函数的完整ARN。并且开始工作。

第二,通过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"

答案 8 :(得分:0)

AWS lambda 资源权限的文档显示了可以过滤或通配符 /*/*/* 的 3 个访问级别,记录为 $stage/$method/$path。但是,他们的示例和大多数在线示例仅使用 2 个级别,而我仅使用 3 个级别就将头撞在墙上,结果拒绝访问。我更改为 2 个级别,然后 lambda 创建了触发器。希望这可以避免有人将计算机扔到墙上。