将对 API 网关的引用传递给 Lambda

Pass a referance to API Gateway to Lambda

我正在使用无服务器框架,我的 lambda 函数之一需要知道 API 网关 ID。我尝试像下面这样设置环境变量。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Runtime: nodejs6.10
    Environment:
      Variables:
        API_GATEWAY: !Ref ApiGatewayRestApi

Resources:
  Test:
    Type: AWS::Serverless::Function
    Properties:
      Handler: LeadLambda.test
      CodeUri: ./Lead
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /
            Method: get

但是当我尝试部署时出现循环依赖错误。

Failed to create the changeset: Waiter ChangeSetCreateComplete failed: Waiter encountered a terminal failure state Status: FAILED. Reason: Circular dependency between resources: [TestGetResourcePermissionProd, ServerlessRestApi, Test, TestGetResourcePermissionTest, ServerlessRestApiDeploymentb5240aa4ca, ServerlessRestApiProdStage]

我最终使用的解决方案是在 API 中硬编码集成 uri,而不是引用 Lambda。

Globals:
  Function:
    Runtime: nodejs6.10
    Environment:
        Variables:
          API: !Sub https://${Api}.execute-api.${AWS::Region}.amazonaws.com/prod

Resources:
  Entry:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: prompt-stack-Entry
      Handler: LeadLambda.entry
      CodeUri: s3://ddg-prompt/LeadLambda.zip
      Role: !GetAtt LeadRole.Arn
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /lead
            Method: POST
            RestApiId: !Ref Api

  Api:
    Type: AWS::Serverless::Api
    Properties:
      StageName: prod
      DefinitionBody:
        swagger: 2.0
        info:
          title:
            Ref: AWS::StackName
        paths:
          /lead:
            post:
              responses:
                '200':
                  description: Successful operation
                  responseTemplates:
                    application/json: ""
              x-amazon-apigateway-integration:
                httpMethod: POST
                type: aws
                uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:prompt-stack-Entry/invocations
                responses:
                  default:
                    statusCode: '200'
                    responseTemplates:
                      application/json: ''