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


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

2 71

2 ответа:

чтобы добавить к другому ответу, особенно при сравнении клиента и ресурса.

клиент:

  • низкоуровневый доступ к услуге
  • генерируется из описания службы
  • предоставляет клиенту botocore разработчику
  • обычно сопоставляет 1: 1 с API сервиса
  • имена методов в змеином корпусе (например, LISTBUCKETS API = > list_buckets method)

вот пример клиентского уровня доступ к объектам корзины 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'])

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

источник:

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

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

import boto3

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

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

сеанс:

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

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

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

сессии где инициировать подключение к сервисам 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_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_sesison.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_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_sesison.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.ресурс.

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_sesison.client('s3',region_name = 'us-east-1')

# you must pass boto3.Session.client and the bucket name 
def list_bucket_contents(s3session, bucket_name):
   for object in s3session.list_objects_v2(Bucket=bucket_name) :
      print(object.key)

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