2015-03-11 14 views
5

Na boto3, jak mogę przedłużyć ResourceModel? Co powinienem zrobić to podklasa boto3.resources.factory.ec2.Instance i dodać do niej metodę run. Ta metoda byłaby używana do zdalnego uruchamiania komend w instancji EC2 reprezentowanej przez obiekt Python za pośrednictwem SSH. Chciałbym to zrobić w czysty sposób, tj. Bez uciekania się do małpich łat lub innych niejasnych technik.Jak rozszerzyć zasoby Boto3?

Aktualizacja

podstawie Daniel's answer, wpadłem na następujący kod. Wymaga najnowszej wersji Boto 3 i Spur dla połączenia 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') 

Odpowiedz

2

Krótka odpowiedź brzmi, że nie jest to jeszcze możliwe, ale planowane jest wprowadzenie dostosowań tego rodzaju. Widać je już w akcji dzięki nowym dostosowaniom upload_file i download_file dostępnym na kliencie S3. Plan zakłada wykorzystanie tego samego rodzaju mechanizmu do zasobów Boto 3.

  1. Resources zadziała jakieś zdarzenie podczas tworzenia klasy, która obejmuje dict cechą wszystkich metod/atrybuty
  2. Hook własną metodę do atrybutu dict
  3. Klasa zostaje utworzony z niestandardową metodę - nie wymaga łatania małp.

Spójrz tutaj:

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

Boto 3 rozciągliwość jest zdecydowanie na naszym radarze.

+0

Dzięki Daniel. Napisałem trochę kodu na podstawie podanych zasobów. Spróbuję go uruchomić, kiedy boto3 będzie gotowe. – Rafa

+2

Ten temat został omówiony w dokumentach boto3 w [Poradniku na temat rozszerzalności] (http://boto3.readthedocs.org/en/latest/guide/events.html). –

+1

Dzięki Ben. Zaktualizowałem pytanie za pomocą działającego fragmentu kodu i zaakceptuję tę odpowiedź. – Rafa

Powiązane problemy