【问题标题】:In CloudFormation, does "A DependsOn B" ensure that A is deleted before B?在 CloudFormation 中,“A DependsOn B”是否确保 A 在 B 之前被删除?
【发布时间】: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


【解决方案1】:

TL;DR 无法复制错误。 DependsOn 似乎不是罪魁祸首。

我使用 CDK 创建了两个版本的最小测试堆栈,只有两个资源,AWS::IAM::RoleAWS::IAM::ManagedPolicy。 V1 没有对角色设置明确的策略依赖关系。 V2 和 OP 一样,做到了。差异没有任何区别。两个版本均已部署并被销毁,没有出现错误。

版本 1:CDK 生成的默认值:模板中没有“依赖于”

版本 2(如 OP):具有显式依赖性 - 策略取决于角色。 CDK在模板中添加了一行:"DependsOn": [ "TestRole6C9272DF" ]"TestPolicyCC05E598"

这两个版本的区别仅在于那一个DependsOn。两个版本都按预期部署和销毁,没有错误。

// resource section of CDK-generated Cloud Formation Template
"Resources": {
  "TestRole6C9272DF": {
    "Type": "AWS::IAM::Role",
    "Properties": {
      "AssumeRolePolicyDocument": {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": "lambda.amazonaws.com"
            }
          }
        ],
        "Version": "2012-10-17"
      }
    },
    "Metadata": {
      "aws:cdk:path": "TsCdkPlaygroundIamDependencyStack/TestRole/Resource"
    }
  },
  "TestPolicyCC05E598": {
    "Type": "AWS::IAM::ManagedPolicy",
    "Properties": {
      "PolicyDocument": {
        "Statement": [
          {
            "Action": [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "*"
          }
        ],
        "Version": "2012-10-17"
      },
      "Description": "",
      "Path": "/",
      "Roles": [
        {
          "Ref": "TestRole6C9272DF"
        }
      ]
    },
    "DependsOn": [
      "TestRole6C9272DF"  // <-- The difference that makes no difference
    ],
    "Metadata": {
      "aws:cdk:path": "TsCdkPlaygroundIamDependencyStack/TestPolicy/Resource"
    }
  },

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 2014-03-29
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多