【问题标题】:SAM Serverless implicit API vs AWS::Serverless::ApiSAM Serverless 隐式 API 与 AWS::Serverless::Api
【发布时间】:2019-05-22 17:42:57
【问题描述】:

在配置 SAM 模板并定义 AWS::Serverless::Function 时,有一个接受 Api 类型的事件参数。这会创建 API Gateway 资源吗?这种事件类型和独立的AWS::Serverless::Api资源有什么区别?

【问题讨论】:

    标签: amazon-web-services aws-serverless aws-sam


    【解决方案1】:

    问题询问SAM AWS::Serverless::Function类型的Event source block中引用的API,如:

    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        ...
        Events:
          MyApi:
            Type: Api
            Properties:
              Path: /resource
              Method: GET
    

    正如各个地方的文档中所述,这些在 SAM 中称为“隐式 API”。

    SAM 根据在 AWS::Serverless::Function 资源上定义的 Api 事件的联合创建 AWS::Serverless::Api 类型的资源 - 但仅限于那些不参考(通过 RestApiId 属性)到 AWS::Serverless 的资源::Api 在模板中明确定义。

    在幕后,SAM 收集所有这些隐式 API,生成 Swagger,并使用此 Swagger 创建隐式 API。此 API 默认为名为“Prod”的 StageName,无法配置。

    如果您确实需要控制在 Swagger 中定义和记录 API,则应显式创建 AWS::Serverless::Api 资源。然后会以这种方式引用它:

    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        ...
        Events:
          MyApi:
            Type: Api
            Properties:
              Path: /resource
              Method: GET
              RestApiId: !Ref MyAPI  # Add this line
    
    MyApi:
      Type: AWS::Serverless::Api
      Properties:
        StageName: Prod
        DefinitionBody:
          ...
    

    所以它们之间的唯一区别是您对其配置的控制程度,关键考虑因素是您是否需要定义其中任何一个:

    • 舞台名称
    • Swagger 定义(通过 DefinitionBody)

    如果您需要控制其中一个或两个,则需要明确定义您的 API。否则,您可能可以使用隐式 API。

    另请注意,SAM 中的 AWS::Serverless::Api 资源“转换”为 AWS::ApiGateway::RestApi、AWS::ApiGateway::Stage 和 AWS::ApiGateway::Deployment 类型的 CloudFormation 资源。

    请注意,此信息是这三个源文档中的信息摘要:

    【讨论】:

    • 您为此付出了一些努力,谢谢。我已将您的答案作为未来偶然发现此问题的人的公认答案。
    • 好吧,我确实提到了选择使用隐式或显式时的关键考虑因素是您是否需要定义自己的 Swagger,它位于 DefinitionBody 中。这有点不清楚吗?
    【解决方案2】:

    Taken from the documentation:

    无需将 AWS::Serverless::Api 资源显式添加到 AWS 无服务器应用程序定义模板。这种类型的资源是从模板中定义的 AWS::Serverless::Function 资源上定义的 Api 事件的联合隐式创建的,这些资源不引用 AWS::Serverless::Api 资源。

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2021-04-29
      • 2020-01-11
      相关资源
      最近更新 更多