【问题标题】:Terraform resource with the ID already exists具有 ID 的 Terraform 资源已存在
【发布时间】:2020-08-08 14:31:05
【问题描述】:

当 Terraform 运行任务在 azure devops 发布管道中执行时,我收到错误消息“具有 ID 的资源已存在”。 该资源存在于 Azure 中,但如果该资源已经存在,为什么它会抱怨该资源。这应该忽略这部分。请帮助我需要在我的代码中添加将修复此错误的内容! 我只是在使用这个错误的 terraform 工具来部署 azure 资源吗? Terraform 的帮助太糟糕了!!!

resource "azurerm_resource_group" "test_project" {
  name = "${var.project_name}-${var.environment}-rg"
  location = "${var.location}"
  tags = {  
    application = "${var.project_name}" 
  }
}

【问题讨论】:

标签: azure terraform devops


【解决方案1】:

Terraform 旨在让您只管理具有特定 Terraform 配置的基础架构子集,以防某些对象由另一个工具管理,或者如果您将基础架构分解为由许多单独的配置管理合作以产生预期的结果。

作为该设计的一部分,Terraform 区分了远程系统中存在的对象和当前 Terraform 配置管理的对象。在底层 API 的技术限制允许的情况下,Terraform 提供者将避免隐式获取不是由该特定 Terraform 配置创建的东西的所有权。您在此处看到的错误消息是 Azure 提供程序的实现,它会预先检查以确保您给它的名称是唯一的,这样它就不会覆盖(并因此获得隐含所有权)在其他地方创建的对象。

要在此处继续,您有两个主要选项,具体取决于您的预期目标:

  • 如果此对象以前由某个其他系统管理,而您现在想通过此 Terraform 配置来专门管理它,您可以告诉 Terraform 将现有对象与您编写的 resource 块相关联,从而表现得好像该对象最初是由该资源块创建的:

    terraform import azurerm_resource_group.test_project /subscriptions/YOUR-SUBSCRIPTION-ID/resourceGroups/PROJECTNAME-ENVIRONMENTNAME-rg
    

    在运行terraform import 之后,您必须确保之前管理该对象的任何内容都不再与它关联。该对象现在归此 Terraform 配置所有,不得被任何其他系统更改。

  • 如果此对象由其他系统管理,并且您希望继续以这种方式管理它,那么您可以改为使用 data 块来检索有关该现有对象的信息,以便在您的其他地方使用没有 Terraform 获得所有权的配置:

    data "azurerm_resource_group" "example" {
      name = "${var.project_name}-${var.environment}-rg"
    }
    

    如果您需要模块中其他地方的资源组的位置名称,例如,您可以使用data.azurerm_resource_group.example.location 来访问它。如果您想在以后对此资源组进行任何更改,您将继续使用您环境中被视为该资源组所有者的任何其他系统来执行此操作。

这两种方法的主要区别在于 Terraform 将如何在状态快照中记录对象。 terraform import 导致 Terraform 在您编写的资源配置和您在命令行中提供其 id 的远程对象之间创建绑定,这与 Terraform 无法区分它首先创建了该对象并记录了绑定本身。对于数据资源,Terraform 只是读取有关现有对象的数据并将其保存在状态中的缓存,以便它可以确定该值是否在未来运行时发生了变化;它永远不会计划对与 data 块一起使用的对象进行任何修改。

【讨论】:

  • 是否可以在尝试导入之前确定是否存在具有 id 的资源?
【解决方案2】:

对于未来的自己: 今天我偶然发现了同样的问题,因为我重命名了一些资源,而 terraform 无法跟踪它们。我发现了terraform state mv ...,它使您能够重命名状态文件中的资源,以便它可以跟踪远程资源。真的很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2011-03-29
    • 2022-01-24
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多