【发布时间】:2020-09-28 19:29:45
【问题描述】:
堆栈溢出!我正在寻找一种更有效的方法来计算附加到与标签匹配的实例的 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-services amazon-ec2 aws-cli