理解 Terraform,必须先接受一个核心心智:
Terraform 关注的是目标状态,不是手工操作过程。
也就是说你写的不是:
- 先干什么
- 再干什么
- 最后干什么
你写的是:
- 最终要有哪些资源
- 它们之间什么关系
- 配置应该是什么
- 依赖怎么连接
比如:
resource "aws_s3_bucket" "assets" {
bucket = "software-city-assets-prod"
}这段代码不是在说“现在执行创建桶命令”。
它在说:
城市里应该存在一个叫 software-city-assets-prod 的对象存储仓库。
如果已经存在,Terraform 会比对。 如果不存在,它会创建。 如果配置变了,它会评估修改。 如果蓝图删掉了,它会考虑销毁。
这和脚本式思维完全不同。
脚本思维
= 命令列表
Terraform 思维
= 目标城市蓝图