1

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

我得到的错误是:

aws_route53_record.staging:资源“aws_spot_instance_request.app-ec2”没有变量“aws_spot_instance_request.app-ec2.public_ip”的属性“public_ip”</p>

这是我正在使用的配置:

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}"]

Spot 请求在 AWS 控制台上完成,如下所示: 在此处输入图像描述

任何帮助将不胜感激!

4

2 回答 2

1

因此,从昨晚开始,我一直在尝试解决这个问题,并不断看到通过 AWS 控制台完成的现场实例请求。同样,我可以看到现场的公共 IP,这误导了我。

事实证明,我的脚本中缺少 1 行(参数):

wait_for_fulfillment = true

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

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

于 2020-05-06T09:58:42.860 回答
0

我尝试了您随 Terraform 版本提供的代码片段,0.12.10并得到了同样的错误。我检查了terraform.tfstate文件,发现这些字段尚未填充(例如private_ip,public_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.

于 2020-05-05T22:09:04.820 回答