我有大约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)
过滤和检索实例的代码中有一些小错误。你知道吗
请注意,EC2 resource API上的
ec2.instances.filter()
方法返回EC2实例,与ec2.Instance类型的对象一样,无需将其缩减为实例id列表,然后在has_small_vols()
方法中,将实例id转换回ec2.Instance
类型的对象。您只需在整个过程中使用ec2.Instance
对象列表,如果需要的话,在最后转换为实例id列表。你知道吗请尝试以下操作:
注意client and resource APIs in boto3是完全不同的。你知道吗
相关问题 更多 >
编程相关推荐