¿Cómo ejecutar un script o un comando en la instancia EC2 a través de AWS CLI?

13

Según el artículo de noticias New EC2 Run Command , AWS CLI debería admitir un nuevo subcomando para ejecutar scripts en instancias remotas de EC2.

Sin embargo, me he registrado aws ec2 help, pero no puedo encontrar el comando relevante.

Lo he instalado a awstravés de apt-get:

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

¿Qué subcomando debo buscar y cuál es la sintaxis para ejecutar, digamos ipconfigen PowerShell en la instancia remota de EC2?

kenorb
fuente
1
Para su información, ese artículo es de 2015, por lo que no lo llamaría un "nuevo" subcomando. Revisé el repositorio de código fuente ( github.com/aws/aws-cli ) para el aws-cli, y no pude encontrar ninguna mención de él en los documentos, ejemplos, notas de la versión, o al revisar brevemente el código . Presenté un problema ( github.com/aws/aws-cli/issues/3126 ) y enviaré una respuesta cuando reciba comentarios.
PrestonM

Respuestas:

11

Para ejecutar ipconfig desde el comando de ejecución de AWS Systems Manager:

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

Nota: Si tiene el error, considere especificar el correcto --region.

Esto supone que tiene sus credenciales de AWS y su CLI configuradas correctamente. Consulte Tutorial de ejecución de comandos de Systems Manager con la AWS CLI para obtener más información.


Aquí está el ejemplo práctico de comando de shell para enviar y obtener la salida 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
swysocki
fuente
3

Aquí hay un script de ayuda Bash que se utiliza aws ssm send-commandpara ejecutar los comandos:

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

Ejemplo:

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

Para ejecutar salidas más grandes, consulte: ¿Cómo evitar que la salida se trunca al ejecutar el comando AWS SSM?

kenorb
fuente
En realidad, el mejor ejemplo aquí. Más votos a favor, por favor.
Sanctus
3

Sí, puede hacerlo con el administrador de sistemas de AWS. AWS Systems Manager Run Command le permite ejecutar de forma remota y segura un conjunto de comandos en EC2 y en el servidor local. A continuación hay pasos de alto nivel para lograr esto.

Adjuntar rol IAM de instancia: la instancia ec2 debe tener rol IAM con la política AmazonSSMFullAccess. Este rol permite que la instancia se comunique con la API de Systems Manager.

Instalar el agente SSM: la instancia EC2 debe tener un agente SSM instalado. El agente SSM procesa las solicitudes de comando de ejecución y configura la instancia según el comando.

Comando de ejecución: Ejemplo de uso a través de AWS CLI:

Ejecute el siguiente comando para recuperar los servicios que se ejecutan en la instancia. Reemplace ID de instancia con ID de instancia 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

Información más detallada: aquí

Explorando Apple
fuente
3

¡Aquí hay algo súper genial que hago con AWS SSM Send-Command!

Usando Apache Airflow, creo una nueva instancia EC2 usando una plantilla de formación en la nube (o CFT para abreviar) que es solo un archivo JSON con todos los valores de configuración para mi instancia EC2 que quiero; También tenga en cuenta que en este CFT también tengo un comando de arranque que copia un script de Python desde una ubicación S3 a la nueva instancia EC2 para que pueda ejecutarlo más tarde usando un comando de envío SSM. Hago esto usando Python3 y el SDK de AWS para Python3 llamado la biblioteca Boto3. Aquí está parte del comando para crear la nueva pila CFT que a su vez crea mi nueva instancia EC2:

import boto3

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

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

Entonces puedo obtener la ID de instancia de la nueva instancia EC2 (requerida para usar SSM Send-Command) usando algo como esto:

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

Luego puedo obtener la ID de instancia de la instancia EC2 del servidor del trabajador de flujo de aire actual ejecutando este comando a wget -q -O - http://169.254.169.254/latest/meta-data/instance-idtravés de 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]

¡¡¡¡AHORA!!!! PARA LA GRAN FINAL

Luego puedo ejecutar una secuencia de comandos en la nueva instancia EC2 que creé y enviar esa secuencia de comandos cualquier parámetro / argumento que desee ... incluyendo el ID de instancia del servidor que envió el comando de envío SSM para que así cuando termine mi secuencia de comandos ejecutándose en la nueva instancia EC2, puede enviar otro comando de envío SSM a mi servidor Airflow para indicarle que el script ha finalizado. Esto está en un nivel muy alto sin detalles, pero es solo para demostrar una 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'))

No estoy seguro de si esto ayudó a alguien, ¡pero es un ejemplo divertido y divertido de hacer algo con el comando de envío de AWS SSM! Aunque, probablemente un código de olor xD

Kyle Bridenstine
fuente