Terraform 循环依赖

Terraform cyclic dependency

我正在尝试实例化 3 个 aws_instances,它们通过 Terraform 知道彼此的 IP 地址。这当然会导致循环依赖。我想知道克服这个问题的最好方法是什么。我尝试了几种解决方案:

  1. 一起实例化 2 个实例,然后 1 个实例依赖于这 2 个实例。在第三个实例中,有一个 user_data 脚本允许该实例通过 ssh 进入其他 2 个实例以设置必要的配置。

它有效,但我不喜欢它创建 2 个不同的资源组,即使这 3 个实例在初始化后的所有意图和目的都是相同的。

  1. 同时实例化 3 个实例,然后实例化另一个实例,其唯一目的是通过 ssh 进入每个实例以设置必要的配置。初始化完成后,附加实例应自行终止。

它也可以工作,但是 terraform 会将第 4 个资源视为已终止的资源,并且会在有更新时尝试重新创建它,所以这不是很干净。

有什么建议吗?谢谢

编辑:

这里尝试不使用 remote-exec 来说明循环依赖:

resource "aws_instance" "etcd" {
  count           = 3

  ami             = data.aws_ami.ubuntu.id
  instance_type   = "t3.micro"
  subnet_id       = module.vpc.public_subnets[count.index].id

  provisioner "remote-exec" {
    inline = [
      "echo ${aws_instance.etcd[0].private_ip}",
      "echo ${aws_instance.etcd[1].private_ip}",
      "echo ${aws_instance.etcd[2].private_ip}"
    ]
  }
}

基于评论。

您可以在您的三个实例上使用 remote-exec 到 运行 代码,只有 在所有实例都已配置后 。您将不得不开发这样的脚本以通过 ssh 连接到他们三个。

但是,您只能在第三个实例启动后调用您的 remote-exec 脚本。这可以通过使用 null_resoruce 来实现,这取决于实例。

null_resource 的这种使用方式在 Provisioners Without a Resource 中有描述。