Amazon ec2 无法使用Terraform获取spot实例的公共IP地址
我正在旋转一个spot实例,正如您在下面的配置中所看到的,然后尝试从spot获取IP地址。它似乎可以与常规ec2实例(即不是spot实例)配合使用 我得到的错误是: aws_route53_record.staging:资源 “aws\u spot\u instance\u request.app-ec2”没有属性 变量“aws_spot_instance_request.app-ec2.public_ip”的“public_ip” 以下是我正在使用的配置:Amazon ec2 无法使用Terraform获取spot实例的公共IP地址,amazon-ec2,terraform,terraform-provider-aws,spot-instances,Amazon Ec2,Terraform,Terraform Provider Aws,Spot Instances,我正在旋转一个spot实例,正如您在下面的配置中所看到的,然后尝试从spot获取IP地址。它似乎可以与常规ec2实例(即不是spot实例)配合使用 我得到的错误是: aws_route53_record.staging:资源 “aws\u spot\u instance\u request.app-ec2”没有属性 变量“aws_spot_instance_request.app-ec2.public_ip”的“public_ip” 以下是我正在使用的配置: resource "aws_spot
resource "aws_spot_instance_request" "app-ec2" {
ami = "ami-1c999999"
spot_price = "0.008"
instance_type = "t2.small"
tags {
Name = "${var.app_name}"
}
key_name = "mykeypair"
associate_public_ip_address = true
vpc_security_group_ids = ["sg-99999999"]
subnet_id = "subnet-99999999"
iam_instance_profile = "myInstanceRole"
user_data = <<-EOF
#!/bin/bash
echo ECS_CLUSTER=APP-STAGING >> /etc/ecs/ecs.config
EOF
}
resource "aws_route53_record" "staging" {
zone_id = "XXXXXXXX"
name = "staging.myapp.com"
type = "A"
ttl = "300"
records = ["${aws_spot_instance_request.app-ec2.public_ip}"]
资源“aws现场实例请求”app-ec2{
ami=“ami-1C99999”
现货价格=“0.008”
实例_type=“t2.小”
标签{
Name=“${var.app_Name}”
}
key\u name=“mykeypair”
关联\u公共\u ip\u地址=真
专有网络安全组ID=[“sg-9999999”]
子网\u id=“子网-9999999”
iam_实例_profile=“myInstanceRole”
用户数据=/etc/ecs/ecs.config
EOF
}
资源“aws_路由53_记录”“暂存”{
区域id=“XXXXXXXX”
name=“staging.myapp.com”
type=“A”
ttl=“300”
记录=[“${aws\u spot\u instance\u request.app-ec2.public\u ip}”]
现场请求在AWS控制台上实现,如下所示:
非常感谢您的帮助!我尝试了您随Terraform版本
0.12.10
提供的代码片段,但得到了相同的错误。我检查了Terraform.tfstate
文件,发现字段尚未填充(例如,private\u-ip
、public\u-ip
和public\u-dns
被设置为null
)。我检查了“现场请求”在AWS控制台中查看以下状态:价格过低:您的即期请求价格0.0075低于最低要求的即期请求履行价格0.008。
请求状态仍处于打开状态,这就是为什么状态文件中的所有变量都设置为null
的原因,因此我一直在尝试计算从昨晚开始,我一直看到spot实例请求通过AWS控制台得到满足。同样,我可以看到spot的公共IP,这误导了我
事实证明,我的脚本中缺少一行(参数):
wait_for_fulfillment = true
默认情况下,它被设置为false,因此当我试图设置public_ip地址时,它当时根本不存在
现在Terraform将等待现货请求完成。根据文档,如果达到10米的超时时间,它将抛出一个错误。感谢您对此的快速回复。我刚刚用Terraform脚本快速检查了一下,看到现货请求在我的AWS控制台中以现货价格0.008完成。我已经更新了上述内容在帖子中包括屏幕截图。对于我的原始问题,我仍然不确定如何无法获取public_ip?对于变量“aws_spot_instance_request.app-ec2.public_ip”的错误消息
属性“public_ip”。app-ec2.public_ip
表明您在尝试从变量访问public_ip>变量时出现语法错误>aws_spot_instance_request.app-ec2.public_ip
。您是否在变量中键入了两次public_ip
?以下操作正常“${aws_spot_instance_request.app-ec2.public_ip}”
如果spot实例请求已被批准。我也是这么想的,但我没有键入public\u ip
两次,它只出现一次,感谢您的帮助。我刚刚发现了这一点,似乎需要等待完成。一旦我添加了它,public\u ip就会正常工作。这可能会有帮助: