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
。
有什么建议吗?
答案 0 :(得分:0)
在我发布此内容后进行了一些黑客攻击之后,我想到了正确的查询:
aws ec2 describe-instances --query 'Reservations[].Instances[][].BlockDeviceMappings[].Ebs[].VolumeId' --filters "Name=tag:Name,Values=*prod*" --output=text