Ресурс Terraform с идентификатором уже существует - PullRequest
0 голосов
/ 25 апреля 2020

Когда задача запуска Terraform выполняется в azure devops release pipe, я получаю сообщение об ошибке «Ресурс с идентификатором уже существует». Ресурс существует в 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}" 
  }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Terraform разработан, чтобы позволить вам управлять только подмножеством вашей инфраструктуры с определенной конфигурацией Terraform, в случае, если некоторые объекты управляются другим инструментом, или если вы разложили свою инфраструктуру, чтобы управлять многими отдельными конфигурациями, которые сотрудничать для получения желаемого результата.

Как часть этого проекта, Terraform проводит различие между объектом, существующим в удаленной системе, и тем объектом, которым управляет текущая конфигурация Terraform. В тех случаях, когда технические ограничения базового API позволяют это, поставщики Terraform избегают неявного вступления во владение чем-то, что не было создано этой указанной c конфигурацией Terraform. Сообщение об ошибке, которое вы видели здесь, является реализацией провайдера Azure, где он предварительно проверяет, чтобы убедиться, что имя, которое вы даете, является уникальным, чтобы не перезаписывать (и, таким образом, принимать неявное владение) объект, созданный в другом месте. .

Для продолжения здесь у вас есть два основных варианта, в зависимости от вашей намеченной цели:

  • Если этот объект ранее управлялся какой-либо другой системой, и теперь вы хотите управлять исключительно с этой конфигурацией Terraform, вы можете сказать Terraform связать существующий объект с блоком resource, который вы написали, и таким образом вести себя так, как если бы этот объект был первоначально создан этим блоком ресурса:

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

    После запуска terraform import вы должны убедиться, что все, что ранее управляло этим объектом, больше не ассоциировалось с ним. Этот объект теперь принадлежит этой конфигурации Terraform и не должен изменяться какой-либо другой системой.

  • Если этот объект управляется какой-либо другой системой, и вы будете sh на продолжайте управлять этим способом, тогда вместо этого вы можете использовать блок data для получения информации об этом существующем объекте для использования в другом месте вашей конфигурации без участия Terraform:

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

    Если вам нужен ресурс Например, местоположение группы в другом месте вашего модуля, вы можете использовать data.azurerm_resource_group.example.location для доступа к нему. Если вы захотите внести какие-либо более поздние изменения в эту группу ресурсов, вы продолжите делать это, используя любую другую систему, которая считается владельцем вашей среды.

Основное различие между ними два подхода - это как Terraform запишет объект в снимки состояния. terraform import заставляет Terraform создавать привязку между конфигурацией ресурса, которую вы написали, и удаленным объектом, идентификатор которого вы указали в командной строке, что отныне неотличимо от Terraform, поскольку он создал этот объект и записал саму привязку в первую очередь. Для ресурса данных Terraform просто считывает данные о существующем объекте и сохраняет его в состоянии, чтобы он мог определить, изменилось ли значение в будущем запуске; он никогда не планирует вносить какие-либо изменения в объект, используемый с блоком data.

0 голосов
/ 25 апреля 2020

Попробуйте добавить ${terraform.workspace} к названию ресурса.

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