我正在尝试将挂载在/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
)"
)