【问题标题】:AWS- Integrating Lambda with API Gateway using CFTAWS- 使用 CFT 将 Lambda 与 API Gateway 集成
【发布时间】:2018-12-25 17:44:30
【问题描述】:

我正在尝试构建一个 CFT,它创建一个 Lambda 函数和一个 API,并将它们集成在一起。我目前能够创建 Lambda 函数和 API,但无法集成它们。

我曾想过使用 AWS:Lambda:Permission,或者在 AWS:RestApi 资源中指定 Lambda 函数,但两者都需要 Lambda 函数的 ARN 值或 API ID——我无权访问这两者因为我正在尝试在单个 CFT 中创建、部署和集成 Lambda 和 API Gateway。

我应该在我的 CFT 中指定什么方法或资源来集成我的 lambda 函数和 API 网关,而不需要 Lambda ARN 或 API Id,因为在它们创建之前我无法访问它们?

编辑:如果有帮助,我也在我的 CFT 中使用 Swagger

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway amazon-cloudformation


    【解决方案1】:

    所以你要做的第一件事就是创建 Lambda 函数。

    1. 确保 lambda 是 CFN 所做的第一件事。您可以通过为AWS::ApiGateway::RestApi 指定DependsOn 属性来做到这一点——但通常CFN 足够聪明,可以弄清楚。值将是 AWS::Lambda::Function 的资源名称。

    2. 定义你的 REST API。在 swagger 文档中,您必须有自定义的 x-amazon-apigateway-integration 部分。请参阅x-amazon-apigateway-integration。 this 的 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"]]
      
    3. 还在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
      
    4. 最后为您创建 lambda 权限,函数名称为您刚刚创建的 lambda (GetAtt .Arn) 的 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 函数来检索。 希望这会有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2017-04-18
    • 2020-10-05
    • 2019-06-22
    • 2020-11-20
    • 2018-02-16
    • 2019-07-09
    相关资源
    最近更新 更多