CloudFormation在更新时不会部署到API网关阶段

bjf*_*her 31 amazon-web-services aws-cloudformation aws-api-gateway

当我deploy使用带有API网关资源的模板运行CloudFormation时,第一次运行它时,它会创建并部署到阶段.随后我运行它,它会更新资源但不会部署到阶段.

这种行为是否符合预期?如果是的话,我是如何在更新时将其部署到阶段的?

(Terraform提到了类似的问题:https://github.com/hashicorp/terraform/issues/6613)

spg*_*spg 14

似乎无论何时您的某个Cloudformation资源发生变化,都无法轻松创建新的部署.

解决这个问题的一种方法是使用Lambda支持的自定义资源(请参阅http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html).

只有在您的某个资源已更新时,Lambda才应创建新的部署.要确定您的某个资源是否已更新,
您可能必须围绕此API调用实现自定义逻辑:http://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeStackEvents.html

为了触发自定义资源的更新,我建议您提供一个Cloudformation参数,用于强制更新自定义资源(例如当前时间或版本号).

请注意,您必须DependsOn在自定义资源中添加一个子句,其中包含与您的API相关的所有资源.否则,可能会在更新所有API资源之前创建部署.

希望这可以帮助.

  • AWS支持建议使用Serverless,这非常好。 (3认同)
  • @bjfletcher 当然想知道! (2认同)
  • @bjfletcher我很困惑... [无服务器](https://aws.amazon.com/serverless/)只是Amazon提供的Lambda,API Gateway,S3和DynamoDB,作为基于服务器的方法(如EC2)。我不太明白那是“另一种方式”。 (2认同)

小智 11

这里的答案是使用 Stage 的 AutoDeploy 属性:

  Stage:
    Type: AWS::ApiGatewayV2::Stage
    Properties:
      StageName: v1
      Description: 'API Version 1'
      ApiId: !Ref: myApi
      AutoDeploy: true
Run Code Online (Sandbox Code Playgroud)

请注意,使用“AutoDeploy”时必须未指定“DeploymentId”属性。

请参阅此处的文档: https: //docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html

  • 这是一个解决方案,但不是*解决方案。ApiGatewayV2 不支持 V1 REST API 的所有功能。示例:自定义网关响应、API 密钥、使用计划、金丝雀发布、模拟、边缘优化、X 射线等。请参阅 https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html (2认同)

Tei*_*eza 6

亚马逊的CloudFormation是:

AWS CloudFormation负责为您配置和配置这些资源 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html

重新部署API不是一项配置任务......这是一项促销活动,是软件发布过程中的一个阶段.

AWS CodePipeline是一种持续交付服务,可用于建模,可视化和自动化发布软件所需的步骤. http://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html

CodePipeline还支持从管道中的Actions执行Lambda函数.因此,如前所述,创建一个Lambda函数来部署您的API,但是从Codepipeline而不是CloudFormation调用它.

有关详细信息,请参阅此页面:http: //docs.aws.amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html


小智 6

从 TheClassic 链接的 blogspot 帖子(迄今为止的最佳答案!),您必须记住,如果您没有使用可以插入有效时间戳代替 $TIMESTAMP$ 的内容生成模板,则必须手动更新该模板带有时间戳或其他唯一 ID。这是我的功能示例,它成功删除了现有部署并创建了一个新部署,但是当我想创建另一个更改集时,我必须手动更新这些唯一值:

    rDeployment05012019355:
        Type: AWS::ApiGateway::Deployment
        DependsOn: rApiGetMethod
        Properties:
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'
            StageName: !Ref pStageName

    rCustomDomainPath:
        Type: AWS::ApiGateway::BasePathMapping
        DependsOn: [rDeployment05012019355]
        Properties:
            BasePath: !Ref pPathPart
            Stage: !Ref pStageName
            DomainName:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-CustomDomainName'
            RestApiId:
                Fn::ImportValue: 
                    !Sub '${pApiCoreStackName}-RestApi'
Run Code Online (Sandbox Code Playgroud)


The*_*sic 5

当您的模板指定部署时,CloudFormation仅在尚不存在时才创建该部署。当您尝试再次运行它时,它会发现该部署仍然存在,因此不会重新创建它,因此没有部署。您需要为该部署使用新的资源ID,以便它将创建一个新的部署。阅读此以获取更多信息:https : //currentlyunnamed-theclassic.blogspot.com/2018/12/mastering-cloudformation-for-api.html


sir*_*han 5

我正在使用上述方法,但仅部署 API 网关对我来说看起来很复杂。如果我们正在更改资源的名称,则删除和重新创建资源需要时间,这会增加应用程序的停机时间。

我遵循以下方法使用 AWS CLI 将 API 网关部署到舞台,它不会影响 Cloudformation 堆栈的部署。

我正在做的是,在 API 网关的部署完成后,在 AWS CLI 命令下运行。它将使用最新更新更新现有阶段。

aws apigateway create-deployment --rest-api-id tztstixfwj --stage-name stg --description 'Deployed from CLI'
Run Code Online (Sandbox Code Playgroud)