如何更改 SAM 模板中 API 阶段的名称?

How can I change the name of the API stage in a SAM template?

我正在使用 SAM 部署 Lambda 函数,并使用 API 网关通过 HTTP 调用它,大致使用以下模板片段:

MyFunction:
  Type: AWS::Serverless::Function
  Properties:
    …
    Events:
      MyApi:
        Type: Api
        Properties:
          Path: /
          Method: any

这有效,但它创建了一个名为 "Prod" 的 API 阶段,它必须用作所有 URL 的前缀。我不希望我的 URL 是“https://something/Prod/foo", I want them to be "https://something/v1/foo”,即我选择的内容。

如何更改舞台的名称?

我尝试将 API 声明为单独的资源,并使用 StageName 属性 来设置舞台的名称,但是,这需要我也设置 DefinitionBody,那好像是个很深的兔子洞。

MyFunction:
  Type: AWS::Serverless::Function
  Properties:
    …
    Events:
      MyApi:
        Type: Api
        Properties:
          Path: /
          Method: any
          RestApiId: !Ref MyApi

MyApi:
  Type: AWS::Serverless::Api
  Properties:
    StageName: v1
    DefinitionBody:
      ???

我知道上面示例中的 ??? 应该是 Swagger,但我宁愿不必在那里写任何东西,模板已经足够冗长了。因为如果我可以接受舞台名称 "Prod" 我就不必写这部分,所以在我看来必须有一种方法可以避免在那里写任何东西而只设置舞台名称。

如何在不编写大量模板代码的情况下更改舞台的名称and/or Swagger?

SAM 版本 1.7.0 不再需要指定 DefinitionBody 或 DefinitionUri,因此您现在应该能够完全按照您在第二个示例中提到的操作进行操作,而无需包含 DefinitionBody:

MyFunction:
  Type: AWS::Serverless::Function
  Properties:
    …
    Events:
      MyApi:
        Type: Api
        Properties:
          Path: /
          Method: any
          RestApiId: !Ref MyApi

MyApi:
  Type: AWS::Serverless::Api
  Properties:
    StageName: v1