terraform 0.13.5资源在连续调用时相互覆盖


  • 我正在使用terraform 0.13.5创建aws_iam资源

  • 我有两个地形资源如下

    module "calls_aws_iam_policy_attachment" {
    # This calls an external module to 
    # which among other things creates a policy attachment 
    # resource attaching the roles to the policy
    source   = ""
    name = "xoyo"
    roles = ["rolex", "roley"]
    policy_arn = "POLICY_NAME"
    }
    resource "aws_iam_policy_attachment" "policies_attached" {
    # This creates a policy attachment resource attaching the roles to the policy
    # The roles here are a superset of the roles in the above module
    roles = ["role1", "role2", "rolex", "roley"]
    policy_arn = "POLICY_NAME"
    name = "NAME"
    # I was hoping that adding the depends on block here would mean this 
    # resource is always created after the above module
    depends_on = [ module.calls_aws_iam_policy_attachment ]
    }
    
  • 第一个模块创建一个策略并附加一些角色。我无法编辑此模块

  • 第二个资源将更多角色与其他策略一起附加到同一策略

  • 第二个资源依赖于第一个资源,所以我希望第二个源的策略附件总是覆盖第一个资源的策略附件

  • 实际上,每个资源中的策略附件在每个连续构建中都会相互覆盖。从而在第一个构建上应用第二个资源附件,在第二个构建上则应用第一个资源附件等等。

  • 有人能告诉我为什么会发生这种事吗?dependents_on不适用于相互覆盖的资源吗?

  • 如果不将我的两个资源组合到同一个资源中,有没有一个简单的解决方案?

关于发生这种情况的原因:

  • 在第一次运行期间,terraform部署第一个资源,然后部署第二个资源——这个顺序是由于depends_on关系(无论任何depends_on,下一步都会工作(。第二个覆盖第一个
  • 在第二次部署期间,terraform查看需要做什么:
    • 第一个丢失(被覆盖(,需要创建
    • 第二个很好,terraform在这次更新中忽略了它们
    • 现在只会创建第一个,它们会覆盖第二个
  • 在第三次运行中,也会发生同样的情况,但恰恰相反,秒丢失,第一次被忽略,第二次覆盖第一次
  • 只要你想经常重复,你永远不会得到一个稳定的部署

解决方案:不要在地形中指定冲突的东西。Terraform应该是对基础设施应该是什么样子的描述,并说";该资源应当仅具有属性A"和";该资源应当仅具有属性B">是矛盾的,地形将无法优雅地处理这件事。

具体应该做的是:不要使用aws_iam_policy_attachment,基本上永远不要看文档中的红色大框。使用多个aws_iam_role_policy_attachment,它们是相加的,不会相互覆盖。

最新更新