タグを使用して、(プロジェクト、環境)などのEC2インスタンスを追跡します。特定のプロジェクトと特定の環境に属するインスタンスのみをフィルタリングする必要がある使用例があります。
Botoでフィルターを使用してこれら2つの値を渡すと、フィルターのANDではなくORを実行する結果が得られるため、異なるプロジェクトに属するインスタンスのリストを受け取りますが、同じ環境。
これで、2つのリストを使用して、それぞれのインスタンスを比較し、必要なインスタンスのセットを取得できますが、これを行うより良い方法はありますか?
これが私がやっていることです:
conn = ec2.EC2Connection('us-east-1',aws_access_key_id='XXX',aws_secret_access_key='YYY')
reservations = conn.get_all_instances(filters={"tag-key":"project","tag-value":<project-name>,"tag-key":"env","tag-value":<env-name>})
instances = [i for r in reservations for i in r.instances]
これで、取得しているインスタンスリストに、環境に関係なく指定されたプロジェクトのすべてのインスタンスと、プロジェクトに関係なく指定された環境のすべてのインスタンスが表示されます。
tag:key=value
構文を使用して、フィルターでAND検索を実行します。
import boto.ec2
conn = boto.ec2.connect_to_region('us-east-1',aws_access_key_id='xx', aws_secret_access_key='xx')
reservations = conn.get_all_instances(filters={"tag:Name" : "myName", "tag:Project" : "B"})
instances = [i for r in reservations for i in r.instances]
print instances
詳細については、EC2 APIを参照してください http://docs.aws.Amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html
使用した構文の問題は、Python dictに一意のキーがあるため、2番目のtag-key
エントリは最初のものを上書きします:-(
セブ
documentation は複数のフィルターで何が起こるかを具体的に述べていませんが、ORは仕様による場合があります。この場合、必要な属性を順番に関数に渡し、前の呼び出しの結果を次の呼び出しに渡します(instance_idsパラメーターを使用)。これにより、追加のフィルターを使用して各ステップの結果が制限されます。次に、属性が順番に適用され、必要なAND演算の結果が返されます。