Quiero poder acceder a una instancia de EC2 y ejecutar algunos comandos de shell en ella, como este .
¿Cómo lo hago en boto3?
Este hilo es un poco antiguo, pero dado que pasé una tarde frustrante descubriendo una solución simple, también podría compartirlo.
NB Esta no es una respuesta estricta a la pregunta del OP, ya que no usa ssh. Pero, un punto de boto3 es que no tiene que hacerlo, por lo que creo que, en la mayoría de las circunstancias, esta sería la forma preferida de lograr el objetivo del OP, ya que puede usar su configuración de boto3 existente de manera trivial.
El comando de ejecución de AWS está integrado en botocore (por lo que esto debería aplicarse tanto a boto como a boto3, hasta donde yo sé), pero descargo de responsabilidad: solo probé esto con boto3 .
def execute_commands_on_linux_instances(client, commands, instance_ids): """Runs commands on remote linux instances :param client: a boto/boto3 ssm client :param commands: a list of strings, each one a command to execute on the instances :param instance_ids: a list of instance_id strings, of the instances on which to execute the command :return: the response from the send_command function (check the boto3 docs for ssm client.send_command() ) """ resp = client.send_command( DocumentName="AWS-RunShellScript", # One of AWS' preconfigured documents Parameters={'commands': commands}, InstanceIds=instance_ids, ) return resp # Example use: ssm_client = boto3.client('ssm') # Need your credentials here commands = ['echo "hello world"'] instance_ids = ['an_instance_id_string'] execute_commands_on_linux_instances(ssm_client, commands, instance_ids)Para los comandos de PowerShell de la instancia de Windows, usaría una opción alternativa:
DocumentName="AWS-RunPowerShellScript",Puede usar el siguiente fragmento de código para acceder a una instancia EC2 y ejecutar algún comando desde boto3.
import boto3 import botocore import paramiko key = paramiko.RSAKey.from_private_key_file(path/to/mykey.pem) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Connect/ssh to an instance try: # Here 'ubuntu' is user name and 'instance_ip' is public IP of EC2 client.connect(hostname=instance_ip, username="ubuntu", pkey=key) # Execute a command(cmd) after connecting/ssh to an instance stdin, stdout, stderr = client.exec_command(cmd) print stdout.read() # close the client connection once the job is done client.close() break except Exception, e: print eAsí es como lo he hecho
import boto3 import botocore import boto import paramiko ec2 = boto3.resource('ec2') instances = ec2.instances.filter( Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]) i = 0 for instance in instances: print(instance.id, instance.instance_type) i+= 1 x = int(input("Enter your choice: ")) try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) privkey = paramiko.RSAKey.from_private_key_file('address to .pem key') ssh.connect(instance.public_dns_name,username='ec2-user',pkey=privkey) stdin, stdout, stderr = ssh.exec_command('python input_x.py') stdin.flush() data = stdout.read().splitlines() for line in data: x = line.decode() #print(line.decode()) print(x,i) ssh.close()Para las credenciales, agregué el paquete AWSCLI, luego en la ejecución del terminal
aws configureingrese las credenciales. Todos ellos se guardarán en la carpeta .aws, también puede cambiar la ruta.