使用AWS CLI检索与标签匹配的所有实例的所有卷ID

时间:2020-09-28 19:29:45

标签: amazon-web-services amazon-ec2 aws-cli

StackOverflow!我正在寻找一种更有效的方法来计算与标签匹配的实例所附加的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调用中得到正确的查询,仅返回VolumeId

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

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