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


216

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

Відповіді:


248

Ось більш детальна інформація про те, що таке клієнт , ресурс та сесія .

Клієнт:

  • доступ до сервісу AWS низького рівня
  • згенеровано з опису послуги AWS
  • виставляє клієнта botocore розробнику
  • зазвичай карта 1: 1 за допомогою сервісного API AWS
  • всі операції з обслуговування AWS підтримуються клієнтами
  • назви методів, які мають змії (наприклад, API ListBuckets => метод list_buckets)

Ось приклад доступу на рівні клієнта до об’єктів відра S3 (щонайбільше 1000 **):

import boto3

client = boto3.client('s3')
response = client.list_objects_v2(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 більш високого рівня
  • генерований з ресурсу опису
  • використовує ідентифікатори та атрибути
  • має дії (операції над ресурсами)
  • розкриває субресурси та колекції ресурсів AWS
  • не забезпечує 100% покриття API послугами AWS

Ось еквівалентний приклад використання доступу на рівні ресурсу до об'єктів відра S3 (усіх):

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, є вступне ре: Винайдіть відео .


2
Чи є різниця в продуктивності між клієнтом та ресурсом? У мене була ця проблема, коли видалення повідомлень з sqs черги було швидше за допомогою клієнта і повільніше з використанням ресурсу.
Волштайн

3
@Vaulstein У мене немає ніяких конкретних порівнянь для спільного використання, але я, як правило, очікував, що клієнтські інтерфейси будуть легшими, ніж ресурси, а отже, потенційно швидші під час виконання (хоча повільніше кодуються).
jarmod

@jarmod У рамках навчання я намагався створити відро S3 за допомогою обох методів. Я вважаю, що створення ресурсів відбувається швидше при використанні "Клієнта" порівняно з "Ресурсом". Це право? Якщо так, то чому швидше створення ресурсів у Клієнта?
Сараванан G

1
@SaravananG Якщо ви можете s3.set_stream_logger('botocore'), ви можете побачити журнали метапрограмування, що boto3 (вхід до botocore) робить недоліком. Це працює так, що вам не доведеться. У ньому є ціла система подій для налаштування / підключення та 3 (+?) Глибока систематика подій для обробки підготовки запиту, розбору відповідей та прив’язки залежних викликів. Зверніть увагу на створення параметрів, підписання запиту, виявлення регіону. FYI - це магічний біль, щоб змінити. Дивіться прості зміни .
mcint

89

Я спробую пояснити це якомога простіше. Тож немає гарантії точності фактичних термінів.

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

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

Оскільки сеанс за замовчуванням обмежений для використовуваного профілю або профілю екземпляра, іноді вам потрібно скористатися спеціальним сеансом, щоб змінити конфігурацію сеансу за замовчуванням (наприклад, ім'я регіону, кінцевої точки_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') 

неповнолітній. чи не "об’єкт" ключове слово?
Swagatika

Чи слід уникати використання паралельно однієї функції або модуля як «ресурс», так і «клієнт»?
Джон Оверірон

1
@JohnOveriron Не у всіх службах AWS є "ресурсний" аналог, тому вам все ще потрібен "клієнт" низького рівня. Якщо ви збираєтесь використовувати для розгортань, рекомендується використовувати хмарну інформацію (це важко навчитися, але заощадить ваш час у довгостроковій перспективі), ніж використовувати API для автоматизації розгортань.
mootmoot

@mootmoot Але запити / маніпулювання Aws-сервісів / ресурсів можна легко виконати за допомогою цих API, а не отримання результатів чи оновлення стека за допомогою хмарної інформації. Я прав?
СК Венкат

@SKVenkat Якщо yuu почати створювати розгортання на декількох серверах, використовуючи безперервну інтеграцію тощо, хмарну форму / тераформу / тепло підтримувати набагато простіше, ніж використовувати код boto3.
mootmoot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.