Comment exécuter un script ou une commande sur une instance EC2 via AWS CLI?

13

Selon New EC2 Commande Exécuter l' article de nouvelles, AWS CLI devrait soutenir une nouvelle sous-commande pour exécuter des scripts sur des instances EC2 à distance.

Cependant, je me suis enregistré aws ec2 help, mais je ne trouve pas la commande appropriée.

J'ai installé awsvia apt-get:

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

Quelle sous-commande dois-je rechercher et quelle est la syntaxe à exécuter, disons ipconfigdans PowerShell sur l'instance EC2 distante?

Kenorb
la source
1
Pour info cet article date de 2015 donc je ne l'appellerais pas une "nouvelle" sous-commande. J'ai vérifié le référentiel de code source ( github.com/aws/aws-cli ) pour aws-cli, et je n'ai trouvé aucune mention de celui-ci dans les documents, les exemples, les notes de version ou en parcourant brièvement le code . J'ai déposé un problème ( github.com/aws/aws-cli/issues/3126 ) et je soumettrai une réponse lorsque j'aurai des commentaires.
PrestonM

Réponses:

11

Pour exécuter ipconfig à partir de la commande d'exécution d'AWS Systems Manager:

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

Remarque: Si vous avez l'erreur, pensez à spécifier le droit --region.

Cela suppose que vos informations d'identification AWS et CLI sont correctement configurées. Consultez la procédure pas à pas de la commande d'exécution de Systems Manager à l'aide de l'AWS CLI pour plus d'informations.


Voici l'exemple pratique de commande shell d'envoi et d'obtention de la sortie de commande:

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
la source
3

Voici un script Bash d'aide qui permet aws ssm send-commandd'exécuter les commandes:

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

Usage:

 ./run_ec2_ps_cmd.sh instance-id command

Exemple:

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

Pour exécuter des sorties plus importantes, consultez: Comment éviter que la sortie ne soit tronquée lors de l'exécution de la commande AWS SSM?

Kenorb
la source
En fait, le meilleur exemple ici. Plus de votes positifs, s'il vous plaît.
Sanctus
3

Oui, vous pouvez le faire avec AWS Systems Manager. La commande d'exécution d'AWS Systems Manager vous permet d'exécuter à distance et en toute sécurité un ensemble de commandes sur EC2 ainsi que sur un serveur sur site. Voici les étapes de haut niveau pour y parvenir.

Attacher le rôle IAM d'instance: l'instance ec2 doit avoir un rôle IAM avec la stratégie AmazonSSMFullAccess. Ce rôle permet à l'instance de communiquer avec l'API Systems Manager.

Installer l'agent SSM: l'instance EC2 doit avoir installé l'agent SSM. L'agent SSM traite les demandes de commande d'exécution et configure l'instance selon la commande.

Commande d'exécution: exemple d'utilisation via l'AWS CLI:

Exécutez la commande suivante pour récupérer les services en cours d'exécution sur l'instance. Remplacez Instance-ID par l'ID d'instance 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

Informations plus détaillées: ici

ExploringApple
la source
3

Voici quelque chose de super cool que je fais avec AWS SSM Send-Command!

En utilisant Apache Airflow, je crée une toute nouvelle instance EC2 en utilisant un modèle de formation cloud (ou CFT pour faire court) qui est juste un fichier JSON avec toutes les valeurs de configuration pour mon instance EC2 que je veux; notez également que dans ce CFT, j'ai également une commande d'amorçage qui copie un script Python d'un emplacement S3 vers la nouvelle instance EC2 afin que je puisse l'exécuter plus tard à l'aide d'une commande d'envoi SSM! Je fais cela en utilisant Python3 et le SDK AWS pour Python3 appelé la bibliothèque Boto3. Voici une partie de la commande de création de la nouvelle pile CFT qui, à son tour, crée ma nouvelle instance EC2:

import boto3

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

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

Ensuite, je peux obtenir l'ID d'instance de la nouvelle instance EC2 (nécessaire pour utiliser la commande d'envoi SSM) en utilisant quelque chose comme ceci:

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

Ensuite, je peux obtenir l'ID d'instance de l'instance EC2 du serveur actuel d'Airflow Worker en exécutant cette commande wget -q -O - http://169.254.169.254/latest/meta-data/instance-idvia 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]

MAINTENANT!!!! POUR LA GRANDE FINALE

Je peux ensuite exécuter un script sur la nouvelle instance EC2 que j'ai créée et envoyer ce script quels que soient les paramètres / arguments que je veux ... y compris l'ID d'instance du serveur qui a envoyé la commande d'envoi SSM de cette façon lorsque mon script est terminé exécuté sur la nouvelle instance EC2, il peut renvoyer une autre commande SSM Send-Command à mon serveur Airflow pour lui indiquer que le script est terminé. C'est à un niveau très élevé sans détails mais c'est juste pour démontrer une idée :)

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

Je ne sais pas si cela a aidé quelqu'un, mais c'est un exemple sympa et amusant de faire quelque chose avec l'AWS SSM Send-Command! Quoique, probablement une odeur de code xD

Kyle Bridenstine
la source