我的情况:
在我的无知中,我尝试像这样重命名 Terraform 资源:
resource "resource_type" "rg" {
for_each = local.spaces
name = "OLD-name-${each.value.space}"
}
看起来像这样:
resource "resource_type" "rg" {
for_each = local.spaces
name = "NEW-name-${each.value.space}"
}
如您所见,我尝试更改此
for_each
循环中所有资源使用的标识符。我不知道我必须“移动”资源才能以这种方式更改其标识符。我想我可以只更改代码中的标识符,应用它,然后资源就会被重命名。这是错误的,但我还是这么做了。
结果:Terraform 尝试销毁每个资源,并使用不同的名称重新创建它们。由于某些依赖,销毁失败。但是,创建成功了。因此,现在,在云中和 Terraform 状态下,资源数量是预期的两倍 - 一些在旧名称下,一些在新名称下:
resource_type.rg["OLD-name-dev"]
resource_type.rg["OLD-name-test"]
resource_type.rg["NEW-name-dev"]
resource_type.rg["NEW-name-test"]
moved
块
移动资源,以便我的 CI/CD 执行它:
moved {
from = resource_type.rg["OLD-name-dev"]
to = resource_type.rg["NEW-name-dev"]
}
moved {
from = resource_type.rg["OLD-name-test"]
to = resource_type.rg["NEW-name-test"]
}
此操作失败,因为名称已被占用:
Terraform tried to adjust resource instance addresses in the prior state
based on change information recorded in the configuration, but some
adjustments did not succeed due to existing objects already at the intended
addresses:
- resource_type.rg["OLD-name-dev"] could not move to resource_type.rg["NEW-name-dev"]
- resource_type.rg["OLD-name-test"] could not move to resource_type.rg["NEW-name-test"]
为了完成移动,我想我需要删除
NEW-name
资源。这将释放它们的标识符,以便现有资源可以使用这些标识符。听起来不错吗?
我可以用删除的方块来完成这个任务吗?
removed {
from = resource_type.rg["NEW-name-dev"]
lifecycle {
destroy = true
}
}
removed {
from = resource_type.rg["NEW-name-test"]
lifecycle {
destroy = true
}
}
在我看来,这些块可以释放我需要的标识符。但有件事让我很困惑:我可以在同一代码库中删除和移动相同的标识符吗?
或者这两个操作会冲突吗?或者,它们可能第一次按预期执行,然后在第二次运行时发生冲突?第一次运行时的删除将是合法的,但第二次将是在重命名后删除有效的资源。 是否有其他方法告诉 Terraform“真正移动这些,覆盖名称”?
销毁名为“旧”的并保留名为“新”的。
要在不更改配置的情况下实现第二个选项,您需要执行一些手动步骤:
terraform state rm 'resource_type.rg["NEW-name-dev"]'
terraform state rm 'resource_type.rg["NEW-name-test"]'
terraform plan
以验证 Terraform 现在应该报告旧密钥已按照您的意愿移至新密钥。
moved
块)并执行步骤 3。