gpt4 book ai didi

azure - 具有 ID 的 Terraform 资源已存在

转载 作者:行者123 更新时间:2023-12-03 15:42:32 24 4
gpt4 key购买 nike

当 Terraform 运行任务在 azure devops 发布管道中执行时,我收到错误“具有 ID 的资源已存在”。该资源存在于 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 block 关联起来。已经编写,因此表现得就像该对象最初是由该资源 block 创建的:

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

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

  • 如果此对象由其他系统管理,并且您希望继续以这种方式管理它,那么您可以使用 data block 来检索有关的信息在配置中的其他地方使用现有对象,而无需 Terraform 获取所有权:

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

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

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

关于azure - 具有 ID 的 Terraform 资源已存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61418168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com