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

问题描述 投票:22回答:4

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

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

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

amazon-web-services aws-api-gateway amazon-cloudformation
4个回答
12
投票

似乎无论何时您的某个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资源之前创建部署。

希望这可以帮助。


5
投票

亚马逊的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


3
投票

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


2
投票

从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'
© www.soinside.com 2019 - 2024. All rights reserved.