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')
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
Dieses Thema wird in den boto3-Dokumenten jetzt im [Erweiterbarkeitshandbuch] (http://boto3.readthedocs.org/en/latest/guide/events.html) behandelt. –
Danke Ben. Ich habe die Frage mit einem ausführbaren Code-Snippet aktualisiert und akzeptiere diese Antwort. – Rafa