【问题标题】:Mount ebs volumes automatically with ebs volume id only仅使用 ebs 卷 ID 自动挂载 ebs 卷
【发布时间】:2014-10-08 11:49:00
【问题描述】:

假设您有一组用于数据的 ebs 卷,并且您经常将这些相同的 EBS 卷集安装到随时间变化的 ec2 节点(因为您每次不再需要它时都将其杀死并创建一个新的当你再次需要它时)但是在每个创建 ec2 实例可能有不同的 virtype、操作系统、实例类型等等(无论出于何种原因),当你所有的时候,在给定的 ec2 实例上自动挂载这些 EBS 卷的最佳方法是什么是否有 ebs 卷 id 和访问 ec2 api 以获取 ebs 设备名称?

有什么程序可以这样做吗?

顺便说一句,我不是在谈论附加卷,并且有兴趣在创建实例时自动挂载到 os 文件系统上的已知目录,因为与 ec2 上的设备名称相比,设备名称因操作系统而异,而且它也是首选在 /etc/fstab 中使用 UUID 而不是设备名称。

【问题讨论】:

    标签: amazon-web-services amazon-ec2


    【解决方案1】:

    使用文件系统标签:

    $ tune2fs -L "disk1" /dev/xvdf
    $ tune2fs -L "disk2" /dev/xvdg
    

    在您的 /etc/fstab 中:

    LABEL=disk1 /disk1 auto defaults 0 2
    LABEL=disk2 /disk2 auto defaults 0 2
    

    在你/etc/rc.local:

    # Note: You could store the volume-ids and devices in the ec2 tags of your instance.
    
    INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
    export AWS_DEFAULT_REGION=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//')
    
    aws ec2 attach-volume --volume-id vol-1234abcd --instance-id $INSTANCE_ID --device /dev/xvdf
    aws ec2 attach-volume --volume-id vol-1234abcf --instance-id $INSTANCE_ID --device /dev/xvdg
    
    # wait for them to mount
    until [ "$(aws ec2 describe-volume-status --volume-id vol-1234abcd --query 'VolumeStatuses[0].VolumeStatus.Status' --output text)" = ok ]; do sleep 5; done
    
    until [ "$(aws ec2 describe-volume-status --volume-id vol-1234abcf --query 'VolumeStatuses[0].VolumeStatus.Status' --output text)" = ok ]; do sleep 5; done
    
    # mount /etc/fstab entries
    mount -a
    
    # I also store the EIP as a tag
    EIP="$(aws ec2 describe-instances --instance-id $INSTANCE_ID --query 'Reservations[*].Instances[*].[Tags[?Key==`EIP`]|[0].Value]' --output text)"
    if [ $? -eq 0 ] && [ "$EIP" != "" ] && [ "$EIP" != "None" ]; then
      aws ec2 associate-address --instance-id $INSTANCE_ID --public-ip "$EIP" --query 'return' --output text
    fi
    

    【讨论】:

    • 不得不增加一点额外的等待,卷状态更新太快,挂载失败:until [ -b /dev/xvdf ]; do sleep 1; done
    【解决方案2】:

    您可以使用AWS CLI 和命令attach-volume 编写此脚本。

    在 AWS CLI 示例中,您的命令类似于:

    aws ec2 attach-volume --volume-id vol-1234abcd --instance-id i-abcd1234 --device /dev/sdf
    

    我还建议创建一个IAM role 并将其附加到您启动的 ec2 实例,这样您就不必将任何 IAM 用户的凭证放在该实例上。

    您提到您可能在 ec2 启动时将卷附加到不同的操作系统,在这种情况下,所有操作系统都必须支持它们希望挂载的卷上分区的文件系统类型。

    【讨论】:

    • 感谢您的回复,但这只会附加卷,不会将它们挂载到文件系统上我想要的路径。另外,设备名称因操作系统而异。我的问题是如何自动化。
    • 您可以使用 attach-volume 的 --device 选项指定要挂载到的设备名称,然后在 Linux 上使用例如“mount /dev/sdf /mountpoint”或在操作系统上使用任何合适的名称您在脚本中使用的
    • os上的设备名可以和ec2设备名不同。我知道如何手动操作,但我的问题是是否有这样的脚本可以处理所有这些差异并自动创建一个带有 UUID 的适当 fstab
    最近更新 更多