Outputs
输出与 sensitive。
Outputs 输出与敏感输出
这一课你将能做到
- 定义 output 把资源创建后才知道的信息(公网 IP、域名、ARN)暴露给使用者
- 用
terraform output命令按名查询输出,并在脚本/CI 中消费这些值 - 正确处理敏感输出,理解 root module 与子模块 output 在可见性上的差异
为什么要学
apply 跑完之后,真正要告诉别人的信息往往是「apply 之后才存在」的:EC2 的公网 IP、ALB 的 DNS 名、RDS 的端点、S3 桶的 ARN。你不能指望每个人去翻 state 或上控制台找。output 就是 Terraform 配置的「返回值」——apply 结束时整齐打印,脚本里可查询,子模块还能把内部封装的信息选择性地交还给调用方。
对本站而言,典型链路是:Terraform 建完基础设施输出 ALB 域名,部署脚本拿到域名后做健康检查、再把域名登记到监控和 DNS;没有 output,自动化就断了一截。
先建立图像
┌─────────────── root module(你的工作目录)────────────────┐
│ resource ... resource ... │
│ │ │
│ └────▶ output "alb_dns" { value = aws_lb.web.dns } │
│ │ │
└─────────────────────┼──────────────────────────────────────┘
▼ apply 结束打印 / terraform output 查询
部署脚本、CI、运维同学
类比:variable 是函数入参,output 是函数返回值,state 是函数运行时闭包。
跟着做
步骤 1:定义基础输出
在前面课程的配置里新建 outputs.tf:
output "application_url" {
description = "本站访问地址"
value = "http://${aws_instance.web.public_ip}"
}
output "security_group_id" {
description = "Web 层安全组 ID"
value = aws_security_group.web.id
}
output "instance_ids" {
description = "全部 Web 实例 ID"
value = aws_instance.web[*].id # 配合 count/for_each 的批量引用
}
执行 terraform apply 后,结尾会出现:
Outputs:
application_url = "http://35.78.xx.xx"
instance_ids = [
"i-0a1b2c3d4e5f67890",
]
security_group_id = "sg-0123456789abcdef0"
输出值可以是任意表达式:字符串拼接、集合、对象,也可以引用 locals。
步骤 2:用 terraform output 消费
terraform output # 列出全部
terraform output application_url # 打印单个(带引号,原始格式)
terraform output -raw application_url # 去掉引号,适合脚本
部署脚本里的典型用法:
URL=$(terraform output -raw application_url)
for i in {1..30}; do
curl -fsS "http://$URL/actuator/health" && break
sleep 5
done
也支持 JSON:
terraform output -json > outputs.json