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

2024-04-26 07:25:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的方法是迭代每个实例,找到卷,如果卷小于60GB,则返回实例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循环中出现了问题,我不确定原因。 我是从here那里得到这个主意的

我试过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)

Tags: 实例instanceinredisidforboto3ec2
1条回答
网友
1楼 · 发布于 2024-04-26 07:25:06

过滤和检索实例的代码中有一些小错误。你知道吗

请注意,EC2 resource API上的ec2.instances.filter()方法返回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)

注意client and resource APIs in boto3是完全不同的。你知道吗

相关问题 更多 >