← Провайдер Cloudflare Terraform / terraform / advanced-topics
Импорт ресурсов Cloudflare
Важно понимать, что Terraform может управлять только той конфигурацией, которую он создал сам или о которой ему явно сообщили постфактум. Это ограничение связано с тем, что Terraform должен оставаться единственным источником истины для ресурсов, которыми управляет. Он использует два типа файлов, чтобы понимать, какими ресурсами управляет и в каком они состоянии. Terraform определяет, когда и как вносить изменения, на основе следующего:
- A файл конфигурации ↗ (заканчивающихся на
.tf) который определяет конфигурацию ресурсов, управляемых Terraform. Именно с ним вы работали на шагах руководства. - Локальный файл состояния ↗ , который сопоставляет имена ресурсов, заданные в файле конфигурации, например,
cloudflare_load_balancer.www-lbк ресурсам, которые уже существуют в Cloudflare.
Когда Terraform обращается к API Cloudflare для создания новых ресурсов, как описано в разделе руководство, он сохраняет эти ID в файле состояния. По умолчанию Terraform использует terraform.tfstate файл в вашем каталоге, но это также может быть удалённое расположение ↗. Позже эти ID ищутся и обновляются при вызове terraform plan и terraform apply.
Если вы настраивали Cloudflare другими способами, например, войдя в панель управления Cloudflare или выполнив curl вызовы к api.cloudflare.com, у Terraform еще нет этих ID ресурсов в файле состояния. Чтобы управлять этой уже существующей конфигурацией, сначала воспроизведите ее в файле конфигурации, а затем импортируйте ресурсы по отдельности, указав их ID и имена ресурсов.
cf-terraforming
cf-terraforming ↗ помогает существующим клиентам Cloudflare начать работу с Terraform. В настоящее время cf-terraforming помогает сгенерировать конфигурацию состояния Terraform, получая все ресурсы указанного типа из выбранного вами аккаунта и (или) зоны.
Установка
Прежде чем начать, установите cf-terraforming.
Если вы используете Homebrew в macOS, откройте терминал и выполните следующие команды:
brew tap cloudflare/cloudflare
brew install cloudflare/cloudflare/cf-terraformingЕсли вы используете другую операционную систему, скачать последний релиз ↗ из cf-terraforming репозиторий GitHub.
Чтобы просмотреть файл справки, выполните cf-terraforming или cf-terraforming -h.
Базовое использование
Чтобы использовать cf-terraforming, укажите следующие параметры:
- Команда для выполнения (например,
generateилиimport). - Ваш адрес электронной почты пользователя Cloudflare:
--emailили-e. - Ваш API-токен Cloudflare:
--tokenили-t. - Аккаунт и (или) зона, из которых нужно получить ресурсы:
--account/--zoneили-a/-z. - Ресурсы Cloudflare для генерации конфигурации.
Список поддерживаемых ресурсов доступен в Terraform README ↗.
Импорт существующих ресурсов Cloudflare
Чтобы начать управлять существующими ресурсами Cloudflare в Terraform, например записями DNS, вам потребуется:
- Конфигурация Terraform для этого ресурса (определённая в
.tfфайл) - Соответствующий файл состояния Terraform для этого ресурса (определённый в
.tfstateфайл)
Создание конфигурации Terraform с помощью cf-terraforming
Если у вас не определён файл конфигурации Terraform, вам понадобится provider блок, определённый следующим образом:
provider 'cloudflare' {
# Cloudflare email saved in $CLOUDFLARE_EMAIL
# Cloudflare API token saved in $CLOUDFLARE_API_TOKEN
}Не забывайте хранить учётные данные в переменных окружения или файлах terraform autovars, которые не должны попадать в систему контроля версий вместе с исходным кодом.
Начните с вызова cf-terraforming generate , чтобы сгенерировать конфигурацию Terraform для записей DNS в зоне, которой вы хотите управлять через Terraform.
cf-terraforming generate --email $CLOUDFLARE_EMAIL --token $CLOUDFLARE_API_TOKEN -z 1109d899a5ff5fd74bc01e581693685b --resource-type cloudflare_record > importing-example.tfЕсли бы вы не перенаправили вывод в importing-example.tf файла результат, отображаемый в стандартном выводе (окне терминала), будет выглядеть следующим образом:
resource "cloudflare_record" "terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31" {
name = "@"
type = "A"
ttl = 1
proxied = true
value = "192.0.2.1"
zone_id = "1109d899a5ff5fd74bc01e581693685b"
}
resource "cloudflare_record" "terraform_managed_resource_5e10399a590a45279f09aa8fb1163354" {
name = "www"
type = "CNAME"
ttl = 1
proxied = true
value = "mitigateddos.net"
zone_id = "1109d899a5ff5fd74bc01e581693685b"
}
resource "cloudflare_record" "terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248" {
name = "a123"
type = "NS"
ttl = 300
proxied = false
value = "rafe.ns.cloudflare.com"
zone_id = "1109d899a5ff5fd74bc01e581693685b"
}
resource "cloudflare_record" "terraform_managed_resource_5799bb01054843eea726758f935d2aa2" {
name = "a123"
type = "NS"
ttl = 300
proxied = false
value = "terin.ns.cloudflare.com"
zone_id = "1109d899a5ff5fd74bc01e581693685b"
}Вызов terraform plan на этом этапе попытается создать эти ресурсы так, как будто их не существует, поскольку они отсутствуют в локальном файле состояния:
terraform planTerraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 will be created
+ resource "cloudflare_record" "terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31" {
+ id = (known after apply)>
+ created_on = (known after apply)
+ domain = "mitigateddos.net"
+ hostname = (known after apply)
+ metadata = (known after apply)
+ modified_on = (known after apply)
+ name = "mitigateddos.net"
+ proxiable = (known after apply)
+ proxied = true
+ ttl = 1
+ type = "A"
+ value = "192.0.2.1"
+ zone_id = "1109d899a5ff5fd74bc01e581693685b"
}
# cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354 will be created
+ resource "cloudflare_record" "terraform_managed_resource_5e10399a590a45279f09aa8fb1163354" {
+ id = (known after apply)
+ created_on = (known after apply)
+ domain = "mitigateddos.net"
+ hostname = (known after apply)
+ metadata = (known after apply)
+ modified_on = (known after apply)
+ name = "www.mitigateddos.net"
+ proxiable = (known after apply)
+ proxied = true
+ ttl = 1
+ type = "CNAME"
+ value = "mitigateddos.net"
+ zone_id = "1109d899a5ff5fd74bc01e581693685b"
}
# cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248 will be created
+ resource "cloudflare_record" "terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248" {
+ id = (known after apply)
+ created_on = (known after apply)
+ domain = "mitigateddos.net"
+ hostname = (known after apply)
+ metadata = (known after apply)
+ modified_on = (known after apply)
+ name = "a123.mitigateddos.net"
+ proxiable = (known after apply)
+ proxied = false
+ ttl = 300
+ type = "NS"
+ value = "rafe.ns.cloudflare.com"
+ zone_id = "1109d899a5ff5fd74bc01e581693685b"
}
# cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2 will be created
+ resource "cloudflare_record" "terraform_managed_resource_5799bb01054843eea726758f935d2aa2" {
+ id = (known after apply)
+ created_on = (known after apply)
+ domain = "mitigateddos.net"
+ hostname = (known after apply)
+ metadata = (known after apply)
+ modified_on = (known after apply)
+ name = "a123.mitigateddos.net"
+ proxiable = (known after apply)
+ proxied = false
+ ttl = 300
+ type = "NS"
+ value = "terin.ns.cloudflare.com"
+ zone_id = "1109d899a5ff5fd74bc01e581693685b"
}
Plan: 4 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.Чтобы это исправить, импортируйте фактическое состояние этих ресурсов из Cloudflare в файл состояния Terraform (.tfstate).
Импорт ресурсов в состояние Terraform
cf-terraforming позволяет импортировать локальное состояние (.tfstate файл) для тех же ресурсов, которые вы импортировали во время настройки.
Когда вы выполняете cf-terraforming import ..., вы получите список terraform import ... команды, которые нужно будет выполнить вручную после этого, чтобы импортировать эти ресурсы в состояние Terraform. Сейчас это ручной процесс, но в будущем он может быть автоматизирован.
-
Выполните следующую команду:
cf-terraforming import --resource-type "cloudflare_record" --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_API_KEY --zone $CLOUDFLARE_ZONE_ID -
Скопируйте каждый
terraform import ...команду, указанную в выводе, и выполните её. Terraform импортирует каждый ресурс по отдельности в состояние Terraform.
Например, если вывод первой команды (cf-terraforming import ...) содержал следующее terraform команды:
terraform import cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 1109d899a5ff5fd74bc01e581693685b/3c0b456bc2aa443089c5f40f45f51b31
terraform import cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354 1109d899a5ff5fd74bc01e581693685b/d09d916d059aa9fc8cb54bdd49deea5f
terraform import cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248 1109d899a5ff5fd74bc01e581693685b/8d6ec0d02c5b22212ff673782c816ef8
terraform import cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2 1109d899a5ff5fd74bc01e581693685b/3766b952a2dda4c47e71952aeef33c77Каждую команду нужно выполнять в терминале по отдельности:
terraform import cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 1109d899a5ff5fd74bc01e581693685b/3c0b456bc2aa443089c5f40f45f51b31cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31: Importing from ID "1109d899a5ff5fd74bc01e581693685b/3c0b456bc2aa443089c5f40f45f51b31"...
cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31: Import complete!
Imported cloudflare_record [id=3c0b456bc2aa443089c5f40f45f51b31]
cloudflare_record.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31: Refreshing state... [id=3c0b456bc2aa443089c5f40f45f51b31]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.terraform import cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354 1109d899a5ff5fd74bc01e581693685b/d09d916d059aa9fc8cb54bdd49deea5fcloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354: Importing from ID "1109d899a5ff5fd74bc01e581693685b/d09d916d059aa9fc8cb54bdd49deea5f"...
cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354: Import complete!
Imported cloudflare_record [id=d09d916d059aa9fc8cb54bdd49deea5f]
cloudflare_record.terraform_managed_resource_5e10399a590a45279f09aa8fb1163354: Refreshing state... [id=d09d916d059aa9fc8cb54bdd49deea5f]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.terraform import cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248 1109d899a5ff5fd74bc01e581693685b/8d6ec0d02c5b22212ff673782c816ef8cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248: Importing from ID "1109d899a5ff5fd74bc01e581693685b/8d6ec0d02c5b22212ff673782c816ef8"...
cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248: Import complete!
Imported cloudflare_record [id=8d6ec0d02c5b22212ff673782c816ef8]
cloudflare_record.terraform_managed_resource_de1cb74bae184b569bb7f83fefe72248: Refreshing state... [id=8d6ec0d02c5b22212ff673782c816ef8]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.terraform import cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2 1109d899a5ff5fd74bc01e581693685b/3766b952a2dda4c47e71952aeef33c77cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2: Importing from ID "1109d899a5ff5fd74bc01e581693685b/3766b952a2dda4c47e71952aeef33c77"...
cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2: Import complete!
Imported cloudflare_record [id=3766b952a2dda4c47e71952aeef33c77]
cloudflare_record.terraform_managed_resource_5799bb01054843eea726758f935d2aa2: Refreshing state... [id=3766b952a2dda4c47e71952aeef33c77]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.Если сейчас выполнить terraform plan, вы заметите, что Terraform больше не будет пытаться заново создать cloudflare_record ресурсы:
terraform plan | grep changesNo changes. Infrastructure is up-to-date.