如何解决将新的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
}
这使您可以拥有一个自动缩放器,该缩放器可以保留卷并为您处理复杂性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。