Terraform中如何将两个AWS实例的Private IP合并为列表用于DHCP选项?
解决Terraform中合并两个aws_instances数据源private_ip为列表的问题
首先咱们先理清报错的根源:aws_instances数据源返回的private_ip属性本身就是列表类型——哪怕你的标签只匹配到一个实例,它依然会以列表形式返回。你当前的写法相当于把两个列表嵌套进了一个大列表,变成了类似[[10.0.0.1], [10.0.0.2]]的嵌套结构,而dhcp_options_domain_name_servers需要的是一维列表(比如[10.0.0.1, 10.0.0.2]),所以Terraform才会抛出格式错误。
下面给你两种可行的解决方案:
方案一:用concat函数合并列表(推荐)
如果你的标签确保每个数据源只会匹配到一个实例,或者你想把所有匹配到的实例IP都合并进去,直接用concat函数把两个列表合并成一个一维列表即可:
dhcp_options_domain_name_servers = concat( data.aws_instances.daas_resolver_ip_1.private_ip, data.aws_instances.daas_resolver_ip_2.private_ip )
这个函数会自动将多个输入列表的元素合并成一个新的一维列表,完美契合domain_name_servers的格式要求。
方案二:明确取每个列表的第一个元素
如果你想更严谨地指定只取每个数据源匹配到的第一个实例私有IP(比如担心标签可能匹配多个实例的场景),可以用element函数获取列表的第一个元素(索引从0开始):
dhcp_options_domain_name_servers = [ element(data.aws_instances.daas_resolver_ip_1.private_ip, 0), element(data.aws_instances.daas_resolver_ip_2.private_ip, 0) ]
这种写法会直接把两个单独的IP值放入列表,彻底避免嵌套问题。
另外注意,你原代码里两次引用了daas_resolver_ip_1的IP,应该是笔误,上面的方案已经修正为分别引用两个数据源的IP了。
内容的提问来源于stack exchange,提问作者hem1234
相关产品推荐
相关产品推荐

