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 函数。

  1. 确保 lambda 是 CFN 做的第一件事。您可以通过为 AWS::ApiGateway::RestApi 指定 DependsOn 属性来做到这一点——但通常 CFN 足够聪明,可以解决这个问题。值将是 AWS::Lambda::Function.

  2. 的资源名称
  3. 定义你的休息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"]]
    
  4. 也在x-amazon-apigateway-integrationcredentials属性中定义一个角色。此角色需要为 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
    
  5. 最后创建您的 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函数获取。 希望这有帮助。