如何解决aws ApiGateway 部署到特定阶段
我正在使用此配置部署到“Prod”阶段:
"ApiGatewayApi":
{
"Type": "AWS::Serverless::Api","Properties": {
"StageName": "Prod","Name" : "MainGateway",...
我想将不同的代码部署到“Stage”阶段。 我试图将“StageName”更改为“Stage”,但出现此错误: “阶段已经存在”。
如何将不同的代码部署到不同的阶段?
解决方法
此解决方案基于 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 资源。
参考:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。