【问题标题】:What is the convention when using Boto3 clients vs resources?使用 Boto3 客户端与资源时的约定是什么?
【发布时间】:2019-07-09 18:57:46
【问题描述】:

所以我有一个调用 AWS 服务的 API,我正在使用 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中的所有队列。但是,一个函数使用资源,而另一个函数使用客户端。这样可以吗?

【问题讨论】:

  • 使用任何你喜欢的方法。它只是完成同一件事的两个不同接口。

标签: amazon-web-services resources client boto3


【解决方案1】:

你当然可以同时使用。

resource 方法实际上在后台使用了 client 方法,因此 AWS 只能看到类似客户端的调用。

事实上,资源甚至包含一个客户端。你可以这样访问它:

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

此示例来自 boto3 文档。它显示了如何从resource 中提取client,并进行client 调用,实际上与s3_client.copy() 相同。

客户端和资源都只是创建一个本地对象。不涉及后端活动。

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多