在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
状态)后,资源仍然被删除。
您知道如何保留旧版本吗?
答案 0 :(得分:0)
您可以将删除策略设置为RETAIN
,还可以更改资源的逻辑ID。更改资源的逻辑ID会导致Cloudformation删除旧资源(或根据删除策略保留它)并创建一个新资源。之所以这样,是因为cloudformation确实知道您已经更改了逻辑ID。它将其视为一种资源被删除而另一种被添加。