Как использовать блок импорта Terraform для импорта ресурсов

С Terraform 1.5 и более поздними версиями вы можете использовать блок import для управления импортом ресурсов непосредственно в вашей конфигурации. Эта функция упрощает процесс импорта существующей инфраструктуры в состояние Terraform, устраняя необходимость в отдельной команде CLI terraform import.

В этой статье мы объясним блок импорта и как его использовать для импорта различных ресурсов.

Что такое блок импорта Terraform?

Блок import Terraform, введенный в Terraform v1.5.0, предоставляет декларативный подход для импорта существующих ресурсов инфраструктуры в файл состояния Terraform. Он позволяет импортировать ресурсы стать частью процесса планирования Terraform — аналогично другим управляемым ресурсам — вместо того, чтобы рассматриваться как прямая операция изменения состояния. 

В результате блок import улучшает прозрачность и выравнивает импорт ресурсов с основными принципами инфраструктуры как кода (IaC), позволяя пользователям управлять своей инфраструктурой более эффективно и предсказуемо. 

Синтаксис блока import в Terraform выглядит следующим образом:

Plain Text

 

  • to: Указывает адрес ресурса в вашей конфигурации, куда будет сопоставлен импортированный ресурс.
  • id: Определяет уникальный идентификатор существующего ресурса в API провайдера. Убедитесь, что ваш провайдер Terraform правильно настроен для доступа к импортируемому ресурсу.

Обратите внимание, что некоторые типы ресурсов могут иметь дополнительные требования или ограничения для импорта.

Блок импорта против Команды импорта Terraform

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

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

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

Пример 1: Использование блока импорта Terraform для импорта S3-бакета

Предположим, у нас есть существующий AWS S3 бакет (my-existing-bucket), который вы хотите управлять с помощью Terraform.

Блок resource определяет S3-бакет (aws_s3_bucket.example), а атрибут bucket указывает имя существующего бакета:

Plain Text

 

Блок import связывает существующий S3-бакет с ресурсом Terraform.

  • to: Соответствует импортированному ресурсу по адресу блока resource (aws_s3_bucket.example)
  • id: Указывает уникальный идентификатор бакета (my-existing-bucket).

Когда вы запускаете terraform plan, Terraform считывает блок import, проверяет состояние существующего S3-бакета и показывает предварительный просмотр изменений, которые он внесет в файл состояния. Затем, после того как мы запустим terraform apply, Terraform обновляет файл состояния, чтобы включить существующий бакет, сопоставляя его с ресурсом aws_s3_bucket.example.

После выполнения terraform apply и успешного импорта ресурса рекомендуется удалить блок import. Сохранение его не причинит вреда, но удаление помогает поддерживать чистоту конфигурации и минимизирует потенциальную путаницу при управлении состоянием в будущем.

Пример 2: Использование блока Terraform Import для импорта экземпляра EC2

Рассмотрим еще один пример: у нас есть существующий экземпляр EC2 с идентификатором i-1234567890abcdef0, который мы хотим передать под управление Terraform.

Мы определяем ресурс aws_instance, который хотим, чтобы Terraform управлял в блоке resource. Убедитесь, что атрибуты (например, ami, instance_type) соответствуют конфигурации существующего экземпляра:

Plain Text

 

В блоке import:

  • to: Соответствует ресурсу в вашей конфигурации (aws_instance.example) существующему ресурсу.
  • id: Указывает уникальный идентификатор экземпляра EC2, который вы импортируете.

После того как вы добавите блок ресурса и инструкцию импорта в файл конфигурации Terraform, выполните terraform plan, чтобы просмотреть изменения. Затем выполните terraform apply, чтобы импортировать ресурс в файл состояния Terraform.

После импорта Terraform будет управлять существующим экземпляром EC2, гарантируя, что его конфигурация останется декларативной.

Пример 3: Использование блока импорта Terraform для импорта группы ресурсов Azure

В следующем примере мы будем импортировать группу ресурсов Azure.

У нас есть существующая группа ресурсов Azure с именем example-resource-group в регионе East US, и мы хотим управлять ею с помощью Terraform.

Сначала в блоке resource мы определяем ресурс azurerm_resource_group, который будет управляться Terraform:

Plain Text

 

Блок импорта:

  • to: Соответствует ресурсу в вашей конфигурации (azurerm_resource_group.example) существующему ресурсу Azure.
  • id: Указывает полностью квалифицированный идентификатор ресурса Azure для группы ресурсов. Не забудьте заменить <subscription_id> на ваш фактический идентификатор подписки.

Добавьте ресурс и блок импорта в ваш файл конфигурации Terraform. Затем выполните команду terraform plan, чтобы предварительно просмотреть изменения, и выполните terraform apply, чтобы применить изменения и импортировать ресурс в файл состояния Terraform.

Можно ли использовать блок импорта Terraform условно?

Блок импорта Terraform предназначен для декларативного использования и требует конкретных значений, известных на этапе планирования. Поэтому его нельзя использовать условно в вашем коде Terraform.

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

Ключевые моменты

Введение блока импорта в Terraform 1.5+ упрощает управление ресурсами, позволяя прямо импортировать и определять ресурсы в файлах конфигурации. Это соответствует принципам IaC, уменьшая сложность и упрощая интеграцию существующей инфраструктуры в конфигурации Terraform.

Source:
https://dzone.com/articles/how-to-use-terraform-import-block