我正在字符串中创建一个terraform配置文件来创建一个ec2实例。我正在使用variables.tf
文件来放置我的所有变量。它适用于大多数情况,但有两种情况我无法实现。我们非常感谢任何指点。
1.使用变量作为aws实例名称。使用var.service_name
或"${service_name}"
不起作用。
resource "aws_instance" var.service_name {
ami = "ami-010fae13a16763bb4"
instance_type = "t2.micro"
.....
}
这篇文章解释了资源名称不能是变量。但这是相当古老的。不确定情况是否仍然如此。
2.在另一个变量中使用变量。例如,我有这样定义的连接参数
connection {
host = "${aws_instance.terraformtest.public_ip}"
type = "ssh"
user = "ec2-user"
private_key = "${file("C:/Users/phani/Downloads/microservices.pem")}"
}
这是有效的。我使用的是从aws实例资源生成的ip。但是如果我这样用的话。不起作用
host = "${aws_instance.${service_name}.public_ip}"
我是遗漏了什么,还是有变通办法
Terraform中的资源名称必须是常量。在实践中,这通常不是问题,因为资源名称只需要在给定的模块中是唯一的,因此调用方不需要自定义子模块中资源的名称。在特定资源是模块声明的主要对象的情况下,常见的习惯用法是将资源命名为"main",如resource "aws_instance" "main"
。
在需要声明定义共享公共配置的多个实例的情况下,可以使用for_each
或count
从同一资源块生成多个实例。在这种情况下,资源地址包括一个额外的"索引"组件,如aws_instance.example["foo"]
或aws_instance.example[0]
,其中索引可以是一个变量,用于动态选择单个资源块生成的实例之一。