2016-07-01 18 views
5

Sto tentando di chiamare run-istanze e superare gli ID delle istanze risultanti come input per creare tag come un one-liner come segue:C'è un modo per reindirizzare l'output di un comando CLI AWS come input a un altro?

aws ec2 run-instances \ 
    --image-id ami-1234 \ 
    --output text \ 
    --query Instances[*].InstanceId | \ 
aws ec2 create-tags \ 
    --tags 'Key="foo",Value="bar"' 

Quando si tenta questo, ottengo il seguente:

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters] 
To see help text, you can run: 

    aws help 
    aws <command> help 
    aws <command> <subcommand> help 
aws: error: argument --resources is required 

È possibile qualcosa del genere o si deve ricorrere all'utilizzo di variabili (o qualche altro modo a cui non sto pensando)?

Sfondo Ulteriori

La motivazione di questa domanda è che qualcosa di simile a questo è possibile con gli strumenti di AWS per Windows PowerShell; Speravo di ottenere la stessa cosa con la CLI di AWS.

Equivalente PowerShell esempio:

New-EC2Instance -ImageId ami-1234 | 
    ForEach-Object Instances | 
    ForEach-Object InstanceId | 
    New-EC2Tag -Tag @{key='foo';value='bar'} 
+1

Avrete bisogno di scrivere uno script per catturare l'output dal primo comando e passarlo al secondo comando come parametri. Non c'è modo in cui la pipa che stai usando funzionerebbe, come farebbe a sapere cosa fare del testo che viene inserito in esso? –

+0

Questo è quello che sospettavo, volevo solo essere sicuro. FWIW qualcosa del genere è possibile con gli strumenti AWS PowerShell (i comandi dichiarano un attributo "valore dalla pipeline"), ma questa è più una funzione di PowerShell piuttosto che i comandi AWS. –

+0

@MarkB 'create-tags' prende un parametro' resources' che è l'id dell'istanza (può essere una lista, ma in questo caso sarà un valore singolo) per taggare quale è l'Id dell'istanza appena lanciata e data da il risultato della query del comando 'run-instnace'. mi sto perdendo qualcosa ? –

risposta

9

Esso può essere fatto sfruttando xargs {} per catturare gli ID di istanza per alimentarlo nel parametro --resources di creare tag.

aws ec2 run-instances \ 
    --image-id ami-1234 \ 
    --output text \ 
    --query Instances[*].[InstanceId] | \ 
xargs -I {} aws ec2 create-tags \ 
    --resources {} \ 
    --tags 'Key="foo",Value="bar"' 

Nota che a differenza del esempio nella domanda iniziale, è importante per avvolgere la parte "InstanceId" del valore del parametro --query tra parentesi in modo che se si chiama run-istanze con --count maggiore di uno , gli ID di istanze multiple che vengono restituiti verranno emessi come linee separate anziché essere delimitati da tabulazioni. Vedi http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html#controlling-output-format

+0

Grazie sinceri per la lezione shell; Temo di aver mostrato la mia ignoranza su Linux su questo. Questo ha funzionato benissimo fintanto che sto girando su un'istanza alla volta (che in tutta onestà soddisfa la mia domanda); Sto avendo problemi a capire come farlo funzionare quando --count è maggiore di 1 (di nuovo, mostrando la mia ignoranza su Linux). Se hai tempo/inclinazione, potresti aggiornare la risposta per tenere conto di più istanze? –

+2

FWIW, il motivo per cui più istanze non funzionavano ha a che fare con il valore del parametro --query: nel mio esempio restituisce il separatore di tabulazioni multiple dell'istanza. Il wrapping "InstanceId" tra parentesi nel valore del parametro --query risolve il problema. Aggiornerò la risposta Grazie per il tuo aiuto @ Frédéric –

+0

Grazie Rafael - Ho aggiornato la risposta in base alla tua proposta in quanto ho visto che è stata respinta, ma penso che abbia senso –

Problemi correlati