【问题标题】:Retrieve All Volume IDs for All Instances that Match a Tag Using AWS CLI使用 AWS CLI 检索与标签匹配的所有实例的所有卷 ID
【发布时间】: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


    【解决方案1】:

    在我发布这篇文章时进行了一些黑客攻击,我想出了正确的查询:

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

    【讨论】:

    • 作为参考,第一个 N+1 调用的方法需要 1m6.263s 约 50 个实例。第二个调用 2 次的方法耗时 0m5.271s。
    猜你喜欢
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2013-03-25
    • 2022-08-15
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多