3

我一直在网络搜索这个答案。从本质上讲,我们使用Swagger旋转了一个API,这很棒,并且效果很好,但是有一件事情是行不通的......当我们调用一个Endpoint时,我们得到一个500错误(这不是我们提供的这个500错误是来自AWS的错误)。错误状态为“由于配置错误导致执行失败:Lambda函数的权限无效”(https://youtu.be/H4LM_jw5zzs < - 这是来自其他用户的视频,是我收到的错误)。如何授予API网关通过CloudFormation调用lambda函数的权限?

我已经走了许多ratholes,并且已经找到了答案......这涉及到使用AWS CLI,看起来有点像这样:

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" 

这是伟大的,所有的,但我们使用CloudFormation旋转一切,我们希望这是自动化的。有没有更简单的方法来解决这个问题? CloudFormation中是否有某些内容会给我们提供我们需要的资源策略?

我对此有点触目惊心,但今天我一直在为它工作几个小时,这对我们的API版本有点阻碍,所以任何帮助都将不胜感激。 :)

+0

难道我的回答可以帮助您?如果是这样,你能接受并赞成吗?谢谢! – kixorz

+0

对于它的价值,您也可以通过AWS SDK来实现。我将它用于Go,所以它在这里:http://docs.aws.amazon.com/sdk-for-go/api/service/lambda/#Lambda.AddPermission ...我看不到有什么方法列出现有权限。所以我只是容忍我的部署工具中已经存在的错误。奇怪的。我的意思是我什至都没有看到需要这个权限的任何东西,也没有在任何导出的Swagger中。 – Tom

回答

5

有一个CloudFormation解决此问题。请参阅以下CloudFormation片段:

"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" }, 
      "/*/*/*" 
     ] ] } 
    } 
} 

这将授予API Gateway权限启动您Lambda功能。这段代码中需要更改的变量是Lambda(第4行)和API(第11行)。

0

您可以使用具有AWS :: Lambda :: Permission的CloudFormation模板来执行此操作。更多详情here

0

对于调用权限:

"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}/*/*/*" 
    } 
    } 
},