Назад | Перейти на главную страницу

Создание терраформ с несколькими ресурсами

Первый раз задаю вопрос, поэтому, если я пропустил что-то важное, дайте мне знать!

Terraform v0.11.1 Provider .aws v0.1.4

Я пытаюсь создать несколько будильников для нескольких экземпляров. Мне было интересно, есть ли способ, чтобы конфигурация повторялась через список. Я пробовал использовать следующий код, но получаю сообщение «Ошибка: экземпляры переменных»: по умолчанию может не содержаться интерполяция ».

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, и если да, то как это лучше всего сделать?

Спасибо!

Ваша проблема

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

Было бы полезно, если бы вы показали нам код того, как вы создаете экземпляры EC2. Если они созданы с подсчетом, это должно быть проще. Если они созданы в том же шаблоне, что и этот код Cloudwatch, то опять же проще.

Если это не в том же шаблоне, вам нужно будет использовать выходы. https://www.terraform.io/docs/configuration/outputs.html Это позволяет модулю выводить информацию для использования другими модулями. Чтобы получить информацию из вывода, вам нужен источник данных, который позволит вам заглянуть внутрь файла состояния и абстрагироваться от идентификаторов экземпляров EC2. Это помогает, если вы используете удаленный сервер, например S3.

Если он находится в том же модуле и использует счетчик для создания экземпляров, то, как сказал Майк, вы можете использовать

InstanceId = "${element(aws_instance.my_instance.*.id, count.index)}"