Не удается получить общедоступный IP-адрес спотового экземпляра с помощью Terraform

Я запускаю спотовый экземпляр, как вы можете видеть в конфигурации ниже, а затем пытаюсь получить IP-адрес с места. Кажется, он отлично работает с обычным экземпляром ec2 (т.е. это не спотовый экземпляр).

Ошибка, которую я получаю:

aws_route53_record.staging: ресурс aws_spot_instance_request.app-ec2 не имеет атрибута public_ip для переменной 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, как показано ниже:

Любая помощь будет оценена!

2 ответа

Решение

Итак, я пытался понять это с прошлой ночи и постоянно видел, как запрос спотового экземпляра выполняется через консоль AWS. Точно так же я мог видеть публичный IP-адрес этого ролика, и это вводило меня в заблуждение.

Оказывается, в моем скрипте отсутствовала 1 строка (аргумент):

wait_for_fulfillment = true

По умолчанию для него установлено значение false, и поэтому, когда я попытался установить адрес public_ip, его просто не существовало в то время.

Теперь Terraform будет ждать выполнения Spot Request. Согласно документации, он выдаст ошибку, если будет достигнут тайм-аут 10 м.

Я попробовал фрагмент кода, который вы предоставили с версией Terraform 0.12.10и получил ту же ошибку. Я проверилterraform.tfstate файл и увидел, что поля еще не заполнены (например private_ip, public_ip, а также public_dns были установлены на null). Я проверил раздел "Спотовые запросы" в консоли AWS и увидел следующий статус:price-too-low: Your Spot request price of 0.0075 is lower than the minimum required Spot request fulfillment price of 0.008. Состояние запроса все еще было открыто, поэтому все переменные в файле состояния были установлены на null.

Другие вопросы по тегам