[ PROMPT_NODE_24364 ]
Terraform 常见陷阱
[ SKILL_DOCUMENTATION ]
# Terraform 故障排除与最佳实践
常见问题、安全注意事项及最佳实践。
## 状态漂移 (State Drift) 问题
某些资源存在已知的状态漂移。添加生命周期 (lifecycle) 块以防止持续的差异对比:
| 资源 | 漂移属性 | 变通方案 |
|----------|------------------|------------|
| `cloudflare_pages_project` | `deployment_configs.*` | `ignore_changes = [deployment_configs]` |
| `cloudflare_workers_script` | 密钥返回为 REDACTED | `ignore_changes = [secret_text_binding]` |
| `cloudflare_load_balancer` | `adaptive_routing`, `random_steering` | `ignore_changes = [adaptive_routing, random_steering]` |
| `cloudflare_workers_kv` | 键中包含特殊字符 (< 5.16.0) | 升级至 5.16.0+ |
hcl
# 示例:忽略密钥漂移
resource "cloudflare_workers_script" "api" {
account_id = var.account_id
name = "api-worker"
content = file("worker.js")
secret_text_binding { name = "API_KEY"; text = var.api_key }
lifecycle {
ignore_changes = [secret_text_binding]
}
}
## v5 版本重大变更
当前使用 Provider v5 版本(由 OpenAPI 自动生成)。v4 到 v5 存在重大变更:
**资源重命名:**
| v4 资源 | v5 资源 | 备注 |
|-------------|-------------|-------|
| `cloudflare_record` | `cloudflare_dns_record` | |
| `cloudflare_worker_script` | `cloudflare_workers_script` | 注意:复数形式 |
| `cloudflare_worker_*` | `cloudflare_workers_*` | 所有 Worker 资源 |
| `cloudflare_access_*` | `cloudflare_zero_trust_*` | Access → Zero Trust |
**属性变更:**
| v4 属性 | v5 属性 | 资源 |
|--------------|--------------|-----------|
| `zone` | `name` | zone |
| `account_id` | `account.id` | zone (对象语法) |
| `key` | `key_name` | KV |
| `location_hint` | `location` | R2 |
**状态迁移:**
bash
# v5 升级后重命名状态中的资源
terraform state mv cloudflare_record.example cloudflare_dns_record.example
terraform state mv cloudflare_worker_script.api cloudflare_workers_script.api
## 资源特定注意事项
### R2 位置大小写敏感性
**问题:** Terraform 创建 R2 存储桶后,后续应用失败。
**原因:** 位置 (Location) 必须为大写。
**解决方案:** 使用 `WNAM`, `ENAM`, `WEUR`, `EEUR`, `APAC`(不要使用 `wnam`, `enam` 等)。
hcl
resource "cloudflare_r2_bucket" "assets" {
account_id = var.account_id
name = "assets"
location = "WNAM" # 必须大写
}
### KV 特殊字符 (< 5.16.0)
**问题:** 包含 `+`, `#`, `%` 的键会导致编码问题。