Разница в boto3 между ресурсом, клиентом и сессией?

Я использую Python 2.7.12 в Ubuntu 16.04 LTS. Я учусь использовать boto3 по следующей ссылке: https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto-3. Я сомневаюсь, когда использовать ресурс, клиент или сеанс, и их соответствующие функции.

Ответы

Ответ 1

Здесь приведена более подробная информация о клиенте, ресурсе и сеансе.

Клиент:

  • низкоуровневый доступ к сервису AWS
  • Сгенерировано из сервиса service сервиса AWS
  • предоставляет ботокор-клиент разработчику
  • обычно сопоставляет 1:1 с сервисным API AWS
  • все операции сервиса AWS поддерживаются клиентами
  • Имена методов в змеиной оболочке (например, API ListBuckets => метод list_buckets)

Вот пример доступа на уровне клиента к объектам корзины S3 (не более 1000 **):

import boto3

client = boto3.client('s3')
response = client.list_objects(Bucket='mybucket')
for content in response['Contents']:
    obj_dict = client.get_object(Bucket='mybucket', Key=content['Key'])
    print(content['Key'], obj_dict['LastModified'])

** вам придется использовать paginator или реализовать свой собственный цикл, повторно вызывая list_objects() с маркером продолжения, если их было больше 1000.

Ресурс:

  • высокоуровневый объектно-ориентированный API
  • генерируется из ресурса описания
  • использует идентификаторы и атрибуты
  • имеет действия (операции над ресурсами)
  • предоставляет субресурсы и коллекции ресурсов AWS
  • не обеспечивает 100% покрытие API сервисами AWS

Вот эквивалентный пример использования доступа на уровне ресурсов к объектам S3 Bucket (все):

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
    print(obj.key, obj.last_modified)

Обратите внимание, что в этом случае вам не нужно делать второй вызов API для получения объектов; они доступны вам как коллекция на ведре. Эти коллекции субресурсов загружаются лениво.

Вы можете видеть, что версия кода Resource намного проще, более компактна и имеет больше возможностей (она делает разбиение на страницы для вас). Версия кода Client будет на самом деле более сложной, чем показано выше, если вы хотите включить нумерацию страниц.

Сессия:

  • хранит информацию о конфигурации (прежде всего учетные данные и выбранный регион)
  • позволяет создавать сервисные клиенты и ресурсы
  • boto3 создает сеанс по умолчанию для вас, когда это необходимо

Полезным ресурсом для получения дополнительной информации об этих концепциях boto3 является вводное видео Re: Invent.

Ответ 2

Я постараюсь объяснить это как можно проще. Таким образом, нет гарантии точности фактических сроков.

Сессия - это место, где инициируется подключение к сервисам AWS. Например. ниже - сеанс по умолчанию, в котором используется профиль учетных данных по умолчанию (например, ~/.aws/учетные данные или предполагается, что ваш EC2 использует профиль экземпляра IAM)

sqs = boto3.client('sqs')
s3 = boto3.resource('s3')

Поскольку сеанс по умолчанию ограничен используемым профилем или профилем экземпляра, иногда необходимо использовать пользовательский сеанс для переопределения конфигурации сеанса по умолчанию (например, region_name, endpoint_url и т.д.), например

# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_session.resource('s3')

# you have two choices of create custom client session. 
backup_s3c = my_west_session.client('s3')
video_s3c = boto3.client("s3", region_name = 'us-east-1')

Ресурс: это класс обслуживания высокого уровня, который рекомендуется использовать. Это позволяет вам связывать определенные ресурсы AWS и передавать их, так что вы просто используете эту абстракцию, а не беспокоитесь о том, на какие целевые сервисы указывают. Как вы заметили из части сеанса, если у вас есть пользовательский сеанс, вы просто передаете этот абстрактный объект, а не беспокоитесь обо всех пользовательских областях и т.д., Чтобы пройти дальше. Ниже приведен сложный пример Например.

import boto3 
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_session.resource("s3")
backup_bucket = backup_s3.Bucket('backupbucket') 
video_bucket = video_s3.Bucket('videobucket')

# just pass the instantiated bucket object
def list_bucket_contents(bucket):
   for object in bucket.objects.all():
      print(object.key)

list_bucket_contents(backup_bucket)
list_bucket_contents(video_bucket)

Клиент - это объект класса низкого уровня. Для каждого вызова клиента необходимо явно указывать ресурсы таргетинга, назначенное имя цели службы должно быть длинным. Вы потеряете способность к абстракции.

Например, если вы имеете дело только с сеансом по умолчанию, это похоже на boto3.resource.

import boto3 
s3 = boto3.client('s3')

def list_bucket_contents(bucket_name):
   for object in s3.list_objects_v2(Bucket=bucket_name) :
      print(object.key)

list_bucket_contents('Mybucket') 

Однако, если вы хотите перечислить объекты из сегмента в другом регионе, вам нужно указать явный параметр сегмента, требуемый для клиента.

import boto3 
backup_s3 = my_west_session.client('s3',region_name = 'us-west-2')
video_s3 = my_east_session.client('s3',region_name = 'us-east-1')

# you must pass boto3.Session.client and the bucket name 
def list_bucket_contents(s3session, bucket_name):
   response = s3session.list_objects_v2(Bucket=bucket_name)
   if 'Contents' in response:
     for obj in response['Contents']:
        print(obj['key'])

list_bucket_contents(backup_s3, 'backupbucket')
list_bucket_contents(video_s3 , 'videobucket')