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