该解决方案基于 YAML 格式,同样可以用于 JSON 格式。
StageName
每当您创建其创建默认值Stage
以及您提供的阶段名称时,SAM 中都会存在一个错误Prod
。首先,您删除当前的,然后您可以应用此更改。
要解决此问题,有两种方法可以添加OpenApiVersion: '2.0'
YAML 文件:
方法1:在下面的属性下StageName
可以添加这个。可以为AWS::Serverless::Api
其他资源(如AWS::Serverless::Lambda
.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS SAM template with a simple API definition
Resources:
ApiGatewayApi:
Type: AWS::Serverless::Api
Properties:
StageName: 'V1'
OpenApiVersion: '2.0'
ApiFunction: # Adds a GET api endpoint at "/" to the ApiGatewayApi via an Api event
Type: AWS::Serverless::Function
Properties:
Events:
ApiEvent:
Type: Api
Properties:
Path: /
Method: get
RestApiId:
Ref: ApiGatewayApi
Runtime: python3.7
Handler: index.handler
InlineCode: |
def handler(event, context):
return {'body': 'Hello World!', 'statusCode': 200}
方法 2:您的 SAM 模板在顶层的以下内容,并确保您已在 AWS::Serverless:Api 资源上使用“StageName”定义了一个阶段。如果您有多个资源,如 API 或 lambda 等,这将是全局级别的。
Globals:
Api:
OpenApiVersion: 3.0.1
Cors: '*'
Resources:
ImplicitApiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: s3://sam-demo-bucket/member_portal.zip
Handler: index.gethtml
Runtime: nodejs12.x
Events:
GetHtml:
Type: Api
Properties:
Path: /
Method: get
ExplicitApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
注意:此解决方案仅适用于从头开始创建 API 的情况。如果之前创建了 API,并且用户将 OpenApiVersion: '2.0' 添加到其中,它不会删除“Stage”阶段。它需要从头开始添加。
AWS::Serverless::Api
是一个非常简单的实现,不能在 SAM 下管理多阶段,更好地使用AWS::ApiGateway::RestApi
和多个AWS::ApiGateway::Stage
引用 RestApi 资源。
参考: