6

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

4

2 回答 2

24

该问题询问 SAM AWS::Serverless::Function 类型的事件源块中引用的 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 资源。

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

于 2019-03-08T12:02:56.893 回答
1

取自文档

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

于 2018-12-22T19:32:31.220 回答