如何从实例元数据端点获取正确的Amazon挂载EBS设备
如何从实例元数据端点获取已挂载的Amazon EBS设备?
如果你在EC2实例内部,直接通过**实例元数据服务(IMDS)**就能快速获取已挂载的EBS设备信息,不用绕去调用AWS CLI。下面是具体步骤:
1. 先获取IMDSv2令牌(推荐使用IMDSv2)
IMDSv2比v1更安全,先请求一个有效期6小时的令牌:
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
2. 列出所有映射的块设备
用令牌访问块设备映射路径,就能看到所有关联的设备标识:
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/block-device-mapping/
输出类似这样:
ami root xvdb
3. 查看单个设备的详细映射信息
比如要查xvdb对应的EBS卷信息,直接访问该设备的路径:
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/block-device-mapping/xvdb
会返回对应的EBS卷ID,比如vol-0987654321fedcba0。
顺便优化你用AWS CLI的查询方式
你之前的aws ec2 describe-instances | jq . | grep -i device输出混乱,是因为直接grep会把多个实例的信息混在一起。如果想用CLI精准查询当前实例的EBS设备,试试这个:
- 先获取当前实例ID:
INSTANCE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id)
- 精准查询该实例的块设备映射:
aws ec2 describe-instances --instance-ids $INSTANCE_ID | jq '.Reservations[].Instances[].BlockDeviceMappings'
会得到结构清晰的JSON输出,能直接看到每个EBS设备的名称、卷ID、挂载状态等:
[ { "DeviceName": "/dev/sda1", "Ebs": { "VolumeId": "vol-1234567890abcdef0", "Status": "attached", "AttachTime": "2023-01-01T00:00:00+00:00", "DeleteOnTermination": true } }, { "DeviceName": "/dev/xvdb", "Ebs": { "VolumeId": "vol-0987654321fedcba0", "Status": "attached", "AttachTime": "2023-01-02T00:00:00+00:00", "DeleteOnTermination": false } } ]
小提示:实例内实际设备名可能有差异
AWS控制台/CLI显示的设备名(比如/dev/sda1),在Ubuntu这类系统里可能会显示为/dev/xvda1。你可以用lsblk命令查看实例内实际挂载的设备及其挂载点,结合元数据信息就能准确对应上:
lsblk
内容的提问来源于stack exchange,提问作者brainstorm
相关产品推荐
相关产品推荐

