Terraform数据源未识别待创建NLB,仅返回单个资源问题咨询
Terraform NLB 数据源问题解答
行为是否符合预期?
完全符合。Terraform的数据源是从真实云环境读取已存在的资源状态,不是读取配置里待创建的资源。你当前云环境只有1个已部署的NLB,所以数据源只能拉到这1个,待创建的第2个还没出现在云环境里,自然查不到。
当前方案是否正确?
不正确。你用数据源关联待创建的NLB是逻辑错误。数据源的作用是获取外部已存在的基础设施资源,而Terraform自己管理的待创建资源,应该直接通过资源引用获取属性,不用绕数据源。
数据源是否不识别待创建的资源?
对,确实不识别。Terraform的执行顺序是:
- 先同步云环境的真实状态(已有的1个NLB)
- 然后执行数据源查询,从云环境拉取数据(只能拿到已存在的1个)
- 最后对比配置和现有状态,算出要创建第2个NLB的计划
数据源查询在计划早期就完成了,这时候待创建的NLB还没落地到云环境,根本查不到。
为什么单NLB无count场景下正常?
因为当时配置里的NLB和数据源指向的是同一个已存在的资源——要么是你手动先建了NLB,用数据源读取复用;要么是Terraform创建NLB后,数据源读取的是已经部署到云环境的那个。本质还是数据源读的是已存在的资源,刚好和配置匹配,所以看起来正常,但其实这种用法没必要,直接引用资源属性更靠谱。
正确做法
删掉数据源,直接从Terraform管理的NLB资源里提取IP:
resource "aws_lb" "my_nlb" { count = 2 # 你的NLB配置参数... } locals { # 根据你的NLB类型选对应的属性,比如公网NLB用dns_name,内网NLB用private_ip nlb_ip_addresses = [for nlb in aws_lb.my_nlb : nlb.private_ip] }
这样不管是已有的还是待创建的NLB,Terraform都会从自己的资源状态里获取属性,计划阶段就能得到包含2个元素的列表。
内容的提问来源于stack exchange,提问作者devcodes
相关产品推荐
相关产品推荐

