Не удается получить общедоступный 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
.