2015-03-11 2 views
5

На boto3, как я могу продлить ResourceModel? То, что мне не нужно делать, - это подкласс boto3.resources.factory.ec2.Instance и добавить к нему метод run. Этот метод будет использоваться для удаленного запуска команд в экземпляре EC2, представленном объектом Python, через SSH. Я хочу сделать это чистым способом, т. Е. Не прибегая к патчам обезьян или другим неясным методам.Как продлить ресурс Boto3?

Update

на основе Daniel's answer, я придумал следующий код. Требуется последняя версия Boto 3 и Spur для подключения 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') 

ответ

2

Короткий ответ заключается в том, что это еще не возможно, но планируется разрешить такие настройки. Вы уже можете увидеть их в действии с новыми настройками upload_file и download_file, доступными на S3-клиенте. План состоит в том, чтобы использовать такой же механизм для ресурсов Boto 3.

  1. ресурсы будут вести огонь какие-то события при создании класса, который включает в себя атрибут Dict всех методов/атрибутов
  2. Вы зацепить свой собственный метод в атрибут Dict
  3. Класс получает созданный с помощью пользовательского метода - не требуется патч для обезьян.

Посмотрите здесь:

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

Boto 3 расширяемость, безусловно, на нашем радаре.

+0

Спасибо Даниил. Я написал код, основанный на ресурсах, которые вы дали. Я попытаюсь запустить его, когда boto3 готов. – Rafa

+2

Эта тема рассматривается в документах boto3 в разделе [Руководство по расширению] (http://boto3.readthedocs.org/ru/latest/guide/events.html). –

+1

Спасибо Бен. Я обновил вопрос с помощью кода исполняемого кода и примет этот ответ. – Rafa

Смежные вопросы