С Terraform 1.5 и более поздними версиями вы можете использовать блок import
для управления импортом ресурсов непосредственно в вашей конфигурации. Эта функция упрощает процесс импорта существующей инфраструктуры в состояние Terraform, устраняя необходимость в отдельной команде CLI terraform import
.
В этой статье мы объясним блок импорта и как его использовать для импорта различных ресурсов.
Что такое блок импорта Terraform?
Блок import
Terraform, введенный в Terraform v1.5.0, предоставляет декларативный подход для импорта существующих ресурсов инфраструктуры в файл состояния Terraform. Он позволяет импортировать ресурсы стать частью процесса планирования Terraform — аналогично другим управляемым ресурсам — вместо того, чтобы рассматриваться как прямая операция изменения состояния.
В результате блок import
улучшает прозрачность и выравнивает импорт ресурсов с основными принципами инфраструктуры как кода (IaC), позволяя пользователям управлять своей инфраструктурой более эффективно и предсказуемо.
Синтаксис блока import
в Terraform выглядит следующим образом:
import {
to = <resource_address>
id = <resource_identifier>
}
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
указывает имя существующего бакета:
resource "aws_s3_bucket" "example" {
bucket = "my-existing-bucket"
}
import {
to = aws_s3_bucket.example
id = "my-existing-bucket"
}
Блок 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
) соответствуют конфигурации существующего экземпляра:
resource "aws_instance" "example" {
ami = "ami-0abcdef1234567890" # Replace with the actual AMI ID
instance_type = "t2.micro"
}
import {
to = aws_instance.example
id = "i-1234567890abcdef0"
}
В блоке 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:
resource "azurerm_resource_group" "example" {
name = "example-resource-group"
location = "East US"
}
import {
to = azurerm_resource_group.example
id = "/subscriptions/<subscription_id>/resourceGroups/example-resource-group"
}
Блок импорта:
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