1

我正在使用 Terraform + Cloudflare 提供程序。

我在第一次运行terraform plan + terraform apply时创建了一个页面规则。

再次运行相同的命令会返回错误:

错误:无法创建页面规则:来自 makeRequest 的错误:HTTP 状态 400:内容 "{"success":false,"errors":[{"code":1004,"message":"页面规则验证失败:请参阅消息details."}],"messages":[{"code":1,"message":".distinctTargetUrl: 您的区域已经有一个具有该 URL 的现有页面规则。如果您只修改页面规则设置,请改用编辑页面规则选项","type":null}],"result":null}"

TLDR:如何让 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
  }
}
4

2 回答 2

1

在您的页面规则定义中添加以下行:

lifecycle {
  ignore_changes = [priority]
}

这将指示 Terraform 忽略此字段中的任何更改。这样,当您运行terraform applyTerraform 时,会将更改作为对现有资源的更新而不是创建新资源。

在这种情况下,Terraform 尝试创建一个与 Cloudflare 限制冲突的新页面规则,即您不能让多个页面规则作用于同一资源路径

提示:运行terraform plan -out=tfplan此程序将打印出将在屏幕上应用的计划并归档。然后,您可以深入了解 Terraform 将进行的更改,并有机会发现一些意外更改。

于 2021-09-13T09:49:55.357 回答
0

我仍然无法通过 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://stackoverflow.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')

于 2020-09-18T03:37:38.543 回答