Извлечение всех идентификаторов томов для всех экземпляров, соответствующих тегу, с помощью AWS CLI

#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.