如何使用 aws CLI 获取挂载在 /dev/sdf 处的特定实例的设备的卷 ID



我正在尝试将挂载在/dev/sdf 处的设备的卷 ID 获取到特定实例。

命令: AWS EC2 描述卷 --筛选器 名称=附件.实例-ID,值=$instance_id_main --区域美国西部-2 --输出 JSON

输出:

{
    "Volumes": [
        {
            "AvailabilityZone": "us-west-2a", 
            "Attachments": [
                {
                    "AttachTime": "2017-06-15T12:59:18.000Z", 
                    "InstanceId": "i-073cfdf5832e5a7ab", 
                    "VolumeId": "vol-096ca253d37b3e42b", 
                    "State": "attached", 
                    "DeleteOnTermination": false, 
                    "Device": "/dev/sdf"
                }
            ], 
            "Tags": [
                {
                    "Value": "NewVolume", 
                    "Key": "Name"
                }
            ], 
            "Encrypted": false, 
            "VolumeType": "gp2", 
            "VolumeId": "vol-096ca253d37b3e42b", 
            "State": "in-use", 
            "Iops": 100, 
            "SnapshotId": "", 
            "CreateTime": "2017-06-15T12:39:06.687Z", 
            "Size": 5
        }, 
        {
            "AvailabilityZone": "us-west-2a", 
            "Attachments": [
                {
                    "AttachTime": "2017-06-15T12:57:46.000Z", 
                    "InstanceId": "i-073cfdf5832e5a7ab", 
                    "VolumeId": "vol-0189e6a20392bb709", 
                    "State": "attached", 
                    "DeleteOnTermination": true, 
                    "Device": "/dev/sda1"
                }
            ], 
            "Tags": [
                {
                    "Value": "NewTesting", 
                    "Key": "Name"
                }
            ], 
            "Encrypted": false, 
            "VolumeType": "gp2", 
            "VolumeId": "vol-0189e6a20392bb709", 
            "State": "in-use", 
            "Iops": 100, 
            "SnapshotId": "snap-0a642b1f5be55819a", 
            "CreateTime": "2017-06-15T12:57:46.027Z", 
            "Size": 8
        }
    ]
}

我已经尝试使用示例中给出的描述量的 --query 选项,然后我得到了下面的输出。

命令:

aws ec2  describe-volumes --filters Name=attachment.instance-id,Values=$instance_id_main --query 'Volumes[*].{ID:VolumeId,Tag:Tags}' --region us-west-2 --output json
[
    {
        "Tag": [
            {
                "Value": "NewVolume", 
                "Key": "Name"
            }
        ], 
        "ID": "vol-096ca253d37b3e42b"
    }, 
    {
        "Tag": [
            {
                "Value": "NewTesting", 
                "Key": "Name"
            }
        ], 
        "ID": "vol-0189e6a20392bb709"
    }
]

然后我尝试获取附件,但出现以下错误。

命令:

aws ec2  describe-volumes --filters Name=attachment.instance-id,Values=$instance_id_main --query 'Volumes[*].{Attachments:Device[*]}' --region us-west-2 --output text

输出:

[
    {
        "Attachments": null
    }, 
    {
        "Attachments": null
    }
]

任何想法将不胜感激。

die() { status=$1; shift; echo "FATAL: $*"; exit $status; }
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die "wget instance-id has failed: $?"`"
EC2_AWSAVZONE=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
EC2_REGION=${EC2_AWSAVZONE::-1}
DATA_VOLUME_ID="`aws ec2 describe-volumes  --filters Name=attachment.device,Values=/dev/sdf Name=attachment.instance-id,Values=$EC2_INSTANCE_ID --query 'Volumes[*].{ID:VolumeId}' --region $EC2_REGION --output text`"
echo $DATA_VOLUME_ID

输出:

vol-096ca253d37b3e42b

另一种使用描述实例的方法

#query using instance name
aws ec2 describe-instances --query 'Reservations[].Instances[].BlockDeviceMappings[?DeviceName==`/dev/sdf`].[Ebs.VolumeId]' --filters Name=tag:Name,Values=${INSTANCE_NAME} --output=text
#query using instance-id
aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[].Instances[].BlockDeviceMappings[?DeviceName==`/dev/sdf`].[Ebs.VolumeId]' --output=text

如果您使用的是 Nitro,则可以使用 ebsnvme-id 实用程序从如下所示的设备获取卷 ID:

awk '{print $3'} < <(/sbin/ebsnvme-id  --volume /dev/nvme1n1)

奖金:

您可以使用findmnt将设备挂载到特定的挂载点,如下所示:

findmnt -noheadings --output SOURCE --target /mnt/foo

将所有这些放在一起,您可以像这样获得挂载/mnt/foo卷的 EBS 卷 ID:

awk '{print $3}' < <(
  /sbin/ebsnvme-id  --volume "$(
    findmnt -noheadings --output SOURCE --target /mnt/foo
  )"
)

最新更新