Je veux pouvoir utiliser ssh dans une instance EC2 et y exécuter des commandes Shell, comme this .
Comment puis-je le faire dans boto3?
Vous pouvez utiliser l'extrait de code suivant pour ssh en une instance EC2 et exécuter une commande de 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 e
Ce fil est un peu vieux, mais puisque j'ai passé une après-midi frustrante à découvrir une solution simple, je pourrais aussi bien la partager.
NB Ce n'est pas une stricte réponse à la question du PO, car il n'utilise pas ssh. Mais un point de boto3 est que vous n’avez pas à le faire - je pense donc que dans la plupart des circonstances, c’est le moyen privilégié pour atteindre l’objectif du PO, puisqu’il peut utiliser sa configuration de boto3 existante de manière triviale.
AWS 'Run Command est intégré à botocore (cela devrait donc s'appliquer à boto et à boto3, pour autant que je sache), mais disclaimer: je n'ai testé cela qu'avec 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)
Pour les commandes powershell d'instance Windows, vous utiliseriez une autre option:
DocumentName="AWS-RunPowerShellScript",
utiliser boto3 pour découvrir les instances et fabric pour exécuter des commandes sur les instances
Vous ne faites pas SSH de python. Vous pouvez utiliser le module boto3
pour interagir avec l'instance EC2.
Ici vous avez une documentation complète de boto3
et des commandes que vous pouvez exécuter avec.
Boto a fourni un moyen de programmer SSH dans des instances EC2 à l'aide de Paramiko, puis d'exécuter des commandes. Boto3 n'inclut pas cette fonctionnalité. Vous pourriez probablement modifier le code boto pour qu'il fonctionne avec boto3 sans trop d'effort. Vous pouvez également utiliser quelque chose comme fabric ou ansible, qui offre un moyen beaucoup plus puissant d’exécuter à distance des commandes sur des instances EC2.
Voici comment j'ai fait
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()
Pour les identifiants, j'ai ajouté le package AWSCLI, puis dans le terminal run
aws configure
entrez les informations d'identification. Tous seront sauvegardés dans le dossier .aws, vous pourrez aussi changer le chemin.