Sur boto3, comment puis-je étendre ResourceModel
? Ce que je ne veux pas faire est sous-classe boto3.resources.factory.ec2.Instance
et ajouter une méthode run
à elle. Cette méthode serait utilisée pour exécuter à distance des commandes sur l'instance EC2 représentée par l'objet Python, via SSH. Je souhaite le faire de manière propre, c'est-à-dire sans recourir à des patchs de singe ou à d'autres techniques obscures.Comment étendre une ressource Boto3?
Mise à jour
Basé sur Daniel's answer, je suis venu avec le code suivant. Nécessite une version récente de Boto 3 et Spur pour la connexion SSH (pip install spur boto3
).
from boto3 import session
from shlex import split
from spur import SshShell
# Customize here.
REGION = 'AWS-REGION'
INSTID = 'AWS-INSTANCE-ID'
USERID = 'SSH-USER'
def hook_ssh(class_attributes, **kwargs):
def run(self, command):
'''Run a command on the EC2 instance via SSH.'''
# Create the SSH client.
if not hasattr(self, '_ssh_client'):
self._ssh_client = SshShell(self.public_ip_address, USERID)
print(self._ssh_client.run(split(command)).output.decode())
class_attributes['run'] = run
if __name__ == '__main__':
b3s = session.Session()
ec2 = b3s.resource('ec2', region_name=REGION)
# Hook the "run" method to the "ec2.Instance" resource class.
b3s.events.register('creating-resource-class.ec2.Instance', hook_ssh)
# Run some commands.
ec2.Instance(INSTID).run('uname -a')
ec2.Instance(INSTID).run('uptime')
Merci Daniel. J'ai écrit du code en me basant sur les ressources que vous avez données. Je vais essayer de l'exécuter quand Boto3 est prêt. – Rafa
Ce sujet est traité dans les documents boto3 sous le [Guide d'extensibilité] (http://boto3.readthedocs.org/en/latest/guide/events.html). –
Merci Ben. J'ai mis à jour la question avec un extrait de code exécutable et j'accepte cette réponse. – Rafa