Terraform 无法移动资源,因为现有对象已位于预期地址

问题描述 投票:0回答:1

我的情况:

在我的无知中,我尝试像这样重命名 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"]
  1. resource_type.rg["OLD-name-test"]
  2. resource_type.rg["NEW-name-dev"]
  3. resource_type.rg["NEW-name-test"]
  4. 
    
  5. 看到我的错误,我后来尝试用

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 cloud cloud-foundry infrastructure-as-code
1个回答
0
投票

销毁名为“旧”的并保留名为“新”的。
  1. 销毁名为“新”的并保留名为“旧”的。
  2. 由于您的配置的编写方式 - 将“所需状态”设置为“新” - 我预计 Terraform 会提出第一个选项。您共享的警告解释说,移动“旧”对象是不可能的,因此 Terraform 可能也建议删除这些对象。

要在不更改配置的情况下实现第二个选项,您需要执行一些手动步骤:

    告诉 Terraform “忘记”这两个“新”对象,使用:
    • terraform state rm 'resource_type.rg["NEW-name-dev"]'
    • terraform state rm 'resource_type.rg["NEW-name-test"]'
    • 
      
  1. 从远程系统中手动删除相应的对象。
  2. 运行
  3. terraform plan

    以验证 Terraform 现在应该报告旧密钥已按照您的意愿移至新密钥。

    
    

  4. 如果您不希望以这种方式手动从状态中删除对象,则可以将配置编辑回旧形式(使用“OLD”键),然后正常计划和应用。 Terraform 将注意到“NEW”键未处于所需状态,并建议删除相应的对象。如果您应用该计划,那么您将达到与上述列表中步骤 2 结束时相同的状态,因此您可以切换回较新的配置(使用
moved

块)并执行步骤 3。

    

© www.soinside.com 2019 - 2024. All rights reserved.