Создать снимок EBS с помощью Terraform и count () - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу создать снимки для всех томов EBS типа gp2.У меня есть следующий код:

data "aws_ebs_volume" "ebs_volumes" {
  filter {
    name   = "volume-type"
    values = ["gp2"]
  }
}

resource "aws_ebs_snapshot" "ebs_snapshot" {
  count = "${length(data.aws_ebs_volume.ebs_volumes.ids)}"
  volume_id = "${element(data.ebs_volume.ebs_volumes.ids, count.index)}"
}

Вместо этого я получил следующую ошибку:

terraform plan

Error: resource 'aws_ebs_snapshot.ebs_snapshot' config: unknown resource 'data.ebs_volume.ebs_volumes' referenced in variable data.ebs_volume.ebs_volumes.ids

Так как я использую источник данных, список, возвращаемый data.aws_ebs_volume, является динамическим, а неstatic variable, как описано в Создание снимков нескольких томов EBS с использованием Terraform .

Использование terraform show:

data.aws_ebs_volume.ebs_volumes:
  id = vol-00b3eaaf04b9377cb
  arn = arn:aws:ec2:us-east-1:ACCOUNT_ID:volume/vol-00b3eaaf04b9377cb
  availability_zone = us-east-1c
  encrypted = false
  filter.# = 1
  filter.3737401200.name = volume-type
  filter.3737401200.values.# = 1
  filter.3737401200.values.0 = gp2
  iops = 100
  kms_key_id =
  most_recent = false
  size = 8
  snapshot_id = snap-01d81204beb02804b
  tags.% = 0
  volume_id = vol-00b3eaaf04b9377cb
  volume_type = gp2

1 Ответ

0 голосов
/ 17 февраля 2019

Обычно в провайдерах Terraform есть два типа источников данных: единичные и множественные, такие как aws_ami против aws_ami_ids, причем множественное число обычно просто возвращает списокидентификаторов ресурсов и единственного, предлагающего больше информации о каждом конкретном ресурсе.

К сожалению, поставщик AWS еще не реализовал множественный источник данных для томов EBS, поэтому вы ограничены только единичным aws_ebs_volume источник данных и не может просто динамически возвращать все тома EBS, соответствующие некоторым критериям (например, это GP2).

В качестве кратковременного исправления, и если вы действительно хотите использовать Terraform для управления созданиемснимки напрямую, вы можете использовать внешний источник данных , чтобы получить список томов EBS за пределами Terraform.

Быстрый пример этого может выглядеть примерно так (не проверено):

data "external" "all_gp2_ebs_volumes" {
  # Should run something like:
  # `aws ec2 describe-volumes --query 'Volumes[].VolumeId' --filters Name=volume-type,Values=gp2`
  # but return the result in a way that the data source needs it.
  program = ["python", "${path.module}/get-all-gp2-ebs-volumes.py"]
}

resource "aws_ebs_snapshot" "ebs_snapshot" {
  count     = "${length(data.external.all_gp2_ebs_volumes.result.ids)}
  volume_id = "${data.external.all_gp2_ebs_volumes.result.ids[count.index]}"
}

Если ограничение на 2 часа для AWS DLM или AWS Backup не является для вас настоящим препятствиемПо какой-то причине я бы использовал их.Уже есть aws_dlm_lifecycle_policy ресурс для настройки этого через Terraform, а затем эта проблема отслеживает создание необходимых ресурсов резервного копирования AWS.

Другой вариант будетвызвать запрос функции в трекере проблем для источника данных aws_ebs_volume_ids (я не смог найти существующий запрос функции из быстрого просмотра).

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