ID为的TerraForm资源已存在 [英] Terraform resource with the ID already exists

查看:9
本文介绍了ID为的TerraForm资源已存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当Terraform Run任务在Azure devops发布管道中执行时,我得到一个错误"A resource with the ID eXist"。 该资源存在于Azure中,但是如果该资源已经存在,为什么它还在抱怨该资源。这应该忽略这一部分。请帮助我需要在我的代码中添加什么来修复这个错误! 我只是在使用这个bug terraform工具来部署azure资源吗?TerraForm帮助太可怕了!

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

推荐答案

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为的TerraForm资源已存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆