使用 Boto3 客户端与资源时的约定是什么?
What is the convention when using Boto3 clients vs resources?
所以我有一个 API 可以调用 AWS 服务,我正在使用 Boto3 在我的 python 应用程序中执行此操作。我遇到的问题涉及 Boto3 的客户端与资源访问级别。我想我理解它们之间的区别(一个是低级访问,另一个是更高级别的面向对象服务访问)但我的问题是是否可以实例化 both 一个客户端和资源?例如,一些资源功能更容易通过客户端使用资源来访问,但有些功能只有客户端才有。在需要时实例化两者并使用最简单的访问级别是否不好,或者在连接到同一资源时使用两个单独的访问级别时是否会出现某种断开连接?
我的连接到 SQS 的代码没有 运行 出现任何错误,如下所示,但是我想确保我不会在 运行 之间任意选择 client/resource 用于相同的 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的所有队列。但是,一个函数使用资源而另一个函数使用客户端。这样可以吗?
当然可以两者都用。
resource方法实际上使用了client方法behind-the-scenes,所以AWS只看到client-like调用。
事实上,资源甚至 包含 一个客户端。您可以这样访问它:
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()
.
相同
客户端和资源都只创建一个本地对象。没有back-endactivity涉及。
所以我有一个 API 可以调用 AWS 服务,我正在使用 Boto3 在我的 python 应用程序中执行此操作。我遇到的问题涉及 Boto3 的客户端与资源访问级别。我想我理解它们之间的区别(一个是低级访问,另一个是更高级别的面向对象服务访问)但我的问题是是否可以实例化 both 一个客户端和资源?例如,一些资源功能更容易通过客户端使用资源来访问,但有些功能只有客户端才有。在需要时实例化两者并使用最简单的访问级别是否不好,或者在连接到同一资源时使用两个单独的访问级别时是否会出现某种断开连接?
我的连接到 SQS 的代码没有 运行 出现任何错误,如下所示,但是我想确保我不会在 运行 之间任意选择 client/resource 用于相同的 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的所有队列。但是,一个函数使用资源而另一个函数使用客户端。这样可以吗?
当然可以两者都用。
resource方法实际上使用了client方法behind-the-scenes,所以AWS只看到client-like调用。
事实上,资源甚至 包含 一个客户端。您可以这样访问它:
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()
.
客户端和资源都只创建一个本地对象。没有back-endactivity涉及。