第一次提问,如果我遗漏了任何重要的事情请告诉我!
Terraform v0.11.1 提供商.aws v0.1.4
我正在尝试为多个实例创建多个 CloudWatch 警报。我想知道是否有办法让配置迭代列表。我尝试使用以下代码,但收到“错误:变量“实例”:默认值可能不包含插值”。
variable "instances" {
description = "Run the EC2 Instances in these Availability Zones"
type = "list"
default = ["${aws_instance.my_instance1.id}", "${aws_instance.my_instance2.id}", "${aws_instance.my_instance3.id}", "${aws_instance.my_instance4.id}", "${aws_instance.my_instance5.id}"]
}
############ Cloudwatch monitoring
resource "aws_cloudwatch_metric_alarm" "cpu" {
count = 5
alarm_name = "terraform-cpu-high-test"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "2"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = "180"
statistic = "Average"
threshold = "80"
alarm_description = "This metric monitors ec2 cpu utilization"
insufficient_data_actions = []
dimensions {
InstanceId = "${element(var.instances, count.index)}"
}
}
使用 Terraform 是否可以实现这样的事情?如果可以,最好的方法是什么?
谢谢!
答案1
你的问题是
default = ["${aws_instance.my_instance1.id}", "${aws_instance.my_instance2.id}", "${aws_instance.my_instance3.id}", "${aws_instance.my_instance4.id}", "${aws_instance.my_instance5.id}"]
必须将其传入或静态设置。
如果my_instance1-5
相同,可以count
像上面一样在其中设置。那么最好这样做
InstanceId = "${element(aws_instance.my_instance.*.id, count.index)}"
答案2
如果您向我们展示如何创建 EC2 实例的代码,那将会很有帮助。如果创建时带有计数,那么这应该会更容易。如果在与此 Cloudwatch 代码相同的模板中创建它们,那么就更容易了。
如果不在同一个模板中,那么您将需要使用输出。https://www.terraform.io/docs/configuration/outputs.html 这允许模块输出信息供其他模块使用。要从输出中获取信息,您需要一个数据源,该数据源允许您查看状态文件内部并提取 EC2 实例 ID。如果您使用远程后端(例如 S3),这会有所帮助。
如果它在同一个模块中,并且使用计数来构建实例,那么正如 Mike 所说,您可以使用
InstanceId = "${element(aws_instance.my_instance.*.id, count.index)}"