【问题标题】:aws ApiGateway deploy to specific stageaws ApiGateway 部署到特定阶段
【发布时间】:2021-08-14 05:41:45
【问题描述】:

我正在使用此配置部署到“产品”阶段:

"ApiGatewayApi":
  {
    "Type": "AWS::Serverless::Api",
    "Properties": {
      "StageName": "Prod",
      "Name" : "MainGateway",
       ...

我想将不同的代码部署到“阶段”阶段。 我试图将“StageName”更改为“Stage”,但出现此错误: “阶段已存在”。

如何将不同的代码部署到不同的阶段?

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudformation aws-api-gateway awsdeploy


    【解决方案1】:

    此解决方案基于 YAML 格式,同样可以用于 JSON 格式。

    当您创建 StageName 时,SAM 中存在一个错误,它会创建默认的 Stage 以及您提供的阶段名称,例如 Prod。首先,您删除当前的,然后您可以应用此更改。

    要解决此问题,有两种方法可以在 YAML 文件中添加 OpenApiVersion: '2.0'

    方法一:在StageName后面的属性下可以添加这个。可以为AWS::Serverless::ApiAWS::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 资源。

    参考

    【讨论】:

    • 我了解 Stage 是由于错误而创建的。剩下的答案我什么都不懂,抱歉。
    • 您必须在模板中添加OpenApiVersion: '2.0' 才能解决此问题
    • 关于解决方案@RonyTesler 是否存在一些理解问题。我已经测试了这个解决方案并且它工作正常。
    • 我相信你它的工作,我只是不明白说明。比如我不明白这句话的意思:“这将API或资源级别”。
    • 它删除了我的 Prod 阶段!
    猜你喜欢
    • 2020-05-30
    • 2023-01-24
    • 2018-06-19
    • 2018-05-22
    • 2018-11-12
    • 2020-11-23
    • 2019-04-24
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多