Как создать несколько томов и прикрепить к каждому экземпляру через Terraform - PullRequest
1 голос
/ 08 апреля 2019

Приведенный ниже код работает, когда ec2_instance_count = 1

Однако, когда ec2_instance_count = 2 появляются следующие ошибки.

Error: Error running plan: 1 error(s) occurred:

* module.build_ec2_app.aws_ebs_volume.ebs_volume: 1 error(s) occurred:

* module.build_ec2_app.aws_ebs_volume.ebs_volume: Resource 'aws_instance.ec2' not found for variable 'aws_instance.ec2.availability_zone'

Я считаю, что это как-то связано с оператором if var.ec2_create_volume == "true" ? 1 : 0

Но даже если я изменю "true" ? 1 : 0 на "true" ? 2 : 0 на обоих ресурсах, я все равно получаю сообщение об ошибке, когда ec2_instance_count = 2

# Create EC2 instances
resource "aws_instance" "ec2" {
  count                   = "${var.ec2_instance_count}"
  ami                     = "${var.ec2_instance_ami_id}"
  instance_type           = "${var.ec2_instance_type}"
  subnet_id               = "${var.ec2_instance_subnet_id}"
  key_name                = "${var.ec2_instance_key_name}"
  vpc_security_group_ids  = ["${aws_security_group.create_security_group.id}"]

  tags {
    Name                  = "${var.ec2_app_name}0${count.index + 1}.${var.ec2_tl_domain_name}"
    service               = "${var.ec2_service}"
    environment           = "${var.ec2_environment}"
  }
}

# Create EBS volume
resource "aws_ebs_volume" "ebs_volume" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 0}"
  availability_zone     = "${aws_instance.ec2.availability_zone}"
  size                  = "${var.ec2_ebs_volume_size}"
}

# Attach EBS Volume
resource "aws_volume_attachment" "volume_attachment" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 0}"
  device_name           = "${var.ec2_device_name}"
  volume_id             = "${aws_ebs_volume.ebs_volume.id}"
  instance_id           = "${aws_instance.ec2.id}"
}

1 Ответ

1 голос
/ 08 апреля 2019

Проблема здесь в том, что когда count для aws_instance.ec2 увеличено до 2, экспорт атрибута ресурса изменяется со строки на список, и вы все равно ссылаетесь на него как на строку. Вы можете увидеть больше информации об этом в документации здесь .

Обновив ресурсы volume_attachment и ebs_volume, ожидая список вместо строки и повторяя итерацию соответственно ресурсу aws_instance, вы можете решить вашу проблему:

# Create EBS volume
resource "aws_ebs_volume" "ebs_volume" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 0}"
  availability_zone     = "${aws_instance.ec2.*.availability_zone[count.index]}"
  size                  = "${var.ec2_ebs_volume_size}"
}

# Attach EBS Volume
resource "aws_volume_attachment" "volume_attachment" {
  count                 = "${var.ec2_create_volume == "true" ? 1 : 0}"
  device_name           = "${var.ec2_device_name}"
  volume_id             = "${aws_ebs_volume.ebs_volume.*.id[count.index]}"
  instance_id           = "${aws_instance.ec2.*.id[count.index]}"
}

Обратите внимание, что это по-прежнему работает правильно, даже если count равно 1. Рекомендуется также синхронизировать count ресурса aws_instance с count двух других, чтобы убедиться, что они являются то же самое.

# Create EBS volume
resource "aws_ebs_volume" "ebs_volume" {
  count                 = "${var.ec2_instance_count}"
  availability_zone     = "${aws_instance.ec2.*.availability_zone[count.index]}"
  size                  = "${var.ec2_ebs_volume_size}"
}

# Attach EBS Volume
resource "aws_volume_attachment" "volume_attachment" {
  count                 = "${var.ec2_instance_count}"
  device_name           = "${var.ec2_device_name}"
  volume_id             = "${aws_ebs_volume.ebs_volume.*.id[count.index]}"
  instance_id           = "${aws_instance.ec2.*.id[count.index]}"
}

Объединение входной переменной вместе гарантирует, что вы будете иметь желаемое поведение при изменении количества экземпляров, и что нежелательные проблемы и побочные эффекты, следовательно, не возникнут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...