使用Terraform count创建多EC2时Terratest调用GetPublicIpOfEc2Instance报错咨询
问题原因
- 你在Terraform中通过
count参数创建了2个EC2实例,对应的instance_id输出是列表类型,但你在Terratest中使用terraform.Output()方法读取该输出,会直接将列表序列化为"[i-xxx i-yyy]"格式的字符串,该字符串不符合单个EC2实例ID的格式要求,所以触发InvalidInstanceID.Malformed报错。 - Terratest的
aws.GetPublicIpOfEc2Instance原生仅支持传入单个实例ID查询公网IP,不支持批量传入多个ID。
解决步骤
步骤1:调整Terraform输出配置
确保你的Terraform输出参数显式声明为列表类型,在你的outputs.tf中添加/修改如下配置:
output "instance_id" { type = list(string) value = aws_instance.ex_ec2.*.id } output "instance_public_ip" { type = list(string) value = aws_instance.ex_ec2.*.public_ip }
步骤2:修改Terratest代码适配多实例场景
2.1 用OutputList读取列表类型的输出
将原代码中读取实例ID和公网IP的部分替换为:
// 读取实例ID列表 actualInstanceIds := terraform.OutputList(f, terraformOptions, "instance_id") // 读取实例公网IP列表 actualPublicIPs := terraform.OutputList(f, terraformOptions, "instance_public_ip")
2.2 遍历实例ID列表批量查询公网IP
原单实例查询逻辑替换为循环遍历:
// 初始化切片存储所有实例的公网IP expectedPublicIPs := make([]string, len(actualInstanceIds)) for idx, instanceId := range actualInstanceIds { expectedPublicIPs[idx] = aws.GetPublicIpOfEc2Instance(f, instanceId, awsRegion) }
2.3 调整断言逻辑适配列表比对
将原公网IP断言替换为列表比对:
// 不要求顺序一致用ElementsMatch,要求顺序和count生成顺序一致用Equal assert.ElementsMatch(f, actualPublicIPs, expectedPublicIPs)
其余S3、ALB相关的测试逻辑无需调整,修改后即可正常运行测试。
内容的提问来源于stack exchange,提问作者Yahowmy
相关产品推荐
相关产品推荐

