Come eseguire uno script o un comando sull'istanza EC2 tramite l'interfaccia della riga di comando di AWS?


13

Secondo l' articolo delle novità del comando Run EC2 , l'interfaccia della riga di comando di AWS dovrebbe supportare un nuovo comando secondario per eseguire script su istanze EC2 remote.

Tuttavia, ho effettuato il check-in aws ec2 help, ma non riesco a trovare il comando pertinente.

Ho installato awstramite apt-get:

$ aws --version
aws-cli/1.14.32 Python/3.5.4 Linux/4.12.7-64 botocore/1.8.36

Quale sottocomando dovrei cercare e qual è la sintassi da eseguire, diciamo ipconfigin PowerShell sull'istanza EC2 remota?


1
Cordiali saluti, l'articolo è del 2015, quindi non lo definirei un "nuovo" sottocomando. Ho controllato il repository del codice sorgente ( github.com/aws/aws-cli ) per aws-cli, e non sono riuscito a trovare alcun riferimento nei documenti, negli esempi, nelle note di rilascio o attraverso una breve occhiata al codice . Ho presentato un problema ( github.com/aws/aws-cli/issues/3126 ) e invierò una risposta quando riceverò un feedback.
PrestonM,

Risposte:


11

Per eseguire ipconfig dal comando Esegui di AWS Systems Manager:

$ aws ssm send-command --document-name "AWS-RunPowerShellScript" --instance-ids "<your instance id>" --parameters commands=ipconfig

Nota: se hai l'errore, considera di specificare il diritto --region.

Ciò presuppone che le credenziali e la CLI di AWS siano configurate correttamente. Per ulteriori informazioni, consultare la procedura dettagliata Comando di esecuzione di Systems Manager utilizzando l'interfaccia della riga di comando di AWS .


Ecco il pratico esempio del comando shell di invio e acquisizione dell'output del comando:

cmdid=$(aws ssm send-command --instance-ids "i-ch3ng3th1s" --document-name "AWS-RunPowerShellScript" --parameters commands=ipconfig --query "Command.CommandId" --output text)
aws ssm list-command-invocations --command-id "$cmdid" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text

3

Ecco uno script Helper Bash che utilizza aws ssm send-commandper eseguire i comandi:

#/usr/bin/env bash -x
# Script to run PowerShell script on the Windows instance.
instanceId="$1"
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --parameters commands="'${@:2}'")
[ $? -ne 0 ] && { echo "Usage: $0 instance_id command"; exit 1; }
while [ "$(aws ssm list-command-invocations --command-id "$cmdId" --query "CommandInvocations[].Status" --output text)" == "InProgress" ]; do sleep 1; done
aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text

Uso:

 ./run_ec2_ps_cmd.sh instance-id command

Esempio:

$ ./run_ec2_ps_cmd.sh i-xyz hostname
ip-xyz

Per eseguire output più grandi, vedi: Come evitare che l'output venga troncato quando si esegue il comando AWS SSM?


In realtà il miglior esempio qui. Più voti, per favore.
Sanctus,

3

Sì, puoi farlo con AWS Systems Manager. Il comando Esegui di AWS Systems Manager ti consente di eseguire in remoto e in modo sicuro un set di comandi su EC2 e sul server locale. Di seguito sono riportati i passaggi di alto livello per raggiungere questo obiettivo.

Collega ruolo IAM istanza: l'istanza ec2 deve avere un ruolo IAM con la politica AmazonSSMFullAccess. Questo ruolo consente all'istanza di comunicare con l'API di Systems Manager.

Installa agente SSM: sull'istanza EC2 deve essere installato l'agente SSM. L'agente SSM elabora il comando di esecuzione e configura l'istanza come da comando.

Esegui comando: esempio di utilizzo tramite l'interfaccia della riga di comando di AWS:

Eseguire il comando seguente per recuperare i servizi in esecuzione sull'istanza. Sostituisci ID istanza con ID istanza ec2.

aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text

Informazioni più dettagliate: qui


3

Ecco qualcosa di fantastico che faccio con AWS SSM Send-Command!

Usando Apache Airflow creo una nuovissima istanza EC2 utilizzando un modello di formazione cloud (o CFT in breve) che è solo un file JSON con tutti i valori di configurazione per la mia istanza EC2 che desidero; nota anche che in questo CFT ho anche un comando bootstrap che copia uno script Python da una posizione S3 alla nuova istanza EC2 in modo da poterlo eseguire in seguito usando un comando di invio SSM! Faccio questo usando Python3 e l'SDK AWS per Python3 chiamato libreria Boto3. Ecco parte del comando per creare il nuovo stack CFT che a sua volta crea la mia nuova istanza EC2:

import boto3

cft = boto3.client("cloudformation", "us-east-1")

response = cft.create_stack(
    StackName='foobarStackName',
    TemplateBody=json.dumps(json_data))

Quindi posso ottenere l'ID istanza del nuovo EC2-Instance (necessario per utilizzare il comando di invio SSM) usando qualcosa del genere:

response = cft.describe_stacks(
    StackName='foobarStackName',
)

Quindi posso ottenere l'ID istanza dell'istanza EC2 del server di Airflow Worker corrente eseguendo questo comando wget -q -O - http://169.254.169.254/latest/meta-data/instance-idtramite Python:

output = subprocess.Popen(['wget', '-q', '-O', '-', 'http://169.254.169.254/latest/meta-data/instance-id'],
                          stdout=subprocess.PIPE)

# Do some weird stuff to get the value (I'm a Java developer so excuse my bad Python skilz)
instanceId = output.communicate()    
instanceId = str(instanceId).split("'")[1]

ADESSO!!!! PER IL GRAND FINALE

Posso quindi eseguire uno script sulla nuova istanza EC2 che ho creato e inviare quello script qualunque parametro / argomento io voglia ... incluso l'ID istanza del server che ha inviato il comando di invio SSM in questo modo quando il mio script è terminato in esecuzione sulla nuova istanza EC2, può inviare un altro comando di invio SSM al mio server Airflow per dirgli che lo script è terminato. Questo è di altissimo livello senza dettagli ma è solo per dimostrare un'idea :)

subprocess.run(shlex.split('sudo aws ssm send-command --document-name "AWS-RunShellScript" --parameters commands=["sudo python3 /home/ec2-user/ec2_file_sensor.py ' + filepath + ' ' + batchIdValue + ' ' + source + ' ' + fileType + ' ' + airflowWorkerInstanceId + '"] --instance-ids ' + ec2ResourceInstanceId + ' --region us-east-1'))

Non sono sicuro che questo abbia aiutato qualcuno, ma è un esempio divertente e DIVERTENTE di fare qualcosa con il comando di invio SSM di AWS! Anche se, probabilmente un odore di codice xD

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.