2015-03-11 16 views
5

Auf boto3, wie kann ich ResourceModel erweitern? Was ich tun möchte, ist Unterklasse boto3.resources.factory.ec2.Instance und fügen Sie eine run Methode hinzu. Diese Methode wird verwendet, um Befehle auf der EC2-Instanz, die durch das Python-Objekt repräsentiert wird, per Fernsteuerung per SSH auszuführen. Ich möchte dies auf eine saubere Art und Weise tun, d. H. Ohne auf Affepatches oder andere obskure Techniken zurückzugreifen.Wie wird eine Boto3-Ressource erweitert?

aktualisieren

Basierend auf Daniel's answer kam ich mit dem folgenden Code auf. Erfordert eine aktuelle Version von Boto 3 und Spur für die SSH-Verbindung (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') 

Antwort

2

Die kurze Antwort ist, dass dies noch nicht möglich ist, aber es ist geplant, Anpassungen dieser Art zu ermöglichen. Sie können sie bereits in Aktion mit der neuen upload_file und download_file Anpassung sehen, die auf dem S3-Client verfügbar ist. Es ist geplant, den gleichen Mechanismus für Boto 3-Ressourcen zu verwenden.

  1. Ressourcen wird eine Art von Ereignis ausgelöst, wenn eine Klasse zu erstellen, die das Attribut dict aller Methoden umfasst/Attribute
  2. Sie Ihre eigene Methode in das Attribut Haken dict
  3. Die Klasse wird mit Ihrer benutzerdefinierten Methode erstellt - Kein Affe-Patching erforderlich.

einen Blick hier nehmen:

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

Boto 3 Erweiterbarkeit ist auf jeden Fall auf unserem Radar.

+0

Danke Daniel. Ich habe einen Code geschrieben, der auf den Ressourcen basiert, die Sie angegeben haben. Ich werde versuchen, es zu starten, wenn boto3 bereit ist. – Rafa

+2

Dieses Thema wird in den boto3-Dokumenten jetzt im [Erweiterbarkeitshandbuch] (http://boto3.readthedocs.org/en/latest/guide/events.html) behandelt. –

+1

Danke Ben. Ich habe die Frage mit einem ausführbaren Code-Snippet aktualisiert und akzeptiere diese Antwort. – Rafa