仅从一组标记的ec2实例中获取唯一标记

时间:2014-04-16 10:33:15

标签: python amazon-web-services boto

ec2标有以下内容:

的env,项目,目的

有一个属于项目和环境的实例列表。

conn = ec2.connect_to_region(region,aws_access_key_id=access_key,aws_secret_access_key=secret_key)
reservations = conn.get_all_instances(filters={"tag:env":env, "tag:project":project})
instances = [i for r in reservations for i in r.instances]
instances_id = [i.id for i in instances]

现在需要一种方法来获取标记的价值'目的'对于列表instance_id中的每个实例。

这样我就可以根据目的采取行动。

我正在浏览boto的get_all_tags函数,但我无法弄清楚如何在函数的过滤器中获取每个instance_id。还有一件事我只需要用于目的的唯一值。

我如何完成这项工作?

2 个答案:

答案 0 :(得分:1)

我认为您需要一种方法来根据目标标记的值对所有实例进行分组。

def get_instances_by_purpose(access_key,secret_key,region,env,project):
    conn = ec2.connect_to_region(region,aws_access_key_id=access_key,aws_secret_access_key=secret_key)
    reservations = conn.get_all_instances(filters={"tag:env":env, "tag:project":project})
    instances = [i for r in reservations for i in r.instances]
    instances_by_purpose = {}
    [instances_by_purpose.setdefault(i.tags.get('purpose'), []).append(i.id) for i in instances]
    return instances_by_purpose

instances_by_purpose变量包含一个字典,其中的键是所有可能的目标值,每个目的的值都是具有该目的的所有实例的列表。

e.g。目的值=" webserver"," backupserver"," logging" 输出将是 {"网络服务器":[" I-sdfsfd"" I-sdfsfd"" I-sdfsfd&#34], " backupserver将":[" I-werwer"" I-erwer"" I-3242erds&#34], ..... }

您可以对此进行更改,使其成为公共IP或私有IP的列表,或者您可以从实例对象中提取的任何其他属性。 例如如果您需要公共IP,请按如下所示更改列表推导:

[instances_by_purpose.setdefault(i.tags.get('purpose'), []).append(i.ip_address) for i in instances]

然后,您可以将其提供给另一个根据目的处理此有效负载的函数。

答案 1 :(得分:0)

试试这个:

for inst in instances:
    if 'purpose' in inst.tags:
        print "%s -> %s" % (inst.id, inst.tags['purpose'])

输出:

i-0123abcd -> foo
i-0123abcf -> bar