【发布时间】:2022-01-19 12:50:40
【问题描述】:
我们正在使用 CloudFormation 为其设置角色和策略。使用“DependsOn”属性将策略设置为依赖于角色,如下所示:
角色定义:
"LambdaExecutionRole": {
"Type": "AWS::IAM::Role",
"Properties": {
[...]
政策定义:
"lambdaexecutionpolicy": {
"DependsOn": [
"LambdaExecutionRole"
],
"Roles": [
{
"Ref": "LambdaExecutionRole"
}
],
[...]
从official documentation 了解到,这两个实体之间的 DependsOn 关系应确保始终在角色之前删除策略。
在资源 B 之前删除资源 A。
但是,我们遇到了一个错误,系统似乎尝试在策略之前删除角色:
Resource Name: [...] (AWS::IAM::Role)
Event Type: delete
Reason: Cannot delete entity, must delete policies first. (Service: AmazonIdentityManagement; Status Code: 409; Error Code: DeleteConflict; Request ID: [...]; Proxy: null)
我不确定这怎么可能,因为我会考虑“A DependsOn B”以确保系统在删除 A 之前永远不会尝试删除 B。我的理解是否错误?会不会出现系统先删除B再删除A的情况?
是的,我知道在这种情况下,显而易见的解决方案是使用内联策略,因为该策略仅用于此特定角色。但是由于这种行为似乎与我对官方文档的直观理解相冲突,所以我想正确理解“DependsOn”属性的实际含义。
【问题讨论】:
-
您是否添加了明确的
DependsOn来解决实际问题?我不记得曾经为角色-策略关系明确设置依赖项。快速浏览几个 CDK 生成的 Cfn 模板,发现角色和策略之间没有这样的DependsOn。我相信 Cfn 推断出依赖关系,因为该策略具有对角色的引用。也许明确的DependsOn没有提供帮助,而是创建了循环依赖或以其他方式干扰? -
我相信
DependsOn是由 Amplify 自动生成的,尽管我可能错了。是的,我认为这应该是不必要的,因为我们在代码中的其他地方没有使用DependsOn。但是,在我看来,指定已经隐式设置的内容不应导致不同的行为。
标签: amazon-web-services amazon-cloudformation