Jak uruchomić skrypt lub polecenie na instancji EC2 za pośrednictwem interfejsu AWS CLI?

13

Zgodnie z artykułem informacyjnym New EC2 Run Command , AWS CLI powinien obsługiwać nowe polecenie podrzędne do wykonywania skryptów na zdalnych instancjach EC2.

Jednak zameldowałem się aws ec2 help, ale nie mogę znaleźć odpowiedniego polecenia.

Zainstalowałem awsprzez apt-get:

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

Którego polecenia podrzędnego powinienem szukać i jakiej składni użyć, powiedzmy ipconfigw PowerShell na zdalnej instancji EC2?

kenorb
źródło
1
Do wiadomości, ten artykuł pochodzi z 2015 roku, więc nie nazwałbym go „nowym” poleceniem podrzędnym. Sprawdziłem repozytorium kodu źródłowego ( github.com/aws/aws-cli ) dla aws-cli i nie mogłem znaleźć żadnej wzmianki o nim w dokumentach, przykładach, informacjach o wydaniu ani przez krótkie przejrzenie kodu . Złożyłem problem ( github.com/aws/aws-cli/issues/3126 ) i prześlę odpowiedź, gdy otrzymam opinię.
PrestonM

Odpowiedzi:

11

Aby uruchomić ipconfig z polecenia Uruchom menedżera systemów AWS:

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

Uwaga: jeśli wystąpił błąd, rozważ podanie prawa --region.

Zakłada się, że masz poprawnie skonfigurowane poświadczenia AWS i CLI. Aby uzyskać więcej informacji, zobacz Przewodnik po uruchamianiu poleceń menedżera systemów Korzystanie z interfejsu AWS CLI .


Oto praktyczny przykład polecenia powłoki wysyłania i otrzymywania danych wyjściowych polecenia:

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
źródło
3

Oto pomocniczy skrypt Bash, który służy aws ssm send-commanddo uruchamiania poleceń:

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

Stosowanie:

 ./run_ec2_ps_cmd.sh instance-id command

Przykład:

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

Aby wykonać większe wyjścia, zobacz: Jak uniknąć obcinania wyjścia podczas uruchamiania polecenia AWS SSM?

kenorb
źródło
Właściwie najlepszy przykład tutaj. Poproś więcej głosów pozytywnych.
Sanctus
3

Tak, możesz to zrobić za pomocą menedżera AWS Systems. Uruchom polecenie AWS Systems Manager pozwala na zdalne i bezpieczne uruchamianie zestawu poleceń na serwerze EC2 oraz na serwerze lokalnym. Poniżej znajdują się kroki na wysokim szczeblu, aby to osiągnąć.

Dołącz rolę IAM instancji: Instancja ec2 musi mieć rolę IAM z polityką AmazonSSMFullAccess. Ta rola umożliwia instancji komunikację z interfejsem API programu Systems Manager.

Zainstaluj agenta SSM: Instancja EC2 musi mieć zainstalowanego agenta SSM. Agent SSM przetwarza żądania uruchomienia polecenia i konfiguruje instancję zgodnie z poleceniem.

Wykonaj polecenie: Przykładowe użycie za pomocą interfejsu AWS CLI:

Wykonaj następujące polecenie, aby pobrać usługi uruchomione w instancji. Zamień identyfikator wystąpienia na identyfikator wystąpienia 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

Bardziej szczegółowe informacje: tutaj

ExploringApple
źródło
3

Oto coś super fajnego, co robię z AWS SSM Send-Command!

Za pomocą Apache Airflow tworzę zupełnie nową instancję EC2 przy użyciu szablonu formacji chmurowej (w skrócie CFT), który jest tylko plikiem JSON ze wszystkimi wartościami konfiguracji dla mojej instancji EC2, którą chcę; Zauważ też, że w tym CFT mam również polecenie bootstrap, które kopiuje skrypt Pythona z lokalizacji S3 do nowej instancji EC2, dzięki czemu mogę go później wykonać za pomocą polecenia wysyłania SSM! Robię to za pomocą Python3 i AWS SDK dla Python3 o nazwie biblioteka Boto3. Oto część polecenia tworzenia nowego stosu CFT, który z kolei tworzy moją nową instancję EC2:

import boto3

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

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

Następnie mogę uzyskać identyfikator nowej instancji EC2 (wymagany do użycia polecenia wysyłania SSM) za pomocą czegoś takiego:

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

Następnie mogę uzyskać identyfikator wystąpienia bieżącej instancji EC2 serwera bieżącego pracownika Airflow, uruchamiając tę ​​komendę wget -q -O - http://169.254.169.254/latest/meta-data/instance-idza pomocą języka 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]

TERAZ!!!! NA WIELKI FINAŁ

Następnie mogę wykonać skrypt na utworzonej przeze mnie nowej instancji EC2 i wysłać ten skrypt bez względu na parametry / argumenty, jakie chcę ... w tym identyfikator instancji serwera, który wysłał polecenie wysyłania SSM, w ten sposób po zakończeniu skryptu działając na nowej instancji EC2, może wysłać kolejną komendę SSM Send-Command z powrotem na mój serwer Airflow, aby poinformować go, że skrypt został zakończony. To jest na bardzo wysokim poziomie bez szczegółów, ale to tylko demonstracja pomysłu :)

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

Nie jestem pewien, czy to pomogło komukolwiek, ale jest to fajny i zabawny przykład robienia czegoś z AWS SSM Send-Command! Chociaż prawdopodobnie kod pachnie xD

Kyle Bridenstine
źródło