为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

波斯汪 2022-05-19 16:10:00
我有大约 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 boto3ec2 = 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-a689ba6efaec2.Instance.volumesCollection(ec2.Instance(id="ec2.Instance(id='i-a689ba6efa')"), ec2.Volume)i-f4b8212aev5748dec2.Instance.volumesCollection(ec2.Instance(id="ec2.Instance(id='i-f4b8212aev5748d')"), ec2.Volume)i-0Ad235afh3a1d0f4ec2.Instance.volumesCollection(ec2.Instance(id="ec2.Instance(id='i-0Ad235afh3a1d0f4')"), ec2.Volume)
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

您过滤和检索实例的代码中存在小错误。


请注意,ec2.instances.filter()EC2 资源 API 上的方法返回 EC2 实例,就像在ec2.Instance类型的对象中一样,无需将其减少为实例 ID 列表,然后在您的has_small_vols()方法中将实例 ID 转换回对象的类型ec2.Instance。您可以简单地在ec2.Instance整个过程中使用对象列表,如果需要,最后转换为实例 ID 列表。


尝试以下操作:


import boto3


ec2 = boto3.resource('ec2')


def has_small_vols(instance):

    vols = instance.volumes.all()

    for volume in vols:

        if volume.size < 60:

            return True

    return False


def get_redis_nodes():

    filters = [

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

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

    ]

    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 完全不同。


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信