gpt4 book ai didi

amazon-web-services - AWS-使用 CFT 将 Lambda 与 API Gateway 集成

转载 作者:行者123 更新时间:2023-12-03 07:14:43 25 4
gpt4 key购买 nike

我正在尝试构建一个 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

最佳答案

因此,您要做的第一件事就是创建 Lambda 函数。

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

  2. 定义您的其余 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"]]
  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 的 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"]]

可以使用Ref函数检索API id。希望这会有所帮助。

关于amazon-web-services - AWS-使用 CFT 将 Lambda 与 API Gateway 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51391267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com