← Poskytovatel Cloudflare Terraform / terraform / additional-configurations
Konfigurace pravidel omezení frekvence požadavků pomocí Terraformu
Tato stránka obsahuje příklady vytváření pravidla rate limitingu v zóně nebo účtu pomocí Terraformu.
Pokud používáte Cloudflare API, podívejte se na následující zdroje:
- Vytvoření pravidla omezení frekvence požadavků přes API
- Vytvoření sady pravidel pro omezení frekvence požadavků přes API
Než začnete
Získejte potřebná ID účtu nebo zóny
Konfigurace Terraformu uvedené na této stránce vyžadují ID zóny (nebo ID účtu) zóny či účtu, do kterého budete rulesety nasazovat.
- Chcete-li získat seznam účtů, ke kterým máte přístup, včetně jejich ID, použijte Výpis účtů operace.
- Chcete-li získat seznam zón, ke kterým máte přístup, včetně jejich ID, použijte Výpis zón operace.
Import nebo odstranění existujících sad pravidel
Terraform předpokládá, že má nad rulesety účtu a zóny úplnou kontrolu. Pokud již máte v účtu nebo zóně rulesety nakonfigurované, postupujte jedním z následujících způsobů:
- Import existujících sad pravidel do Terraformu pomocí
cf-terraformingnástroje. Novější verze tohoto nástroje umí vygenerovat definice prostředků pro existující rulesety a importovat jejich konfiguraci do stavu Terraformu. - Začněte od začátku tím, že odstraňování stávajících rulesetů (sady pravidel účtu a zóny s
"kind": "root"a"kind": "zone", v tomto pořadí) a poté nadefinujete konfiguraci svých rulesetů v Terraformu.
Vytvoření pravidla omezení rychlosti na úrovni zóny
Tento příklad vytváří pravidlo rate limitingu v zóně s ID <ZONE_ID> blokující provoz, který překračuje nastavenou rychlost:
Požadovaná oprávnění API tokenu
Alespoň jeden z následujících oprávnění tokenu je povinné:
Zone WAF Write
Nakonfigurujte cloudflare_ruleset ↗ prostředek:
resource "cloudflare_ruleset" "zone_rl" {
zone_id = var.cloudflare_zone_id
name = "Rate limiting for my zone"
description = ""
kind = "zone"
phase = "http_ratelimit"
rules = [{
ref = "rate_limit_api_requests_ip"
description = "Rate limit API requests by IP"
expression = "(http.request.uri.path matches \"^/api/\")"
action = "block"
ratelimit = {
characteristics = ["cf.colo.id", "ip.src"]
period = 60
requests_per_period = 100
mitigation_timeout = 600
}
}]
}resource "cloudflare_ruleset" "zone_rl" {
zone_id = "<ZONE_ID>"
name = "Rate limiting for my zone"
description = ""
kind = "zone"
phase = "http_ratelimit"
rules {
ref = "rate_limit_api_requests_ip"
description = "Rate limit API requests by IP"
expression = "(http.request.uri.path matches \"^/api/\")"
action = "block"
ratelimit {
characteristics = ["cf.colo.id", "ip.src"]
period = 60
requests_per_period = 100
mitigation_timeout = 600
}
}
}Chcete-li vytvořit další pravidlo rate limitingu, přidejte nové rules objekt do stejného cloudflare_ruleset prostředek.
Vytvoření pravidla omezení rychlosti na úrovni účtu
Tento příklad definuje vlastní sada pravidel s jedním pravidlem omezování frekvence požadavků v účtu s ID <ACCOUNT_ID> které blokuje provoz pro /api/ cestu, která překračuje nastavenou rychlost. Druhé cloudflare_ruleset prostředek definuje execute pravidlo, které nasazuje vlastní ruleset pro provoz určený pro example.com.
Požadovaná oprávnění API tokenu
Všechny následující oprávnění tokenu jsou povinné:
Account WAF WriteAccount Rulesets Write
Nakonfigurujte cloudflare_ruleset ↗ prostředek:
resource "cloudflare_ruleset" "account_rl" {
account_id = var.cloudflare_account_id
name = "Rate limiting rules for APIs"
description = ""
kind = "custom"
phase = "http_ratelimit"
rules = [{
ref = "rate_limit_api_ip"
description = "Rate limit API requests by IP"
expression = "http.request.uri.path contains \"/api/\""
action = "block"
ratelimit = {
characteristics = ["cf.colo.id", "ip.src"]
period = 60
requests_per_period = 100
mitigation_timeout = 600
}
}]
}
# Account-level entry point ruleset for the 'http_ratelimit' phase
resource "cloudflare_ruleset" "account_rl_entrypoint" {
account_id = var.cloudflare_account_id
name = "Account-level rate limiting"
description = ""
kind = "root"
phase = "http_ratelimit"
depends_on = [cloudflare_ruleset.account_rl]
rules = [{
# Deploy the previously defined custom ruleset containing a rate limiting rule
ref = "deploy_rate_limit_example_com"
description = "Deploy custom ruleset with RL rule"
expression = "cf.zone.name eq \"example.com\" and cf.zone.plan eq \"ENT\""
action = "execute"
action_parameters = {
id = cloudflare_ruleset.account_rl.id
}
}]
}resource "cloudflare_ruleset" "account_rl" {
account_id = "<ACCOUNT_ID>"
name = "Rate limiting rules for APIs"
description = ""
kind = "custom"
phase = "http_ratelimit"
rules {
ref = "rate_limit_api_ip"
description = "Rate limit API requests by IP"
expression = "http.request.uri.path contains \"/api/\""
action = "block"
ratelimit {
characteristics = ["cf.colo.id", "ip.src"]
period = 60
requests_per_period = 100
mitigation_timeout = 600
}
}
}
# Account-level entry point ruleset for the 'http_ratelimit' phase
resource "cloudflare_ruleset" "account_rl_entrypoint" {
account_id = "<ACCOUNT_ID>"
name = "Account-level rate limiting"
description = ""
kind = "root"
phase = "http_ratelimit"
depends_on = [cloudflare_ruleset.account_rl]
rules {
# Deploy the previously defined custom ruleset containing a rate limiting rule
ref = "deploy_rate_limit_example_com"
description = "Deploy custom ruleset with RL rule"
expression = "cf.zone.name eq \"example.com\" and cf.zone.plan eq \"ENT\""
action = "execute"
action_parameters {
id = cloudflare_ruleset.account_rl.id
}
}
}Chcete-li vytvořit další pravidlo rate limitingu, přidejte nové rules objekt do stejného cloudflare_ruleset prostředek.
Vytvoření pokročilého pravidla omezení rychlosti
Tento příklad vytváří pravidlo rate limitingu v zóně s ID <ZONE_ID> s:
- Vlastní počítací výraz, který zahrnuje pole odpovědi (
http.response.code). - Vlastní odpověď JSON pro požadavky, na které se vztahuje omezení rychlosti.
Požadovaná oprávnění API tokenu
Alespoň jeden z následujících oprávnění tokenu je povinné:
Zone WAF Write
Nakonfigurujte cloudflare_ruleset ↗ prostředek:
resource "cloudflare_ruleset" "zone_rl_custom_response" {
zone_id = var.cloudflare_zone_id
name = "Advanced rate limiting rule for my zone"
description = ""
kind = "zone"
phase = "http_ratelimit"
rules = [{
ref = "rate_limit_example_com_status_404"
description = "Rate limit requests to www.example.com when exceeding the threshold of 404 responses on /status/"
expression = "http.host eq \"www.example.com\" and (http.request.uri.path matches \"^/status/\")"
action = "block"
action_parameters = {
response = {
status_code = 429
content = "{\"response\": \"block\"}"
content_type = "application/json"
}
}
ratelimit = {
characteristics = ["ip.src", "cf.colo.id"]
period = 10
requests_per_period = 5
mitigation_timeout = 30
counting_expression = "(http.host eq \"www.example.com\") and (http.request.uri.path matches \"^/status/\") and (http.response.code eq 404)"
}
}]
}resource "cloudflare_ruleset" "zone_rl_custom_response" {
zone_id = "<ZONE_ID>"
name = "Advanced rate limiting rule for my zone"
description = ""
kind = "zone"
phase = "http_ratelimit"
rules {
ref = "rate_limit_example_com_status_404"
description = "Rate limit requests to www.example.com when exceeding the threshold of 404 responses on /status/"
expression = "http.host eq \"www.example.com\" and (http.request.uri.path matches \"^/status/\")"
action = "block"
action_parameters {
response {
status_code = 429
content = "{\"response\": \"block\"}"
content_type = "application/json"
}
}
ratelimit {
characteristics = ["ip.src", "cf.colo.id"]
period = 10
requests_per_period = 5
mitigation_timeout = 30
counting_expression = "(http.host eq \"www.example.com\") and (http.request.uri.path matches \"^/status/\") and (http.response.code eq 404)"
}
}
}Chcete-li vytvořit další pravidlo rate limitingu, přidejte nové rules objekt do stejného cloudflare_ruleset prostředek.