Terraform中aws_spot_fleet_request无public_ip属性报错求助
解决Terraform中Spot Fleet实例公网IP获取失败的问题
问题根源
aws_spot_fleet_request资源本身并不直接提供实例的public_ip属性——它只是用于创建Spot实例集群的管理请求对象,实际EC2实例的网络属性需要从对应的aws_instance资源或数据源中获取。你当前的代码试图直接从Spot Fleet请求对象中读取不存在的属性,因此触发了"不支持的属性"错误。
解决方案
方法:通过aws_instance数据源获取实例公网IP
我们可以利用Spot Fleet创建的实例ID,通过aws_instance数据源查询每个实例的公网IP。修改后的代码如下:
locals { csvdata = csvdecode(file("C:\\Users\\myhome\\Desktop\\test_terraform\\IMO_TOKEN.csv")) } resource "aws_spot_fleet_request" "spot_inst" { iam_fleet_role = "arn:aws:iam::123456789:role/aws-ec2-spot-fleet-tagging-role" for_each = { for inst in local.csvdata : inst.IMO => inst } spot_price = "0.5" target_capacity = 1 wait_for_fulfillment = true // 保留原有的launch_specification配置... } # 定义数据源,查询每个Spot Fleet创建的实例 data "aws_instance" "spot_fleet_instances" { for_each = aws_spot_fleet_request.spot_inst instance_ids = each.value.spot_instance_request_ids } resource "null_resource" "spot_inst_ssh" { depends_on = [aws_spot_fleet_request.spot_inst] for_each = { for inst in local.csvdata : inst.IMO => inst } connection { type = "ssh" # 从数据源中获取对应实例的公网IP host = data.aws_instance.spot_fleet_instances[each.key].public_ip # 保留原有的其他连接配置... } # 保留原有的provisioner配置... }
关键说明
aws_spot_fleet_request的spot_instance_request_ids属性会返回该请求创建的所有Spot实例ID列表(这里因为target_capacity=1,所以列表仅含一个元素)。aws_instance数据源通过instance_ids参数关联实例,自动解析出实例的public_ip属性。- 因为
for_each的键是IMO,所以在null_resource中可以直接用each.key匹配对应的数据源实例。
补充验证
如果你的Spot Fleet配置基于私有网络,需要确保实例已分配公网IP(比如通过子网自动分配公网IP设置,或附加弹性IP),否则public_ip会为空,导致SSH连接失败。
内容的提问来源于stack exchange,提问作者Sumanth M
相关产品推荐
相关产品推荐

