Добавление нового тома AWS EBS в ASG в той же зоне доступности

Хорошо, поэтому я пытаюсь прикрепить том EBS, который я создал с помощью Terraform, к экземпляру ASG с использованием пользовательских данных, но теперь проблема заключается в том, что оба находятся в разных зонах доступности, из-за чего он не может подключиться. Ниже приведены шаги, которые я пытаюсь и не могу:

resource "aws_ebs_volume" "this" {
  for_each = var.ebs_block_device
    size              = lookup(each.value,"volume_size", null)
    type              = lookup(each.value,"volume_type", null)
    iops              = lookup(each.value, "iops", null)
    encrypted         = lookup(each.value, "volume_encrypt", null)
    kms_key_id        = lookup(each.value, "kms_key_id", null)
    availability_zone = join(",",random_shuffle.az.result)
} 

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

resource "aws_autoscaling_group" "this" {
  desired_capacity          = var.desired_capacity
  launch_configuration      = aws_launch_configuration.this.id
  max_size                  = var.max_size
  min_size                  = var.min_size
  name                      = var.name
  vpc_zone_identifier       = var.subnet_ids // <------ HERE
  health_check_grace_period = var.health_check_grace_period
  load_balancers            = var.load_balancer_names
  target_group_arns         = var.target_group_arns

  tag {
    key                 = "Name"
    value               = var.name
    propagate_at_launch = true
  }
}

И вот пользовательские данные, которые я использую:

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`

instanceId = curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id

aws ec2 attach-volume --volume-id ${ebs_volume_id} --instance-id $instanceId --device /dev/nvme1n1

Выше будет прикреплен вновь созданный том, поскольку я передаю выходные данные ${ebs_volume_id} указанного выше ресурса.

Но это не удается, потому что экземпляр и том находятся в разных зонах доступности.

Может ли кто-нибудь помочь мне в этом как лучшем решении, чем жесткое кодирование AZ на ASG и Volume?


person Ash Singh    schedule 16.09.2020    source источник
comment
Почему вы создаете том EBS таким образом, а не настраиваете том EBS в конфигурации запуска?   -  person Mark B    schedule 16.09.2020
comment
Поэтому, когда я что-то меняю в конфигурации userdata / lauch, он не удаляет / воссоздает том   -  person Ash Singh    schedule 16.09.2020


Ответы (1)


Мне нужно было больше узнать о том, что вы пытаетесь сделать, чтобы решить эту проблему, с помощью только поставщика aws и terraform. И, честно говоря, большинство идей будут немного сложными.

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

Таким образом, вы можете создать несколько томов для каждой зоны доступности и ASG. Затем в пользовательских данных должны быть перечислены все тома в зоне доступности, которые не подключены к экземпляру. Затем выберите идентификатор первого неподключенного тома. Затем прикрепите его. Если все они подключены, вы должны активировать оповещение, потому что у вас больше экземпляров, чем томов.

Любая попытка сделать это с помощью одной ASG на самом деле является попыткой написать собственную ASG, но сделать это так, чтобы бороться с вашей реальной ASG.


Но есть компания, которая предлагает управлять этим как услугой. Они также помогут вам управлять ими как спотовыми экземплярами для экономии средств: https://spot.io/

Ресурс elastigroup является управляемой ими ASG. Так что у вас больше не будет aws asg. Но у них есть несколько интересных конфигураций с отслеживанием состояния.

Мы поддерживаем сохранение экземпляра с помощью следующих конфигураций. все значения логические. Дополнительные сведения о постоянстве экземпляра см. В разделе: Конфигурация с отслеживанием состояния persist_root_device - (необязательно) логическое значение, если экземпляр сохраняет свои тома корневого устройства. persist_block_devices - (Необязательно) логическое значение, если экземпляр поддерживает свои тома данных. persist_private_ip - (Необязательно) логическое значение, если экземпляр сохраняет свой частный IP-адрес. block_devices_mode - (Необязательно) Строка, определяет способ присоединения томов данных к устройствам данных, возможные значения: reattach и onLaunch (по умолчанию onLaunch). private_ips - (Необязательно) Список частных IP-адресов, которые нужно связать с экземплярами группы (например, 172.1.1.0). Обратите внимание: этот параметр будет применяться, только если для параметра persistence.persist_private_ip установлено значение true.

stateful_deallocation {
     should_delete_images              = false
     should_delete_network_interfaces  = false
     should_delete_volumes             = false
     should_delete_snapshots           = false
}

Это позволяет вам иметь автоматическое масштабирование, которое сохраняет объемы и решает все сложности за вас.

person Geoff    schedule 09.10.2020