簡體   English   中英

將新的 AWS EBS 卷添加到同一可用區中的 ASG

[英]Adding new AWS EBS Volume to ASG in same AZ

好的,所以我正在嘗試將我使用 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 來解決此問題。 老實說,大多數想法都會有點復雜。

您可以為每個可用區設置一個 ASG。 否則,ASG 將在每次啟動時選擇一些可用區。 並且您在一個可用區中擁有的實例將多於在其他可用區中沒有實例可附加到的卷和卷。

因此,您可以為每個可用區創建多個卷,並為每個可用區創建一個 ASG。 然后 userdata 應該列出 AZ 中所有未附加到實例的卷。 然后選擇未附加的第一個卷的 ID。 然后附上它。 如果所有都已附加,您應該觸發警報,因為您擁有的實例多於卷。

任何使用單個 ASG 執行此操作的嘗試實際上都是嘗試編寫您自己的 ASG,但這樣做的方式與您的實際 ASG 相沖突。


但是有一家公司提供將此作為服務進行管理。 它們還可以幫助您將它們作為 Spot 實例進行管理以節省成本: 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
}

這使您可以擁有一個自動縮放器,可以保留卷並為您處理復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM