【发布时间】:2019-12-10 05:20:41
【问题描述】:
我有一个文件 users.tf 文件,用于为 aws 创建管理员用户。它通过定义一个列表来实现(例如users = ["bob", "john", "tom"])
然后使用 terraform 中的 count 功能使用 aws_iam_user 资源对它们进行迭代,如下所示:
resource "aws_iam_user" "user" {
count = length(local.users)
name = local.users[count.index]
}
这里的问题是,如果我删除数组的第一个元素(上例中的“bob”),terraform 建议在发出terraform plan 后执行的操作,而不是删除 bob,将 bob 更改为john,把 john 改成 tom,然后删除 tom。
像这样:
# aws_iam_user.user[0] will be updated in-place
~ resource "aws_iam_user" "user" {
arn = "arn:aws:iam::5555555:user/bob"
force_destroy = false
id = "bob"
~ name = "bob" -> "john"
path = "/"
tags = {}
unique_id = "BLABLABLA11111"
}
# aws_iam_user.user[1] will be updated in-place
~ resource "aws_iam_user" "user" {
arn = "arn:aws:iam::5555555:user/john"
force_destroy = false
id = "john"
~ name = "john" -> "tom"
path = "/"
tags = {}
unique_id = "BLABLABLA22222"
}
# aws_iam_user.user[2] will be destroyed
- resource "aws_iam_user" "user" {
- arn = "arn:aws:iam::5555555:user/tom" -> null
- force_destroy = false -> null
- id = "tom" -> null
- name = "tom" -> null
- path = "/" -> null
- tags = {} -> null
- unique_id = "BLABLABLA3333" -> null
这将导致 john 得到 bob 的 arn,而 tom 得到 john 的 arn。这是不可取的。
我尝试使用 for_each 循环的very new feature(在撰写本问题前 19 小时发布)而不是 count,并将键定义为原始索引号,希望 terraform 将它们视为相同的资源。
是的,没有这样的运气:
...
# aws_iam_user.user[1] will be destroyed
...
# aws_iam_user.user["1"] will be created
...
我将总结我的问题:
当通过迭代列表创建资源时,有什么方法可以删除资源(特别是 aws_iam_user),以使所有剩余资源保持原样?
【问题讨论】:
标签: terraform