在 Cloudformation 的 Lambda 定义的事件 属性 中创建时如何获取 API 端点的 URL

How do you get the API endpoint's URL when it's created within the Events property of Cloudformation's Lambda definition

我正在通过 CloudFormation(AWS 的 SAM:无服务器应用程序模型)创建 Lambda 函数,并通过 Lambda 函数的事件定义了一个 API 端点 属性。

  ...
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Description: Do amazing things
      CodeUri: my_function/
      Events:
        Trigger:
          Type: Api
          Properties:
            Path: /p1/{v1}
            Method: post
      Handler: app.run
  ...

我现在想使用在 CloudFormation YAML 文件的另一部分中创建的端点的 URL。我尝试使用 the SAM documentation for Lambda,但唯一的 return 值与函数的 ARN 和资源名称有关。

具体来说,我认为与确切问题无关,我想使用 API 端点作为 SNS 主题的订阅。

¿如何获取 API 端点的 URL?

我想我在几个地方找到了答案。

表明创建了一个隐式引用,您可以按如下方式使用它

!Ref ServerlessRestApi

这在实践中得到了 SAM Respository App

的支持

然后我重新仔细阅读 SAM API documentation,其中显示了 RestApiId 属性。它说

...Typically, this is set to reference an AWS::Serverless::Api resource defined in this template. If not defined, a default AWS::Serverless::Api resource is created..."

因此看起来您可以将其引用为 !Ref ServerlessRestApi 而无需对原始问题中的 YAML 进行任何修改,或者您可以添加以下 属性、RestApiId: MyAPI 和引用它作为 !Ref MyAPI.

但是,要获得实际的 URL,您似乎必须使用 Fn::Sub 将几个部分粘合在一起。 Pahud Hsieh 在他上面的 SAM Repository 应用程序中做到了这一点

Outputs:
  APIUrlPrefix:
    Value:
      Fn::Sub:
      - https://${ServerlessRestApi}.execute-api.${Region}.amazonaws.com/Prod/incomingwebhooks/
      - Region:
          Ref: AWS::Region
        ServerlessRestApi:
          Ref: ServerlessRestApi
...

您可以像这样直接引用 RestApi 资源。

Resources:
  apiGateway:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Name: !Sub ${AWS::StackName}-my-api
      Description: my-api-edge


Outputs:
  apiGatewayInvokeURL:
    Value: !Sub "https://${apiGateway}.execute-api.${AWS::Region}.amazonaws.com/${apiGatewayStageName}"

  lambdaArn:
    Value: !GetAtt "lambdaFunction.Arn"