terraform 0.13.5 资源在连续调用时相互覆盖
terraform 0.13.5 resources overwrite each other on consecutive calls
我正在使用 terraform 0.13.5 创建 aws_iam 资源
我有 2 个 terraform 资源如下
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 ]
}
第一个模块创建一个策略并附加一些角色。我无法编辑此模块
第二个资源将更多角色附加到同一策略以及其他策略
第二个资源depends_on第一个资源,所以我希望第二个资源的策略附件总是覆盖第一个资源的策略附件
实际上,每个资源中的策略附件在每次连续构建时会相互覆盖。因此,在第一次构建时,会应用第二个资源附件,在第二次构建时会应用第一个资源附件,依此类推。
谁能告诉我为什么会这样? depends_on 是否不适用于相互覆盖的资源?
有没有不将我的两个资源合并到同一个资源中的简单解决方法?
至于为什么会这样:
- 在第一个 运行 期间,terraform 部署第一个资源,然后是第二个 - 这个顺序是由于
depends_on
关系(接下来的步骤不管任何 depends_on
) .第二个覆盖第一个
- 在第二次部署 Terraform 期间查看需要完成的工作:
- 第一个丢失(被覆盖),需要创建它们
- 第二个很好,terraform 在这次更新中忽略了它们
- 现在只会创建第一个,它们会覆盖第二个
- 在第三次 运行 中发生了同样的情况,但恰恰相反,秒丢失,第一个被忽略,第二个首先被覆盖
- 随心所欲地重复,您永远不会以稳定的部署结束。
解决方案:不要在 terraform 中指定冲突的内容。 Terraform 应该是对基础设施应该是什么样子的描述——并说 “这个资源应该只有 属性 A” 和 “这个资源应该只有 属性 B 是矛盾的,terraform 将无法优雅地处理这个问题。
你具体应该做什么:不要使用aws_iam_policy_attachment
,基本上不用,看docs中的大红框。使用多个 aws_iam_role_policy_attachment
代替,它们是相加的,它们不会相互覆盖。
我正在使用 terraform 0.13.5 创建 aws_iam 资源
我有 2 个 terraform 资源如下
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 ] }
第一个模块创建一个策略并附加一些角色。我无法编辑此模块
第二个资源将更多角色附加到同一策略以及其他策略
第二个资源depends_on第一个资源,所以我希望第二个资源的策略附件总是覆盖第一个资源的策略附件
实际上,每个资源中的策略附件在每次连续构建时会相互覆盖。因此,在第一次构建时,会应用第二个资源附件,在第二次构建时会应用第一个资源附件,依此类推。
谁能告诉我为什么会这样? depends_on 是否不适用于相互覆盖的资源?
有没有不将我的两个资源合并到同一个资源中的简单解决方法?
至于为什么会这样:
- 在第一个 运行 期间,terraform 部署第一个资源,然后是第二个 - 这个顺序是由于
depends_on
关系(接下来的步骤不管任何depends_on
) .第二个覆盖第一个 - 在第二次部署 Terraform 期间查看需要完成的工作:
- 第一个丢失(被覆盖),需要创建它们
- 第二个很好,terraform 在这次更新中忽略了它们
- 现在只会创建第一个,它们会覆盖第二个
- 在第三次 运行 中发生了同样的情况,但恰恰相反,秒丢失,第一个被忽略,第二个首先被覆盖
- 随心所欲地重复,您永远不会以稳定的部署结束。
解决方案:不要在 terraform 中指定冲突的内容。 Terraform 应该是对基础设施应该是什么样子的描述——并说 “这个资源应该只有 属性 A” 和 “这个资源应该只有 属性 B 是矛盾的,terraform 将无法优雅地处理这个问题。
你具体应该做什么:不要使用aws_iam_policy_attachment
,基本上不用,看docs中的大红框。使用多个 aws_iam_role_policy_attachment
代替,它们是相加的,它们不会相互覆盖。