Каково соглашение при использовании клиентов Boto3 против ресурсов? - PullRequest
1 голос
/ 09 июля 2019

Итак, у меня есть API, который вызывает сервисы AWS, и я использую Boto3 для этого в своем приложении на python.У меня есть вопрос, касающийся уровня доступа клиента к Boto3.Я думаю, что я понимаю разницу между ними (один - низкоуровневый доступ, другой - высокоуровневый объектно-ориентированный доступ к службам), но мой вопрос в том, можно ли инстанцировать и клиента и ресурса?Например, к некоторым функциям ресурса проще получить доступ через ресурс через клиента, но есть некоторые функции, которые есть только у клиента.Плохо ли создавать экземпляры обоих и использовать самый простой уровень доступа, когда это необходимо, или будет какое-то разъединение при использовании двух отдельных уровней доступа при подключении к одному и тому же ресурсу?

У меня не возникает никаких ошибок с моимкод для подключения к SQS показан ниже, однако я хочу убедиться, что в дальнейшем я не стреляю себе в ногу, произвольно выбирая между клиентом / ресурсом для одного и того же соединения aws.

import boto3

REGION = 'us-east-1'

sqs_r = boto3.resource('sqs', REGION)
sqs_c = boto3.client('sqs', REGION)

def create_queue(queue_name):
    queue_attributes = {
        'FifoQueue': 'true',
        'DelaySeconds': '0',
        'MessageRetentionPeriod': '900', # 15 minutes to complete a command, else deleted.
        'ContentBasedDeduplication': 'true'
    }

    try: 
        queue = sqs_r.get_queue_by_name(QueueName=queue_name)
    except:
        queue = sqs_r.create_queue(QueueName=queue_name, Attributes=queue_attributes)


def list_all_queues(queue_name_prefix=''):
    all_queues = sqs_c.list_queues(QueueNamePrefix=queue_name_prefix)    
    print(all_queues['QueueUrls'])
    print(type(all_queues))

Обаиз вышеупомянутой функции работают должным образом, один создает очередь, а другой перечисляет все очереди в sqs.Однако одна функция использует ресурс, а другая - клиент.Это нормально?

1 Ответ

2 голосов
/ 10 июля 2019

Вы, безусловно, можете использовать оба.

Метод resource на самом деле использует метод client за кулисами, поэтому AWS видит только клиентские вызовы.

Фактически ресурс даже содержит клиента.Вы можете получить к нему доступ следующим образом:

import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 'mybucket',
    'Key': 'mykey'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')

Этот пример взят из документации по boto3.Он показывает, как client извлекается из resource, и делает вызов client, фактически идентичный s3_client.copy().

И клиент, и ресурс просто создают локальный объект.Никакой фоновой активности не происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...