Terraform:EC2 实例仍在 运行 shell 脚本之后使用供应器创建

Terraform: EC2 instance is still creating after running shell script using provisioner

我需要 Terraform 导出的一些帮助。 我将创建 EC2 实例并使用 terraform 在其上安装一些包。 为了安装包,我使用了 terraform 的 provisiner。这是 EC2 实例部分。

resource "aws_instance" "lms_server" {
  ami = var.AMI
  instance_type = var.instance_type
  key_name = var.private_key
  iam_instance_profile = aws_iam_instance_profile.instance_profile.name
  associate_public_ip_address = true
    subnet_id = aws_subnet.main-public-1.id
    vpc_security_group_ids = [aws_security_group.security_rule.id]

  provisioner "file" {
    source      = "script.sh"
    destination = "/tmp/script.sh"
  }
  
  provisioner "remote-exec" {
    inline  = [
      "chmod +x /tmp/script.sh",
      "/tmp/script.sh ${var.gh_user} ${var.gh_token} ${var.gh_url} ${aws_db_instance.lms_mysql_db.address} ${var.db_name} ${var.db_username} ${var.db_password} ${aws_sqs_queue.lms_queue.id} ${var.sqs_name} ${self.public_ip} ${var.aws_region} ${var.bucket_name}",
    ]
  }
  
  connection {
    type        = "ssh"
    host        = "${self.public_ip}"
    user        = var.user_name
    private_key = "${file("lms_key.pem")}"
  }
  
  root_block_device {
      volume_size   =   var.volume_size
  }

  tags = {
    lms_app = "lms_server"
  }
}

正如您在此处看到的,我通过 SSH 访问 EC2 并复制了包含所有命令的 script.sh 文件。那就运行吧。我认为 EC2 已成功创建并安装了所有软件包,但 terraform CLI 保持 ec2 instance: still creating 状态。 这意味着 EC2 实例的创建还没有完成。所以如果我再次放下这个(Ctrl+C)然后 运行 terraform apply ,它曾经再次从第一个开始销毁和创建实例。它还会再次安装所有软件包。

每次我为其他而不是 EC2 更新 terraform 脚本时都会发生此操作。

我期待就此问题获得一些帮助。 感谢您的时间和考虑。

你能给我们看看 scripts.sh 的内容吗?也许有什么东西让该脚本继续执行以致于它无法完成。

您可以尝试使用 user_data。在 bootstrap 阶段创建 EC2 并将其记录在 EC2 中后,它将 运行 您的脚本。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#user_data