amazon-web-services - Terraform 循环依赖
问题描述
我正在尝试通过 Terraform 实例化 3 个知道彼此 IP 地址的 aws_instances。这当然会导致循环依赖。我想知道克服这个问题的最佳方法是什么。我尝试了几个解决方案:
- 一起实例化 2 个实例,然后实例化 1 个依赖于这 2 个的实例。在第三个实例中,有一个 user_data 脚本,允许实例通过 ssh 连接到其他 2 个实例以设置必要的配置。
它可以工作,但我不喜欢它创建 2 个不同的资源组的事实,即使这 3 个实例在初始化后的所有意图和目的都是相同的。
- 同时实例化 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 的方式在没有资源的供应商中进行了描述。
推荐阅读
- xamarin.forms - 使用包装器时 Xamarin DependencyService Get() 方法 NULL
- load-balancing - 如何使用忽略客户端 IP 的 Haproxy 粘性会话?
- c# - 用户未通过登录控制 ASP .NET 进行身份验证
- swift - Swift 4:直接在结构或类中的 getter 和 setter
- xaml - 如何让我的按钮填满 Xaml 中的屏幕
- c++ - 本征,用四元数旋转vector3d?
- asp.net-core-2.0 - Database.Migrate() 创建数据库但不创建表,EF & .NET Core 2
- ionic3 - 如何使用 Ionic 3 和 Angular 5 动态启用或禁用 ion-range-slider?
- angular - `of` 运算符和 `Observable.of` 之间的区别
- c++ - C++ - Chromium 指南样式冲突虚拟覆盖