创建多个资源 Terraform

创建多个资源 Terraform

第一次提问,如果我遗漏了任何重要的事情请告诉我!

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

相关内容