AWS- 使用 CFT 将 Lambda 与 API 网关集成
AWS- Integrating Lambda with API Gateway using 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
所以您要做的第一件事就是创建 Lambda 函数。
确保 lambda 是 CFN 做的第一件事。您可以通过为 AWS::ApiGateway::RestApi
指定 DependsOn
属性来做到这一点——但通常 CFN 足够聪明,可以解决这个问题。值将是 AWS::Lambda::Function
.
的资源名称
定义你的休息API。在 swagger 文档中,您必须具有自定义 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"]]
也在x-amazon-apigateway-integration
的credentials
属性中定义一个角色。此角色需要为 API 网关定义权限以承担调用 lambda。 CFN yaml 中的示例角色和策略。
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
最后创建您的 lambda 权限,函数名称作为您刚创建的 lambda 的 ARN (GetAtt .Arn),主体为 apigateway.amazonaws.com
。样本
LambdaPermission1:
Type: "AWS::Lambda::Permission"
Properties:
Action: lambda:InvokeFunction
FunctionName: !GetAtt HandlerFunction.Arn
Principal: apigateway.amazonaws.com
SourceAccount: !Ref AWS::AccountId
SourceArn: !Join ["", ["arn:aws:execute-api:", {"Ref": "AWS::Region"}, ":", {"Ref": "AWS::AccountId"}, ":", <API id>, "/<stage>/<method>/path"]]
API id可以通过Ref函数获取。
希望这有帮助。
我正在尝试构建一个 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
所以您要做的第一件事就是创建 Lambda 函数。
确保 lambda 是 CFN 做的第一件事。您可以通过为
AWS::ApiGateway::RestApi
指定DependsOn
属性来做到这一点——但通常 CFN 足够聪明,可以解决这个问题。值将是AWS::Lambda::Function
. 的资源名称
定义你的休息API。在 swagger 文档中,您必须具有自定义
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"]]
也在
x-amazon-apigateway-integration
的credentials
属性中定义一个角色。此角色需要为 API 网关定义权限以承担调用 lambda。 CFN yaml 中的示例角色和策略。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
最后创建您的 lambda 权限,函数名称作为您刚创建的 lambda 的 ARN (GetAtt .Arn),主体为
apigateway.amazonaws.com
。样本LambdaPermission1: Type: "AWS::Lambda::Permission" Properties: Action: lambda:InvokeFunction FunctionName: !GetAtt HandlerFunction.Arn Principal: apigateway.amazonaws.com SourceAccount: !Ref AWS::AccountId SourceArn: !Join ["", ["arn:aws:execute-api:", {"Ref": "AWS::Region"}, ":", {"Ref": "AWS::AccountId"}, ":", <API id>, "/<stage>/<method>/path"]]
API id可以通过Ref函数获取。 希望这有帮助。