Terraform如何重命名资源而不删除它?

13

我使用Terraform创建了AzDo存储库。但是,重命名存储库的最佳方法是什么?我发现可以使用命令“terraform state mv”来实现此目的。如果有更好的方法,请告诉我。

目前,当我使用Terraform状态mv命令时,会出现下面的错误

 terraform state mv "module.azdo-module.azuredevops_git_repository[\"repo1\"]" "module.azdo-module.azuredevops_project.azuredevops_git_repository[\"repo2\"]"

收到以下错误:
  Error: Invalid address
 │ 
 │   on  line 1:
 │   (source code not available)
 │ 
 │ A resource name is required.

该命令中的名称空间无效,这就是为什么会抛出该错误消息的原因。请更新一下资源配置代码片段,以便您可以重命名状态。 - Matt Schuchard
@MattSchuchard,您能具体说明解决方案吗?您指的是哪个命名空间?如果您能提供参考网址或如何使用正确命令的方法,那就太好了。 - mystack
3个回答

24

Terraform在1.1版本中引入了一种新的声明式重构资源的方式,即move块语法。

步骤:

  1. 将资源重命名为新名称
moved {
  from = module.azdo-module.azuredevops_git_repository.repo1
  to   = module.azdo-module.azuredevops_project.azuredevops_git_repository.repo2
}
  1. 更新资源名称引用
  2. 计划并应用
  3. 移除已迁移的模块(前提是没有其他人在使用你的模块)

更多信息:

https://developer.hashicorp.com/terraform/language/modules/develop/refactoring#moved-block-syntax


16

可能

Terraform state mv "module.azdo-module.azuredevops_git_repository.repo1" "module.azdo-module.azuredevops_project.azuredevops_git_repository.repo2"

列出资源以检查名称

Terraform state list


“terraform state list” 帮助我找出了正确的语法。 一旦我们更改了状态,应该如何反映到目标中? - mystack
但这将删除该资源并重新创建。尝试使用相同的方法创建 AWS Secrets Manager 资源。它确实创建了新的秘密,并拥有新的资源 ARN @david。 - Nijo
自 terraform v1.1+ 开始,根据其他答案,使用 moved { from... to ... } 块现在更好。 - Firefishy

0
确保在命令中使用双引号,否则会出现错误,提示找不到资源。 terraform stat mv "old" "new"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接