无法使用 Terraform 获取 spot 实例的 public IP 地址

Cannot get public IP address of spot instance with Terraform

我正在启动一个现场实例,正如您在下面的配置中看到的那样,然后尝试从现场获取 IP 地址。它似乎适用于常规 ec2 实例(即不是现场实例)。

我得到的错误是:

aws_route53_record.staging: Resource ‘aws_spot_instance_request.app-ec2’ does not have attribute ‘public_ip’ for variable ‘aws_spot_instance_request.app-ec2.public_ip’

这是我正在使用的配置:

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 控制台上完成,如下所示:

任何帮助将不胜感激!

我尝试了您在 Terraform 版本 0.12.10 中提供的代码片段,但遇到了同样的错误。我检查了 terraform.tfstate 文件,发现字段尚未填充(例如 private_ippublic_ippublic_dns 设置为 null)。我检查了 AWS 控制台中的 "Spot Requests" 部分并看到以下状态: price-too-low: Your Spot request price of 0.0075 is lower than the minimum required Spot request fulfillment price of 0.008. 请求状态仍然打开,所以这就是状态文件中的所有变量都设置为 null 的原因。

所以我从昨晚开始就一直在尝试解决这个问题,并且一直看到 Spot 实例请求正在通过 AWS 控制台完成。同样,我可以看到该地点的 public IP,这误导了我。

原来我的脚本中缺少 1 行(参数):

wait_for_fulfillment = true

默认情况下,它设置为 false,因此当我尝试设置 public_ip 地址时,它当时根本不存在。

现在 Terraform 将等待 Spot 请求完成。根据文档,如果达到10m的超时就会抛出错误。