Правила страницы Cloudflare с использованием провайдера terraform-cloudflare не обновляют правила страницы

Я использую провайдера Terraform + Cloudflare.

Я создал правило страницы при первом запуске terraform plan + terraform apply.

Выполнение той же команды второй раз возвращает ошибку:

Ошибка: не удалось создать правило страницы: ошибка makeRequest: HTTP-статус 400: content "{"success":false,"errors":[{"code":1004,"message":" Ошибка проверки правила страницы: см. Сообщения для details."}],"messages":[{"code":1,"message":". independentTargetUrl: в вашей зоне уже есть существующее правило страницы с этим URL. Если вы изменяете только настройки правила страницы, используйте вместо этого параметр "Изменить правило страницы", "type":null}], "result":null} "

TL; DR: как я могу заставить Terraform обновлять существующее правило страницы только путем изменения определения в этом файле? Разве это не должно было работать?

Это файл terraform.tf:

provider "cloudflare" {
  email = "__EMAIL__"
  api_key = "__GLOBAL_API_KEY__"
}

resource "cloudflare_zone_settings_override" "default_cloudflare_config" {
  zone_id = "__ZONE_ID__"

  settings {
    always_online = "on"
    always_use_https = "off"

    min_tls_version = "1.0"

    opportunistic_encryption = "on"

    tls_1_3 = "zrt"
    automatic_https_rewrites = "on"
    ssl = "strict"

    # 8 days
    browser_cache_ttl = "691200"

  }
}


resource "cloudflare_page_rule" "rule_bypass_wp_admin" {
  target = "*.__DOMAIN__/*wp-admin*"
  zone_id = "__ZONE_ID__"
  priority = 2
  status = "active"

  actions {
    always_use_https = true
    always_online = "off"
    cache_level = "bypass"
    disable_apps = "true"
    disable_performance = true
    disable_security = true
  }
}

3 ответа

Добавьте следующую строку в определение правила страницы:

      `lifecycle {
    ignore_changes = [priority]
  }`

Это заставит Terraform игнорировать любые изменения в этом поле. Таким образом, когда вы запускаете terraform apply Terraform воспринимает изменения как обновление существующих ресурсов, а не как создание новых ресурсов.

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

СОВЕТ: беги terraform plan -out=tfplanэто распечатает план, который будет применен на экране и в файле. Затем вы получите некоторое представление об изменениях, которые внесет Terraform, и шанс обнаружить некоторые непреднамеренные изменения.

Я все еще не могу обновить через Terraform, поэтому я использовал Python, чтобы удалить его перед воссозданием.

        # Delete existing page rules using API before readding with Terraform
        # For some reason, it I could not update then with Terraform without deleting first
        # https://stackru.com/questions/63942345/cloudflare-page-rules-using-terraform-cloudflare-provider-does-not-update-page-r
        page_rules = cf.zones.pagerules.get(zone_id)
        print(page_rules)
        for pr in page_rules:
            cf.zones.pagerules.delete(zone_id, pr.get('id'))
        page_rules = cf.zones.pagerules.get(zone_id)
        if page_rules:
            exit('Failed to delete existing page rules for site')

Попробуйте удалить always_use_httpsаргумент так ваш actionsблок выглядит так:

        actions {
    always_online       = "off"
    cache_level         = "bypass"
    disable_apps        = "true"
    disable_performance = true
    disable_security    = true
  }

Сегодня я обнаружил, что с этим аргументом есть проблема, похоже на ошибку.

Другие вопросы по тегам