后端与接口
用 Terraform 声明式管理多云基础设施时的工作流与最…
当你需要用代码声明式地定义、预览、部署和管理云基础设施(AWS/Azure/GCP 等)时,按此流程组织资源、模块、状态与 CI/CD。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Terraform 声明式管理多云基通用
解决思路
- 用 terraform init 初始化工作目录;需要升级 provider 版本时用 terraform init -upgrade;需要指定后端配置时用 terraform init -backend-config="bucket=my-state-bucket"。
- 用 terraform plan 生成变更计划;用 terraform plan -out=tfplan 保存计划文件;用 terraform plan -var="region=us-west-2" -var="instance_type=t2.micro" 传入变量。
- 用 terraform apply 交互式确认应用;用 terraform apply -auto-approve 跳过确认;用 terraform apply tfplan 应用已保存的计划文件。
- 用 terraform destroy 交互式销毁;用 terraform destroy -auto-approve 跳过确认销毁。
- 用 resource 块声明基础设施对象,语法为 resource "resource_type" "resource_name" { ... },并在其中使用嵌套块和参数。
- 用 provider 块配置云厂商,例如 provider "aws" { region = "us-west-2" default_tags { tags = { ManagedBy = "Terraform" } } }。
- 用 lifecycle 块控制资源生命周期:create_before_destroy 先建后删、prevent_destroy 防止误删、ignore_changes 忽略指定属性变更、replace_triggered_by 在依赖资源变化时强制替换。
- 用 data 块查询 Terraform 外部或其它配置已存在的资源,例如 data "aws_ami" "ubuntu"、data "aws_availability_zones" "available"、data "terraform_remote_state" "network",并在资源中通过 data.<type>.<name>.<attr> 引用。
- 用 variable 块定义输入变量,支持 string、number、bool、list(string)、map(string)、object 等类型,并用 validation 块做取值校验。
- 用命令行 -var、-var-file="production.tfvars" 或环境变量 TF_VAR_region=us-east-1 设置变量值。
- 用 output 块暴露基础设施信息,用 sensitive = true 标记敏感输出,用 depends_on 控制输出时机;用 terraform output、terraform output <name>、terraform output -json、terraform output -raw <name> 读取输出。
- 用 locals 块为表达式命名以便复用,例如 common_tags、name_prefix、availability_zones,并用 merge() 合并标签。
- 用模块组织可复用资源:模块目录包含 main.tf、variables.tf、outputs.tf、README.md;通过 module "vpc" { source = "./modules/vpc" ... } 调用;支持本地路径、Terraform Registry、GitHub、Git、S3 等来源;用 version 约束版本(如 "~> 5.0"、">= 3.0, < 4.0");用 count 或 for_each 批量创建模块实例。
- 用远程后端管理状态:S3 后端配合 DynamoDB 锁表(dynamodb_table = "terraform-locks",hash_key = "LockID")、azurerm 后端、Terraform Cloud 的 cloud 块、Consul 后端;启用 encrypt = true。
- 用状态命令维护状态:terraform state list、terraform state show、terraform state rm、terraform state mv、terraform show、terraform show -json、terraform state pull、terraform state push。
- 用 terraform import 导入已存在资源,例如 terraform import aws_instance.example i-0abc123def456 或 terraform import module.network.aws_vpc.main vpc-0123456789abcdef。
- 用 terraform init -migrate-state 迁移状态;用 terraform init -backend-config=... 切换后端配置。
- 用 workspace 隔离环境:terraform workspace list/new/select/show/delete;在配置中用 terraform.workspace 区分环境,例如按 workspace 选择实例类型和数量。
- 用 required_providers 和 required_version 锁定 provider 与 Terraform 版本;用 provider alias 配置多区域或多云实例,并在资源中通过 provider = aws.east 指定;在模块中通过 providers = { aws = aws, aws.dr = aws.dr } 传递 provider。
- 用 dynamic 块动态生成重复的嵌套块,例如根据 var.ingress_rules 生成多个 ingress 块。
- 用 for_each 和 count 元参数批量创建资源;用 count = var.create_db ? 1 : 0 做条件创建。
- 用条件表达式(condition ? true_val : false_val)按环境选择不同配置。
- 用内置函数处理数据:upper/lower/title、length/element/join、min/max、tostring/toset、merge、file/templatefile、base64encode/base64decode、timestamp、cidrsubnets 等。
- 用 depends_on 显式声明无法自动推断的依赖;模块之间也可用 depends_on。
- 用 provisioner 执行脚本:local-exec 在本地执行命令(支持 when = destroy、on_failure = continue)、remote-exec 通过 SSH 在远程执行 inline 命令、file 上传文件到远程主机;使用前需配置 connection 块。
- 遵循状态管理最佳实践:团队协作必须用远程状态、启用状态锁、启用加密、定期备份状态。
- 遵循代码组织最佳实践:按 environments/dev、staging、production 与 modules/、global/ 分层组织目录。
- 遵循变量管理最佳实践:为每个变量写 description、类型和默认值,并用 validation 校验取值范围。
- 遵循命名规范:资源名使用描述性名称,标签中拼接 project、environment、序号等。
- 遵循 DRY 原则:用 locals 定义 common_tags 等重复值,并用 merge() 合并。
- 遵循安全最佳实践:绝不硬编码凭证,改用环境变量或 IAM 角色;敏感输出加 sensitive = true;为 S3 等资源启用服务端加密。
- 用 terraform validate 校验语法、terraform fmt -recursive 格式化代码、terraform plan -out=tfplan 后再 terraform show tfplan 审查计划。
- 在 .gitignore 中排除 .terraform/、*.tfstate、*.tfstate.*、crash.log、*.tfvars、override.tf、*_override.tf、.terraformrc、*.tfplan 等文件。
- 为模块编写 README.md,包含描述、要求、providers、输入、输出和示例用法;模块版本固定到主版本(如 "~> 5.0")。
- 用 provider 的 default_tags 统一打标签,包含 Project、Environment、ManagedBy、Owner、CostCenter、Compliance 等。
- 在 CI/CD 中集成 Terraform:GitHub Actions 用 hashicorp/setup-terraform,依次执行 fmt -check -recursive、init、validate、plan、apply(仅 main 分支 push 时 apply);GitLab CI 分 validate/plan/apply 阶段并用 artifacts 传递 tfplan;Jenkins 用 credentials 和 input 审批;Azure DevOps 用 TerraformInstaller 和 TerraformTaskV2。
- 用 pre-commit 钩子集成 terraform_fmt、terraform_validate、terraform_docs、terraform_tflint、terraform_tfsec、terraform_checkov。
- 用 Terratest 编写 Go 自动化测试,通过 terraform.InitAndApply 和 terraform.Output 验证基础设施。
- 用 terraform console 交互式调试表达式;用 terraform graph 生成 DOT 依赖图并配合 Graphviz 转成图片;用 terraform taint/untaint 标记资源重建;用 terraform providers、terraform providers schema -json、terraform providers lock 管理 provider。
适用边界 · 注意事项
- 需要先安装 Terraform CLI 并具备至少一个云厂商(AWS/Azure/GCP)账号与凭证,否则无法执行。
- 不熟悉命令行、Git 或云基础设施基本概念时,直接上手容易误操作生产环境。
- 对无法用声明式 API 表达、需要复杂命令式编排的场景,Terraform 并非最佳选择。