将新的AWS EBS卷添加到相同AZ中的ASG

问题描述

好的,所以我试图使用用户数据将使用Terraform创建的EBS卷附加到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)
} 

在以上资源中,我正在使用随机提供程序从AZ列表中获取一个AZ,并将相同的列表提供给以下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}时,上面将附加新创建的卷。

但是,它失败了,因为实例和卷位于不同的可用区中。

在ASG和Volume上对AZ进行硬编码,有人能帮助我做为更好的解决方案吗?

解决方法

我将不得不了解更多有关您尝试通过aws提供程序和terraform解决此问题的方法。老实说,大多数想法都会有些复杂。

每个AZ您可以拥有一个ASG。否则,ASG将在每次启动时选择一些可用区。并且在AZ中的实例将比在其他AZ中没有其他实例的卷和卷更多。

因此,您可以每个az创建多个卷,每个az创建一个ASG。然后,用户数据应列出AZ中未附加到实例的所有卷。然后选择第一个未连接的卷的ID。然后附上它。如果所有附件均已附加,则应触发警报,因为实例数多于卷数。

任何尝试使用单个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
}

这使您可以拥有一个自动缩放器,该缩放器可以保留卷并为您处理复杂性。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...