INTEGRITY Документация

Импорт ресурсов Cloudflare

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

Когда 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, укажите следующие параметры:

  1. Команда для выполнения (например, generate или import).
  2. Ваш адрес электронной почты пользователя Cloudflare: --email или -e.
  3. Ваш API-токен Cloudflare: --token или -t.
  4. Аккаунт и (или) зона, из которых нужно получить ресурсы: --account/--zone или -a/-z.
  5. Ресурсы Cloudflare для генерации конфигурации.

Список поддерживаемых ресурсов доступен в Terraform README ↗.

Импорт существующих ресурсов Cloudflare

Чтобы начать управлять существующими ресурсами Cloudflare в Terraform, например записями DNS, вам потребуется:

Создание конфигурации 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 plan
Terraform 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. Сейчас это ручной процесс, но в будущем он может быть автоматизирован.

  1. Выполните следующую команду:

    cf-terraforming import --resource-type "cloudflare_record" --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_API_KEY --zone $CLOUDFLARE_ZONE_ID
  2. Скопируйте каждый 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/3c0b456bc2aa443089c5f40f45f51b31
cloudflare_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/d09d916d059aa9fc8cb54bdd49deea5f
cloudflare_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/8d6ec0d02c5b22212ff673782c816ef8
cloudflare_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/3766b952a2dda4c47e71952aeef33c77
cloudflare_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 changes
No changes. Infrastructure is up-to-date.