使用 Boto3,如何在 EC2 实例列表中获取小于 Y 的卷?

我有大约 400 个 redis 服务器需要连接 60gb EBS 卷。一些较旧的节点将小于 60gb。


我的方法是遍历每个实例,找到卷,如果卷小于 60GB,则返回 instance_id 但它似乎不起作用。


redis = []

def has_small_vols(instlist):

    for i in instlist:

        instance = ec2.Instance(str(i))

        instid = i.instance_id

        vols = instance.volumes.all()

        for volume in vols:

            if volume.size < 60:

                redis.append(instid)

但是for volume in vols循环中有问题,我不确定为什么。我从这里得到了这个想法


我已经尝试过 boto3.resource('ec2') 并且我不确定我是否需要使用 boto3.client('ec2') 。


创建实例列表不是问题:


import boto3


ec2 = boto3.resource('ec2')


def get_redis_nodes():

    filters = [{'Name':'tag:Service', 'Values':['redis']}]

    filt = [{'Name':'tag:Environment', 'Values':['production*']}]

    instlist = list(ec2.instances.filter(Filters=filters).filter(Filters=filt).instance_id)

    return instlist

我所期望的是代码会通过过滤的实例,获取 EBS 卷,找到适合 IF 的 EBS 卷,然后附加到列表中。


但是,如果我尝试通过迭代打印,我不会得到卷大小:


     for i in instlist:

         instance = ec2.Instance(str(i))

         vols = instance.volumes.all()

         print(i.instance_id)

         print(vols)

         for volume in vols:

             print(volume.size)

>>> get_redis_info()

i-a689ba6efa

ec2.Instance.volumesCollection(ec2.Instance(id="ec2.Instance(id='i-a689ba6efa')"), ec2.Volume)

i-f4b8212aev5748d

ec2.Instance.volumesCollection(ec2.Instance(id="ec2.Instance(id='i-f4b8212aev5748d')"), ec2.Volume)

i-0Ad235afh3a1d0f4

ec2.Instance.volumesCollection(ec2.Instance(id="ec2.Instance(id='i-0Ad235afh3a1d0f4')"), ec2.Volume)



波斯汪
浏览 123回答 1
1回答

汪汪一只猫

您过滤和检索实例的代码中存在小错误。请注意,ec2.instances.filter()EC2 资源 API 上的方法返回 EC2 实例,就像在ec2.Instance类型的对象中一样,无需将其减少为实例 ID 列表,然后在您的has_small_vols()方法中将实例 ID 转换回对象的类型ec2.Instance。您可以简单地在ec2.Instance整个过程中使用对象列表,如果需要,最后转换为实例 ID 列表。尝试以下操作:import boto3ec2 = boto3.resource('ec2')def has_small_vols(instance):&nbsp; &nbsp; vols = instance.volumes.all()&nbsp; &nbsp; for volume in vols:&nbsp; &nbsp; &nbsp; &nbsp; if volume.size < 60:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return True&nbsp; &nbsp; return Falsedef get_redis_nodes():&nbsp; &nbsp; filters = [&nbsp; &nbsp; &nbsp; &nbsp; {'Name':'tag:Service', 'Values':['redis']},&nbsp; &nbsp; &nbsp; &nbsp; {'Name':'tag:Environment', 'Values':['production*']}&nbsp; &nbsp; ]&nbsp; &nbsp; return ec2.instances.filter(Filters=filters)redis_instances = get_redis_nodes()redis_instances_small = [i for i in redis_instances if has_small_vols(i)]print(redis_instances_small)redis_small_ids = [i.id for i in redis_instances_small]print(redis_small_ids)请注意,boto3中的客户端和资源 API 完全不同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python