如何授予 API 网关通过 CloudFormation 调用 lambda 函数的权限?
How can I grant permission to API Gateway to invoke lambda functions through CloudFormation?
我在网上到处寻找这个问题的答案。
本质上,我们正在使用 Swagger 启动一个 API,它很棒而且效果很好,但有一点行不通......当我们调用一个端点时,我们得到一个500 错误(我们提供的不是 500 错误,它是来自 AWS 的错误)。错误状态 "Execution failed due to configuration error: Invalid permissions on Lambda function"(https://youtu.be/H4LM_jw5zzs <- 这是来自另一个用户的关于我遇到的错误的视频)。
我经历了很多麻烦,找到了答案...它涉及使用 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 版本来说有点阻碍,所以任何帮助都会不胜感激。 :)
这个问题有 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 行)。
对于调用权限:
"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}/*/*/*"
}
}
},
感谢 https://twitter.com/edjgeek 帮助我理清思路。
此 GIST 展示了如何将 AWS::Serverless:Function 与事件一起使用以自动生成所需的 AWS::Lambda::Permission 以允许 APIGateway(对于给定路由)调用您的 Lambda:
https://gist.github.com/rainabba/68df1567cbd0c4930d428c8953dc2316
以下两种方法都假定 api 例如(为了便于阅读省略了许多字段):
MyApi:
Type: 'AWS::Serverless::Api'
Properties:
DefinitionBody:
Fn::Transform:
Name: AWS::Include
Parameters:
Location: openapi.yaml
使用“SAM 事件”
最相关的部分(我省略了很多必填字段):
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
Events:
MyRouteEventToProxy:
Type: Api
Properties:
Method: POST
Path: '/some-route/{pathParm}'
RestApiId: !Ref MyApi # ResourceName of AWS::Serverless::Api
Auth:
Authorizer: NONE
使用“打开api绑定”
如果您更愿意在 openapi.yaml 中声明绑定,请参阅以下项目(不需要 Lambda/Events)。这种方法需要一个明确的角色来允许调用。
template.yaml相关位:
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
# Events: # No need for Events when binding from openapi.yaml
MyHttpApiRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "apigateway.amazonaws.com"
Action:
- "sts:AssumeRole"
openapi.yaml相关位:
paths:
post:
x-amazon-apigateway-integration:
httpMethod: POST
uri:
Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyLambdaFunction.Arn}:live/invocations"
contentHandling: "CONVERT_TO_TEXT"
type: aws_proxy
credentials:
Fn::GetAtt: [MyHttpApiRole, Arn]
https://github.com/aws-samples/sessions-with-aws-sam/tree/master/http-api-direct-integration
我在网上到处寻找这个问题的答案。
本质上,我们正在使用 Swagger 启动一个 API,它很棒而且效果很好,但有一点行不通......当我们调用一个端点时,我们得到一个500 错误(我们提供的不是 500 错误,它是来自 AWS 的错误)。错误状态 "Execution failed due to configuration error: Invalid permissions on Lambda function"(https://youtu.be/H4LM_jw5zzs <- 这是来自另一个用户的关于我遇到的错误的视频)。
我经历了很多麻烦,找到了答案...它涉及使用 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 版本来说有点阻碍,所以任何帮助都会不胜感激。 :)
这个问题有 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 行)。
对于调用权限:
"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}/*/*/*"
}
}
},
感谢 https://twitter.com/edjgeek 帮助我理清思路。
此 GIST 展示了如何将 AWS::Serverless:Function 与事件一起使用以自动生成所需的 AWS::Lambda::Permission 以允许 APIGateway(对于给定路由)调用您的 Lambda:
https://gist.github.com/rainabba/68df1567cbd0c4930d428c8953dc2316
以下两种方法都假定 api 例如(为了便于阅读省略了许多字段):
MyApi:
Type: 'AWS::Serverless::Api'
Properties:
DefinitionBody:
Fn::Transform:
Name: AWS::Include
Parameters:
Location: openapi.yaml
使用“SAM 事件”
最相关的部分(我省略了很多必填字段):
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
Events:
MyRouteEventToProxy:
Type: Api
Properties:
Method: POST
Path: '/some-route/{pathParm}'
RestApiId: !Ref MyApi # ResourceName of AWS::Serverless::Api
Auth:
Authorizer: NONE
使用“打开api绑定”
如果您更愿意在 openapi.yaml 中声明绑定,请参阅以下项目(不需要 Lambda/Events)。这种方法需要一个明确的角色来允许调用。
template.yaml相关位:
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
# Events: # No need for Events when binding from openapi.yaml
MyHttpApiRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "apigateway.amazonaws.com"
Action:
- "sts:AssumeRole"
openapi.yaml相关位:
paths:
post:
x-amazon-apigateway-integration:
httpMethod: POST
uri:
Fn::Sub: "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyLambdaFunction.Arn}:live/invocations"
contentHandling: "CONVERT_TO_TEXT"
type: aws_proxy
credentials:
Fn::GetAtt: [MyHttpApiRole, Arn]
https://github.com/aws-samples/sessions-with-aws-sam/tree/master/http-api-direct-integration