#amazon-web-services #amazon-ec2 #aws-cli
#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
s.
Есть предложения?
Ответ №1:
После некоторого взлома, пока я публиковал это, я придумал правильный запрос:
aws ec2 describe-instances
--query 'Reservations[].Instances[][].BlockDeviceMappings[].Ebs[].VolumeId'
--filters "Name=tag:Name,Values=*prod*"
--output=text
Комментарии:
1. Для справки, первый метод с N 1 вызовами занял 1m6.263s для ~ 50 экземпляров. Второй метод с 2 вызовами занял 0m5.271s.