Разница в 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')