首页 > 解决方案 > 使用 AWS CLI 检索与标签匹配的所有实例的所有卷 ID

问题描述

堆栈溢出!我正在寻找一种更有效的方法来计算附加到与标签匹配的实例的 EBS 卷的总大小。请注意,我/dev/sda1只对根卷感兴趣!

目前,我正在使用以下方法来获取与标签匹配的所有实例。我遍历该输出以获取附加卷的大小。

# Calculate the total amount of storage needed for all volumes attached to production EC2 instances (based on 'prod' in the Name tag)
for i in $(aws ec2 describe-instances --query 'Reservations[].Instances[][].{Id: InstanceId}' --filters "Name=tag:Name,Values=*prod*" --output=text);
do
    size=$(aws ec2 describe-volumes --query="Volumes[].Size | [0]" --filters Name=attachment.instance-id,Values=${i} --output=text)
    total=$((total+size))
    echo "$total    $size"
done
echo "Total: $total"

这可行,但我知道它效率不高,因为我使用一个 CLI 调用来获取实例(将其替换为N),然后调用每个实例来获取卷大小。

这导致总共N+1 个命令。

我知道该describe-instances命令可以返回附加到实例的卷,然后我可以使用describe-volumes所有卷作为参数进行调用。

这将导致只有 2 个 CLI 调用!

total=0
VOLUMES=$(aws ec2 describe-instances --query … --filter ...)
SIZES=$(aws ec2 describe-volumes --volume-ids ${VOLUMES} --query 'Volumes[].Size' --output=text)
for size in ${SIZES};
do
    total=$((total+size))
    echo "$total    $size"
done
echo "Total: $total"

但是,我无法让查询返回卷。

我使用以下内容作为起点:

aws ec2 describe-instances --query 'Reservations[].Instances[][].BlockDeviceMappings[]' --filters "Name=tag:Name,Values=*prod*"

它给了我这个:

[
    {
        "DeviceName": "/dev/sda1",
        "Ebs": {
            "AttachTime": "2019-07-02T21:17:50.000Z",
            "DeleteOnTermination": true,
            "Status": "attached",
            "VolumeId": "vol-abcdef1234567890"
        }
    },
...
]

但是我无法在describe-instances调用中获得正确的查询以仅返回VolumeIds。

有什么建议么?

标签: amazon-web-servicesamazon-ec2aws-cli

解决方案


在发布此内容时进行了一些黑客攻击后,我想出了正确的查询:

aws ec2 describe-instances \
    --query 'Reservations[].Instances[][].BlockDeviceMappings[].Ebs[].VolumeId' \
    --filters "Name=tag:Name,Values=*prod*" \
    --output=text

推荐阅读