3

我正在通过 CloudFormation(AWS 的 SAM:无服务器应用程序模型)创建一个 Lambda 函数,并通过 Lambda 函数的 Events 属性定义了一个 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。我尝试使用Lambda 的 SAM 文档,但唯一的返回值与函数的 ARN 和资源名称有关。

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

¿ 如何获取 API 端点的 URL?

4

2 回答 2

2

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

This Stack Overflow post显示创建了一个隐式引用,您可以按如下方式使用

!Ref ServerlessRestApi

这在实践中得到了SAM Respository App的支持

然后我更仔细地重新阅读了显示该属性的SAM API 文档。RestApiId它说

...通常,这设置为引用此模板中定义的 AWS::Serverless::Api 资源。如果未定义,则会创建默认 AWS::Serverless::Api 资源..."

因此,看起来您可以!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
...
于 2020-01-18T05:59:58.383 回答
1

您可以像这样直接引用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"
于 2020-01-18T07:13:34.720 回答