【问题标题】:Terraform AWS : Couldn't reuse previously created root_block_device with AWS EC2 instance launched with aws_launch_configurationTerraform AWS:无法将先前创建的 root_block_device 与使用 aws_launch_configuration 启动的 AWS EC2 实例重用
【发布时间】:2020-11-22 03:14:05
【问题描述】:

我已经使用 terraform 将 ELK 堆栈部署到 AWS ECS。几周前一切都运行良好,但 2 天前我不得不重新启动实例。

遗憾的是,新实例不依赖现有卷来挂载根块设备。所以我的所有 elasticsearch 数据不再可用于我的 Kibana 实例。

数据还在,上一卷,目前未使用。

所以我尝试了很多方法来将此卷附加到“dev/xvda”,但没有示例:

  • 使用 ebs_block_device 而不是 root_block_device 使用
  • 当实例已经运行时交换“dev/xvda”

我正在使用带有 aws_launch_configuration 的 aws_autoscaling_group。

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]

}

我是否错过了一些显而易见的事情?

【问题讨论】:

    标签: amazon-web-services terraform amazon-ecs terraform-provider-aws


    【解决方案1】:

    遗憾的是,您不能将卷作为根卷附加到实例。

    您需要做的是根据您的音量创建一个自定义 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"
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-11
      • 2023-03-31
      • 2020-04-23
      • 2020-11-29
      • 2021-11-15
      • 2018-11-03
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多