首页 > 解决方案 > Terraform 循环依赖

问题描述

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

  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}"
    ]
  }
}

标签: amazon-web-servicesterraformterraform-provider-aws

解决方案


根据评论。

您可以使用remote-exec在您的三个实例上运行代码,前提是它们都已配置好。您必须开发这样的脚本才能通过 ssh 连接到他们三个。

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

这种使用 null_resource 的方式在没有资源的供应商中进行了描述。


推荐阅读