我正在尝试构建一个CFT,该CFT创建一个Lambda函数和一个API,并将两者集成在一起。我目前可以创建Lambda函数和API,但无法集成它们。
我考虑过使用AWS:Lambda:Permission或在AWS:RestApi资源中指定Lambda函数,但是两者都需要Lambda函数的ARN值或API ID-我都无法访问因为我正在尝试在单一CFT中创建,部署和集成Lambda和API网关。
我应该在CFT中指定哪些方法或资源来集成我的lambda函数和API网关,而不需要Lambda ARN或API ID,因为在它们创建后我才可以访问这些方法或资源?
编辑:如果有帮助,我也在CFT中使用Swagger
答案 0 :(得分:0)
因此,您要做的第一件事就是创建Lambda函数。
确保lambda是CFN要做的第一件事。您可以通过为DependsOn
指定AWS::ApiGateway::RestApi
属性来执行此操作-但是CFN通常足够聪明以找出它。值将是AWS::Lambda::Function
的资源名称。
定义您的其余API。在大张旗鼓的文档中,您必须具有自定义x-amazon-apigateway-integration
部分。请参阅x-amazon-apigateway-integration。此属性的uri
包含先前创建的lambda函数的ARN。这不是Lambda控制台上显示的ARN。可以这样构造(yaml示例)。如果您有lambda的阶段或版本,则可能需要更多。
uri: !Join ["", ["arn:aws:apigateway:", {"Ref": "AWS::Region"}, ":lambda:path/2015-03-31/functions/", !GetAtt <YourLambdaResourceName>.Arn, "/invocations"]]
还要在credentials
的{{1}}属性中定义一个角色。该角色需要为API网关定义许可以调用lambda。 CFN Yaml中的角色和政策示例。
x-amazon-apigateway-integration
最后创建一个lambda权限,其功能名称为刚创建的lambda的ARN(GetAtt .Arn),主体为ApiGatewayRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: !Join ["-", [{"Ref": "AWS::Region"}, {"Ref": "AWS::StackName"}, "apigateway_lambda_role"]]
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action:
- "sts:AssumeRole"
Principal:
Service:
- "apigateway.amazonaws.com"
Path: "/"
ApiGatewayPolicy:
Type: "AWS::IAM::Policy"
DependsOn: ApiGatewayRole
Properties:
PolicyName: !Join ["-", [{"Ref": "AWS::Region"}, {"Ref": "AWS::StackName"}, "apigateway_lambda_policy"]]
PolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action: "lambda:InvokeFunction"
Resource:
- "*"
Roles:
-
Ref: ApiGatewayRole
。样本
apigateway.amazonaws.com
可以通过使用Ref函数来检索API ID。 希望这会有所帮助。