Terraform AWS: не удалось повторно использовать ранее созданное root_block_device с экземпляром AWS EC2, запущенным с aws_launch_configuration - PullRequest
6 голосов
/ 01 августа 2020

Я развернул стек ELK на AWS ECS с терраформом. Все работало нормально в течение нескольких недель, но через 2 дня go мне пришлось перезапустить экземпляр.

К сожалению, новый экземпляр не полагался на существующий том для монтирования блочного устройства root. Таким образом, все мои данные elasticsearch больше не доступны для моего экземпляра Kibana.

Данные все еще здесь, на предыдущем томе, в настоящее время не используются.

Поэтому я пробовал много вещей, чтобы прикрепить этот том к «dev / xvda», но без, например:

  • Используйте ebs_block_device вместо root_block_device, используя
  • Поменяйте местами «dev / xvda», когда экземпляр уже запущен

Я использую aws_autoscaling_group с aws_launch_configuration.

resource "aws_launch_configuration" "XXX" {
  name = "XXX"
  image_id = data.aws_ami.latest_ecs.id
  instance_type = var.INSTANCE_TYPE
  security_groups = [var.SECURITY_GROUP_ID]
  associate_public_ip_address = true
  iam_instance_profile = "XXXXXX"

  spot_price = "0.04" 
  lifecycle {
    create_before_destroy = true

  }

  user_data = templatefile("${path.module}/ecs_agent_conf_options.tmpl",
    {
      cluster_name = aws_ecs_cluster.XXX.name
    }
  )

//The volume i want to reuse was created with this configuration. I though it would
//be enough to reuse the same volume. It doesn't.
  root_block_device {
    delete_on_termination = false
    volume_size = 50
    volume_type = "gp2"
  }
} 

resource "aws_autoscaling_group" "YYY" {
  name = "YYY"
  min_size = var.MIN_INSTANCES
  max_size = var.MAX_INSTANCES
  desired_capacity = var.DESIRED_CAPACITY
  health_check_type = "EC2"
  availability_zones = ["eu-west-3b"]
  launch_configuration = aws_launch_configuration.XXX.name

  vpc_zone_identifier = [
    var.SUBNET_1_ID,
    var.SUBNET_2_ID]

}

Я пропускаю что-то очевидное по этому поводу?

1 Ответ

3 голосов
/ 12 августа 2020

К сожалению, вы не можете прикрепить том к экземпляру как том root.

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

В terraform есть aws_ami специально для этой цели.

Следующий скрипт terraform иллюстрирует процесс в трех шагах :

  1. Создание снимка данного тома
  2. Создание AMI из снимка
  3. Создание экземпляра из AMI
provider "aws" {
   # your data
}


resource "aws_ebs_snapshot" "snapshot" {
  volume_id = "vol-0ff4363a40eb3357c" # <-- your EBS volume ID
}


resource "aws_ami" "my" {
  name                = "my-custom-ami"

  virtualization_type = "hvm"
  root_device_name    = "/dev/xvda"

  ebs_block_device {
    device_name = "/dev/xvda"
    snapshot_id = aws_ebs_snapshot.snapshot.id
    volume_type = "gp2"
  }
}

resource "aws_instance" "web" {

  ami           = aws_ami.my.id  

  instance_type = "t2.micro"
  # key_name = "<your-key-name>"

  tags = {
    Name = "InstanceFromCustomAMI"
  }
}
...