2015-03-11 2 views
5

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

Répondre

2

La réponse courte est que ce n'est pas encore possible mais il est prévu d'autoriser des personnalisations de ce type. Vous pouvez déjà les voir en action avec la nouvelle personnalisation upload_file et download_file disponible sur le client S3. Le plan est d'utiliser ce même type de mécanisme pour les ressources Boto 3.

  1. Les ressources tirer une sorte d'événement lors de la création d'une classe qui comprend le dict d'attribut de toutes les méthodes/attributs
  2. Vous accrochez votre propre méthode dans l'attribut dict
  3. La classe est créé avec votre méthode personnalisée - Pas de patch de singe requis.

Jetez un oeil ici:

https://github.com/boto/boto3/blob/develop/boto3/session.py#L314-L318 https://github.com/boto/boto3/tree/develop/boto3/s3

Boto 3 est extensible sans aucun doute sur notre radar.

+0

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

+2

Ce sujet est traité dans les documents boto3 sous le [Guide d'extensibilité] (http://boto3.readthedocs.org/en/latest/guide/events.html). –

+1

Merci Ben. J'ai mis à jour la question avec un extrait de code exécutable et j'accepte cette réponse. – Rafa