在使用Terraform创建多条规则配置时,如果需要严格控制规则的创建顺序和生效顺序,可以使用depends_on参数建立显式依赖关系,确保规则按指定顺序依次创建并生效。
使用场景
在阿里云ESA产品的规则功能使用场景中,规则配置通常是有优先级或执行顺序的(例如:先匹配具体路径的规则,再匹配通用规则)。如果您使用Terraform创建多条规则配置,那么在代码执行阶段Terraform默认会尝试并行创建资源,而由于规则配置在服务端的生效时间存在差异,因此可能会导致规则列表无法按您预期的顺序生效。要满足规则配置按指定顺序生效,严格保证第一条规则完全创建并生效后,再创建第二条,以此类推,就需要显式地使用参数depends_on建立链式依赖。
参数说明
在Terraform中,大多数依赖关系是隐式的(即通过引用另一个资源的属性,如id或name,Terraform会自动推断出依赖顺序)。但是,当两个资源之间没有直接的属性引用,但逻辑上必须先创建A再创建B时(例如:B资源依赖于A资源侧边完成的一些后台进程,或者仅仅是为了控制执行顺序),您就需要使用显式依赖,即depends_on参数。
您可以在resource或module块中添加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
]
}