使用depends_on参数强制按顺序创建多条规则配置

更新时间:
复制 MD 格式

在使用Terraform创建多条规则配置时,如果需要严格控制规则的创建顺序和生效顺序,可以使用depends_on参数建立显式依赖关系,确保规则按指定顺序依次创建并生效。

使用场景

在阿里云ESA产品的规则功能使用场景中,规则配置通常是有优先级或执行顺序的(例如:先匹配具体路径的规则,再匹配通用规则)。如果您使用Terraform创建多条规则配置,那么在代码执行阶段Terraform默认会尝试并行创建资源,而由于规则配置在服务端的生效时间存在差异,因此可能会导致规则列表无法按您预期的顺序生效。要满足规则配置按指定顺序生效,严格保证第一条规则完全创建并生效后,再创建第二条,以此类推,就需要显式地使用参数depends_on建立链式依赖。

参数说明

Terraform中,大多数依赖关系是隐式的(即通过引用另一个资源的属性,如idname,Terraform会自动推断出依赖顺序)。但是,当两个资源之间没有直接的属性引用,但逻辑上必须先创建A再创建B时(例如:B资源依赖于A资源侧边完成的一些后台进程,或者仅仅是为了控制执行顺序),您就需要使用显式依赖,即depends_on参数。

您可以在resourcemodule块中添加depends_on参数,值为一个资源地址列表。

注意事项

  • 不要滥用:如果可以通过引用属性(如id)来建立依赖,优先使用隐式依赖。隐式依赖更清晰且易于维护。只有当隐式依赖无法表达您的意图时,才使用depends_on

  • 影响性能:使用depends_on会强制资源串行执行,可能会增加terraform apply的总耗时,因为它阻止了Terraform并行创建本可以并行的资源。

使用示例

下面的示例以创建缓存规则为例,这段代码实现了严格的串行依赖关系:

  • rule_1:首先创建(无依赖)。

  • rule_2:必须等待rule_1创建完成后才开始创建。

  • rule_3:必须等待rule_2创建完成后才开始创建。

terraform {
  required_providers {
    alicloud = {
      source  = "aliyun/alicloud"
      version = "~> 1.244.0"
    }
  }
}

# 查询已有站点信息
data "alicloud_esa_sites" "default" {
  plan_subscribe_type = "enterpriseplan"
}

# 规则 1: 针对静态图片资源的缓存(优先执行,无依赖)
resource "alicloud_esa_cache_rule" "rule_1" {
  site_id              = data.alicloud_esa_sites.default.sites.0.id
  rule_name            = "rule_1_images"
  rule                 = "http.host eq \"example.com\" and http.uri starts_with \"/images/\""
  rule_enable          = "on"
  site_version         = "0"

  user_device_type     = "off"
  browser_cache_mode   = "cache"
  browser_cache_ttl    = "3600"
  edge_cache_mode      = "cache"
  edge_cache_ttl       = "3600"

  user_language        = "off"
  query_string_mode    = "ignore_all"
  bypass_cache         = "cache_all"
  cache_deception_armor = "off"
  serve_stale          = "off"
}

# 规则 2: 针对 API 接口的不缓存策略(依赖 rule_1)
resource "alicloud_esa_cache_rule" "rule_2" {
  site_id            = data.alicloud_esa_sites.default.sites.0.id
  rule_name          = "rule_2_api_no_cache"
  rule                 = "http.host eq \"example.com\" and http.uri starts_with \"/api/\""
  rule_enable        = "on"
  site_version       = "0"

  user_device_type   = "off"
  browser_cache_mode = "no_cache"
  edge_cache_mode    = "no_cache"

  user_language      = "off"
  query_string_mode  = "retain_all"
  bypass_cache       = "cache_all"

  # 显式声明依赖:等待 rule_1
  depends_on = [
    alicloud_esa_cache_rule.rule_1
  ]
}

# 规则 3: 默认兜底规则(依赖 rule_2)
resource "alicloud_esa_cache_rule" "rule_3" {
  site_id            = data.alicloud_esa_sites.default.sites.0.id
  rule_name          = "rule_3_default_fallback"
  rule               = "http.host eq \"example.com\""
  rule_enable        = "on"
  site_version       = "0"

  user_device_type   = "off"
  browser_cache_mode = "cache"
  browser_cache_ttl  = "600"
  edge_cache_mode    = "follow_origin"
  edge_cache_ttl     = "600"

  user_language      = "off"
  query_string_mode  = "ignore_all"

  # 显式声明依赖:等待 rule_2(形成链式依赖 rule_1 -> rule_2 -> rule_3)
  depends_on = [
    alicloud_esa_cache_rule.rule_2
  ]
}