使用Boto3客户端与资源时的惯例是什么?

时间:2019-07-09 18:57:46

标签: amazon-web-services resources client boto3

因此,我有一个API可以调用AWS服务,并且我正在使用Boto3以便在我的python应用程序中执行此操作。我遇到的问题涉及Boto3的客户端与资源访问级别。我想我了解它们之间的区别(一个是低级访问,另一个是高级面向对象的服务访问),但我的问题是,实例化客户端和资源两者是否都可以?例如,某些资源功能更易于使用客户端上的资源进行访问,但是有些功能仅客户端具有。实例化两个实例并在需要时使用最简单的访问级别是否不好?或者在连接至同一资源时使用两个单独的访问级别时是否会出现某种断开连接?

我的代码连接到下面显示的SQS时没有遇到任何错误,但是我想确保通过选择相同aws的客户端/资源之间的方式,不会使我自shooting自shooting连接。

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 个答案:

答案 0 :(得分:1)

您当然可以同时使用。

资源方法实际上是在幕后使用 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()相同。

客户端和资源都只创建一个本地对象。没有后端活动。