2014-04-14 12 views
12

Uso i tag per tenere traccia delle istanze EC2, ad esempio (Progetto, Ambiente). Ho un caso d'uso in cui ho bisogno di filtrare solo quelle istanze che appartengono a un progetto specifico e ad un ambiente specifico.Filtraggio di istanze ec2 con boto

Quando uso il filtro con boto e passo questi due valori ottengo un risultato che fa un OR piuttosto che un AND dei filtri e quindi ricevo un elenco di istanze che appartengono a progetti diversi ma allo stesso ambiente.

Ora posso utilizzare due elenchi e quindi confrontare le istanze in ciascuno e ottenere l'insieme desiderato di istanze, ma esiste un modo migliore per ottenere questo risultato?

Ecco quello che sto facendo:

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] 

Ora l'elenco di istanze che sto ottenendo dà tutte le istanze del progetto specificato indipendentemente l'ambiente e per tutte le istanze dall'ambiente specificato indipendentemente dal progetto .

+0

questo spiega anche molto: http://stackoverflow.com/questions/19361615/filter-boto-instance-list-by-tag-component-foo-or-tagcomponent-bar –

risposta

22

È possibile utilizzare la sintassi tag:key=value per eseguire una ricerca AND sui propri filtri.

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 

See EC2 API per i dettagli http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html

Il problema con la sintassi che hai usato è che un dict Python ha chiavi univoche, in modo che la seconda voce tag-key sovrascrive il primo :-(

Seb

+1

Ma è possibile avere un elenco di valori per una chiave nel dizionario. – garnaat

+0

Grazie per la risposta sebsto, questo funziona perfettamente bene. – user3228188

+1

@garnaat: in base ai [documenti API EC2] (http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeInstances.html), "È possibile specificare più valori per un filtro. La risposta include informazioni per un'istanza solo se corrisponde ad almeno uno dei valori del filtro che hai specificato. " Quindi sembra che avere più valori per una chiave corrispondano a elementi che soddisfano _any_ dei valori, non tutti in una volta (come credo che l'OP voglia). –

0

Mentre il documentation non specifica specificamente cosa succede con più filtri, l'ORing può essere di progettazione. In questo caso, passare gli attributi richiesti in sequenza alla funzione e passare il risultato dell'invocazione precedente a quello successivo (utilizzando il parametro instance_ids). Ciò limiterà i risultati in ogni passaggio con il filtro aggiuntivo. Gli attributi vengono quindi applicati in sequenza restituendo il risultato ANDed desiderato.

Problemi correlati