我正在使用此配置部署到“Prod”阶段:
"ApiGatewayApi":
{
"Type": "AWS::Serverless::Api",
"Properties": {
"StageName": "Prod",
"Name" : "MainGateway",
...
我想将不同的代码部署到“Stage”阶段。 我试图将“StageName”更改为“Stage”,但出现此错误: “阶段已经存在”。
如何将不同的代码部署到不同的阶段?
答案 0 :(得分:1)
此解决方案基于 YAML 格式,同样可以用于 JSON 格式。
每当您创建 StageName
它的创建默认 Stage
以及您提供的阶段名称(如 Prod
)时,SAM 中都会存在一个错误。首先删除当前的更改,然后可以应用此更改。
要解决此问题,可以通过在 YAML 文件中添加 OpenApiVersion: '2.0'
两种方法:
方法 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 资源。
参考: