В моем модуле Terraform AWS Docker Swarm я использую cloud-init для инициализации экземпляр EC2. Однако Terraform сообщает, что ресурс готов до завершения cloud-init. Есть ли способ заставить его ждать завершения cloud-init в идеале без SSHing или проверки наличия порта с использованием ресурса null
.
Как заставить Terraform ждать завершения работы cloudinit?
Ответы (1)
Ваши менеджеры и оба используют template_cloud. У них также есть ec2: CreateTags.
Вы можете использовать тег ресурса EC2, например trajano / terraform-docker-swarm-aws / cloudinit-complete, чтобы указать, что cloudinit завершено.
Вы можете добавить эту последнюю часть к каждому, чтобы вызвать сценарий тегирования:
часть {filename = "tag_complete.sh" content = local.tag_complete_script content_type = "text / x-shellscript"}
И объявите tag_complete_script следующим образом:
locals {
tag_complete_script = <<-EOF
#!/bin/bash
instance_id="${TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/instance-id}"
aws ec2 create-tags --resources "$instance_id" --tags 'Key=trajano/terraform-docker-swarm-aws/cloudinit-complete,Value=true'
EOF
}
Затем с помощью null_resource вы ждете появления тега (написали это на моем телефоне, поэтому используйте его для общего представления, но я не ожидаю, что он будет работать без тестирования и редактирования):
resource "null_resource" "wait_for_cloudinit" {
provisioner "local-exec" {
command = <<-EOF
#!/bin/bash
poll_tags="aws ec2 describe-tags --filters 'Name=resource-id,Values=${join(",", aws_instance.managers[*].id)}' 'Name=key,Values=trajano/terraform-docker-swarm-aws/cloudinit-complete' --output text --query 'Tags[*].Value'"
expected='${join(",", formatlist("true", aws_instance.managers[*].id))}'
$tags="$($poll_tags)"
while [[ "$tags" != "$expected" ]] ; do
$tags="$($poll_tags)"
done
EOF
}
}
Таким образом, у вас могут быть зависимости null_resource.wait_for_cloudinit от любых ресурсов, которые необходимо запустить после завершения работы cloudinit.