Wie führe ich ein Skript oder einen Befehl auf einer EC2-Instanz über AWS CLI aus?

12

Laut dem Nachrichtenartikel New EC2 Run Command sollte AWS CLI einen neuen Unterbefehl zum Ausführen von Skripten auf Remote-EC2-Instanzen unterstützen.

Ich habe zwar eingecheckt aws ec2 help, kann aber den entsprechenden Befehl nicht finden.

Ich habe installiert awsüber apt-get:

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

Nach welchem ​​Unterbefehl sollte ich suchen und welche Syntax muss ausgeführt werden, beispielsweise ipconfigin PowerShell auf der Remote-EC2-Instanz?

Kenorb
quelle
1
Zu Ihrer Information, dieser Artikel stammt aus dem Jahr 2015, daher würde ich ihn nicht als "neuen" Unterbefehl bezeichnen. Ich habe das Quellcode-Repository ( github.com/aws/aws-cli ) nach aws-cli durchsucht und konnte in den Dokumenten, Beispielen, Versionshinweisen oder durch kurzes Durchsehen des Codes keine Erwähnung finden . Ich habe ein Problem eingereicht ( github.com/aws/aws-cli/issues/3126 ) und werde eine Antwort senden, wenn ich Feedback erhalte.
PrestonM

Antworten:

10

So führen Sie ipconfig über den Ausführungsbefehl von AWS Systems Manager aus:

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

Hinweis: Wenn Sie den Fehler haben, sollten Sie das richtige angeben --region.

Dies setzt voraus, dass Sie Ihre AWS-Anmeldeinformationen und Ihre CLI ordnungsgemäß konfiguriert haben. Siehe System Manager Run Command Lösungsweg Mit dem AWS CLI für weitere Informationen.


Hier ist das praktische Beispiel für einen Shell-Befehl zum Senden und Abrufen der Befehlsausgabe:

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
Swysocki
quelle
3

Hier ist ein Bash-Hilfsskript, mit aws ssm send-commanddem die Befehle ausgeführt werden:

#/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

Verwendung:

 ./run_ec2_ps_cmd.sh instance-id command

Beispiel:

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

Informationen zum Ausführen größerer Ausgaben finden Sie unter: So vermeiden Sie, dass die Ausgabe beim Ausführen des AWS SSM-Befehls abgeschnitten wird.

Kenorb
quelle
Eigentlich bestes Beispiel hier. Bitte mehr Upvotes.
Sanctus vor
3

Hier ist etwas super cooles, was ich mit AWS SSM Send-Command mache!

Mit Apache Airflow erstelle ich eine brandneue EC2-Instanz mit einer Cloud Formation-Vorlage (kurz CFT), die nur eine JSON-Datei mit allen gewünschten Konfigurationswerten für meine EC2-Instanz ist. Beachten Sie auch, dass ich in dieser CFT auch einen Bootstrap-Befehl habe, der ein Python-Skript von einem S3-Speicherort in die neue EC2-Instanz kopiert, damit ich es später mit einem SSM-Sendebefehl ausführen kann! Ich mache dies mit Python3 und dem AWS SDK für Python3 namens Boto3-Bibliothek. Hier ist ein Teil des Befehls zum Erstellen des neuen CFT-Stapels, der wiederum meine neue EC2-Instanz erstellt:

import boto3

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

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

Dann kann ich die Instanz-ID der neuen EC2-Instanz (erforderlich, um den SSM-Sendebefehl zu verwenden) wie folgt abrufen:

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

Dann kann ich die Instanz-ID der EC2-Instanz des aktuellen Airflow Worker-Servers erhalten, indem ich diesen Befehl wget -q -O - http://169.254.169.254/latest/meta-data/instance-idüber Python ausführe:

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]

JETZT!!!! FÜR DAS GRAND FINALE

Ich kann dann ein Skript auf der neuen EC2-Instanz ausführen, die ich erstellt habe, und dieses Skript mit allen gewünschten Parametern / Argumenten senden ... einschließlich der Instanz-ID des Servers, der den SSM-Sendebefehl gesendet hat, damit mein Skript fertig ist Auf der neuen EC2-Instanz kann ein weiterer SSM-Sendebefehl an meinen Airflow-Server zurückgesendet werden, um ihm mitzuteilen, dass das Skript fertig ist. Dies ist auf einem sehr hohen Niveau ohne Details, aber es dient nur dazu, eine Idee zu demonstrieren :)

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'))

Ich bin mir nicht sicher, ob dies jemandem geholfen hat, aber es ist ein cooles und lustiges Beispiel dafür, wie man etwas mit dem AWS SSM Send-Command macht! Allerdings riecht wahrscheinlich ein Code xD

Kyle Bridenstine
quelle
2

Ja, Sie können dies mit AWS Systems Manager tun. Mit AWS Systems Manager Run Command können Sie eine Reihe von Befehlen remote und sicher auf EC2- und On-Premise-Servern ausführen. Im Folgenden finden Sie allgemeine Schritte, um dies zu erreichen.

Instanz-IAM-Rolle anhängen: Die ec2-Instanz muss eine IAM-Rolle mit der Richtlinie AmazonSSMFullAccess haben. Diese Rolle ermöglicht der Instanz die Kommunikation mit der Systems Manager-API.

SSM-Agenten installieren: Auf der EC2-Instanz muss der SSM-Agent installiert sein. Der SSM-Agent verarbeitet die Ausführungsbefehlsanforderungen und konfiguriert die Instanz gemäß dem Befehl.

Befehl ausführen: Beispiel für die Verwendung über AWS CLI:

Führen Sie den folgenden Befehl aus, um die auf der Instanz ausgeführten Dienste abzurufen. Ersetzen Sie die Instanz-ID durch die ec2-Instanz-ID.

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

Nähere Informationen: hier

ExploringApple
quelle