38

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

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

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

修复:转到 API Gateway > 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"
            }
          }
        }
      }
    },
4

10 回答 10

24

您可能在权限配置中遇到问题,这就是 API 无法调用您的 lambda 的原因。尝试从以下示例中显式添加对您的 lambda 的 template.yaml 文件权限invokeapigatewayprincipal

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

这是SAM github repo中报告的问题以供完整参考,这里是hello SAM 项目的示例

如果您想通过 AWS CLI 添加权限以进行测试,您可能需要使用aws lambda add-permission. 请访问官方文档网站了解更多详细信息。

于 2020-01-15T01:48:14.880 回答
16

我有一个类似的问题 - 我删除然后重新安装了一个 lambda 函数。我的 API 网关仍然指向旧的,所以我必须进入 API 网关并更改我的资源方法以更改集成请求设置以指向新的(它可能看起来指向正确的但不是不是在我的情况下)

于 2020-01-07T14:05:47.440 回答
7

我遇到了同样的问题,但我是通过 Terraform 进行部署的。根据其他用户的建议,我在 API Gateway 的集成部分重新选择了我的 Lambda 函数,然后检查了我的 Lambda 权限发生了什么变化。结果我需要在我的 Lambda 资源中的 API Gateway 触发器的 source_arn 部分中添加一个“*”。不确定 SAM 与 Terraform 相比如何,但也许您可以更改阶段名称或尝试我尝试过的这种故障排除技术。

我的 SO 发布:通过 terraform 部署的 AWS API Gateway 和 Lambda 函数——由于配置错误,执行失败:Lambda 函数的权限无效

于 2019-02-25T14:49:48.123 回答
5

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

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

该问题是由于删除 lambda 上的 ALIAS“测试”并在另一个版本上重新创建它(发布后)引起的。似乎 API 网关内部仍然链接到“旧”ALIAS实例。你会期望这场比赛纯粹是在名字上完成的......

奖励:因此,您无法通过 AWS 控制台移动该别名,但您可以通过 AWS CLI 使用以下命令执行此操作:

aws lambda --profile <YOUR_PROFILE> update-alias --function-name <FUNCTION_NAME> --name <ALIAS_NAME> --function-version <VERSION_NUMBER>
于 2020-05-19T20:38:01.683 回答
2

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

因此,首先我通过API Gateway 控制台并在集成请求下- 为 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"
于 2020-09-15T06:51:16.520 回答
2

我遇到过同样的问题。我先把集成改为mock,即将集成类型取消设置为Lambda,部署一次后,再次将集成类型设置为lambda。此后它完美无缺。

我希望它有所帮助。

于 2020-05-31T08:30:06.973 回答
1

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

于 2020-05-21T05:47:17.783 回答
0

我遇到了类似的问题,并且正在使用 Terraform。它需要包含“POST”的策略。由于某种原因 /*/ (通配符)策略不起作用?

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

非常感谢以上所有。

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

    {
      "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}"
    }
于 2020-05-20T19:22:28.977 回答
0

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

于 2021-07-13T01:52:28.890 回答
0

看起来“由于配置错误而导致执行失败:Lambda 函数的权限无效”是多方面的综合:D

我使用 CloudFormation 模板部署了一个堆栈并遇到了这个问题。

我在片段使用了舞台名称。SourceArnAWS::Lambda::Permission

当我将其更改为*AWS 时,对原因更加明确,在我的情况下,这恰好是该部分中的无效Handler引用(我使用的是 Java,处理程序已移动包)AWS::Lambda::Function

此外,当我点击我的 API GW 时,我收到了这条消息

{
    "message": "Internal server error"
}

只有当我在控制台并通过有效负载发送作为对资源的测试时,我才收到权限错误。

如果我在配置 API GW 时检查 Cloudwatch 日志,它确实提到了真正的原因,即使阶段名称是明确的。

Lambda execution failed with status 200 due to customer function error: No public method named ...

于 2022-01-14T01:05:48.450 回答