微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

aws ApiGateway 部署到特定阶段

如何解决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 举报,一经查实,本站将立刻删除。