Terraform применяет огромное значение индекса, например, хранилище блоков EBS - PullRequest
0 голосов
/ 24 апреля 2018

Я использую Terraform (вызывается через Terragrunt, если это актуально), чтобы создать экземпляр из AMI и смонтировать существующий том:

resource "aws_instance" "jenkins_master_with_snap" {
    count                   = "${var.master_with_snapshot}"
    ami                     = "${var.jenkins_ami}"
    instance_type           = "${var.jenkins_instance_type}"
    iam_instance_profile    = "${data.terraform_remote_state.global.jenkins_profile_name}"
    subnet_id               = "${data.aws_subnet.jenkins_subnet_with_snap.id}"
    key_name                = "${var.key_name}"
    vpc_security_group_ids  = [
        "${aws_security_group.jenkins_master_target_sg.id}",
        "${data.terraform_remote_state.cicd.cicd_sg_ipa}"
    ]

    ebs_block_device {
        snapshot_id = "${var.master_snapshot_id}"
        device_name = "${var.jenkins_volume_device}"
        volume_type = "gp2"
    }
}

Стоит отметить, что AMI, использованный для создания этого ресурса, уже имеет привязанный к нему моментальный снимок из процесса сборки, поэтому этот ресурс в основном просто заменяет его другим снимком. Я не уверен, вот почему у меня проблема или нет.

Я использую полученные атрибуты ресурса для заполнения шаблона Python, который будет заархивирован и загружен как лямбда-функция. Скрипт Python требует volume-id от блочного устройства EBS этого экземпляра.

data "template_file" "ebs_backup_lambda_with_snapshot_template" {
    count       = "${var.master_with_snapshot}"
    template    = "${file("${path.module}/jenkins_lambda_ebs_backup.py.tpl")}"

    vars {
        volume_id = "${aws_instance.jenkins_master_with_snap.ebs_block_device.???.volume_id}"
    }
}

Об актуальной проблеме: я не знаю, как правильно ссылаться на идентификатор тома в разделе vars ресурса template_file выше. Вот результирующее состояние:

ebs_block_device.#                                = 1
ebs_block_device.1440725774.delete_on_termination = true
ebs_block_device.1440725774.device_name           = /dev/xvdf
ebs_block_device.1440725774.encrypted             = true
ebs_block_device.1440725774.iops                  = 900
ebs_block_device.1440725774.snapshot_id           = snap-1111111111111
ebs_block_device.1440725774.volume_id             = vol-1111111111111
ebs_block_device.1440725774.volume_size           = 300
ebs_block_device.1440725774.volume_type           = gp2
ebs_optimized                                     = false
root_block_device.#                               = 1
root_block_device.0.delete_on_termination         = false
root_block_device.0.iops                          = 0
root_block_device.0.volume_id                     = vol-1111111111111
root_block_device.0.volume_size                   = 8
root_block_device.0.volume_type                   = standard

Проблема в том, что индекс тома EBS - это безумное целое число 1440725774. Я понятия не имею, почему это происходит. В консоли интересует только одна карта в списке:

> aws_instance.jenkins_master_with_snap.ebs_block_device
[
  {    delete_on_termination = 1  device_name = /dev/xvdf  encrypted = 1  iops = 900  snapshot_id = snap-1111111111111  volume_id = vol-1111111111111  volume_size = 300  volume_type = gp2}
]

И, похоже, единственный способ ссылаться на любой из этих ключей - это напрямую использовать это значение индекса:

> aws_instance.jenkins_master_with_snap.ebs_block_device.1440725774.volume_id
vol-1111111111111

Есть ли способ надежно ссылаться на один элемент в списке, как этот, когда я понятия не имею, каким будет индекс? Я не могу просто жестко закодировать это целое число в ресурс template_file выше и предположить, что оно будет одинаковым каждый раз. У кого-нибудь есть какие-либо подсказки относительно того, почему это происходит в первую очередь?

1 Ответ

0 голосов
/ 24 апреля 2018

Возможно, вместо встраивания ebs_block_device , создайте отдельный ресурс aws_ebs_volume , затем присоедините его с aws_volume_attachment .Затем обратитесь к атрибуту aws_ebs_volume.name.id, чтобы получить нужный идентификатор.

Пример (расширенный от пример кода в aws_volume_attachment):

resource "aws_volume_attachment" "ebs_att" {
  device_name = "/dev/sdh"
  volume_id   = "${aws_ebs_volume.example.id}"
  instance_id = "${aws_instance.web.id}"
}

resource "aws_instance" "web" {
  ami               = "ami-21f78e11"
  availability_zone = "us-west-2a"
  instance_type     = "t1.micro"
  tags {
    Name = "HelloWorld"
  }

  subnet_id = "<REDACTED>"
}

resource "aws_ebs_volume" "example" {
  availability_zone = "us-west-2a"
  size              = 1
}

data "template_file" "example" {
    template    = "Your volume ID is $${volume_id}"

    vars {
     volume_id = "${aws_ebs_volume.example.id}"
    }
}

output "custom_template" {
  value = "${data.template_file.example.rendered}"
}

Результирующийвывод:

Outputs:

custom_template = Your volume ID is vol-0b1064d4ca6f89a15

Затем вы можете использовать ${aws_ebs_volume.example.id} в ваших шаблонах vars для заполнения вашей лямбды.

...