-
我正在使用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
,它们是相加的,不会相互覆盖。