如何让 Terraform 等待 cloudinit 完成?

Arc*_*ano 4 amazon-web-services cloud-init terraform

在我的Terraform AWS Docker Swarm 模块中,我使用 cloud-init 来初始化 EC2 实例。但是,Terraform 表示在 cloud-init 完成之前资源已准备就绪。有没有办法让它等待 cloud-init理想地完成而无需 SSH 连接或使用null资源检查端口是否启动。

Ala*_*Dea 5

您的经理员工都使用template_cloudinit_config。他们也有ec2:CreateTags

您可以使用像trajano/terraform-docker-swarm-aws/cloudinit-complete这样的 EC2 资源标签来指示 cloudinit 已完成。

您可以将这最后一部分添加到每个部分以调用标记脚本:

部分 { 文件名 = "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
}
Run Code Online (Sandbox Code Playgroud)

然后使用 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
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以在 cloudinit 完成后需要运行的任何资源上依赖null_resource.wait_for_cloudinit