Cloudformation:防止替换资源更新后删除

时间:2018-09-17 11:33:19

标签: amazon-web-services amazon-cloudformation autoscaling

在AWS Cloudformation中,有一些特殊资源无法直接更新。它们将被aws cloudformation update-stack命令代替。只要您不想在更新后保留这些资源,此方法就可以正常工作。

在我的示例中,我想保留AWS::AutoScaling::LaunchConfiguration资源的所有更新版本,以便在AutoScalingGroup中手动切换LaunchConfigurations(出于测试目的或紧急回滚)。我需要这样做,因为Web界面用户无法使用Cloudformation,也没有获得授权。

因此,我创建了一个模板,该模板通过设置包含当前日期/时间的自定义LaunchConfigurationName来创建/更新LaunchConfiguration资源。
这可以正常工作,但是: 在UPDATE_COMPLETE_CLEANUP_IN_PROGRESS状态之后,总是会删除AWS::AutoScaling::LaunchConfiguration资源的旧版本。为避免这种情况,我尝试设置set-stack-policy:

{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    },
    {
      "Effect" : "Deny",
      "Action" : "Update:Delete",
      "Principal" : "*",
      "Resource" : "*",
      "Condition" : {
        "StringEquals" : {
          "ResourceType" : ["AWS::AutoScaling::LaunchConfiguration"]
        }
      }
    }  
  ]
}

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html

Update:Delete

    Specifies update actions during which resources are removed. 
    Updates that completely remove resources from a stack template require this action.

结果:更新AutoScalingGroup(UPDATE_COMPLETE_CLEANUP_IN_PROGRESS状态)后,资源仍然被删除。
您知道如何保留旧版本吗?

1 个答案:

答案 0 :(得分:0)

您可以将删除策略设置为RETAIN,还可以更改资源的逻辑ID。更改资源的逻辑ID会导致Cloudformation删除旧资源(或根据删除策略保留它)并创建一个新资源。之所以这样,是因为cloudformation确实知道您已经更改了逻辑ID。它将其视为一种资源被删除而另一种被添加。