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
.