python - 资源,客户端和 session 之间的boto3差异?

我在 Ubuntu 16.04 LTS 中使用 Python 2.7.12。我正在通过以下链接学习如何使用 boto3:https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto-3 .我的疑问是何时使用资源、客户端或 session ,以及它们各自的功能。

最佳答案

ClientResource 是 boto3 SDK 中用于发出 AWS 服务请求的两个不同抽象。如果您想使用 boto3 对 AWS 服务进行 API 调用,则可以通过客户端或资源进行。

您通常会选择使用客户端抽象或资源抽象,但您可以根据需要同时使用两者。我在下面概述了不同之处,以帮助读者决定使用哪个。

Session 在很大程度上与 Client 和 Resource 的概念正交(但两者都使用)。

这里有一些关于 Client 的更详细信息, Resource , 和 Session都是关于。

客户:

  • 这是原始的 boto3 API 抽象
  • 它提供低级 AWS 服务访问权限
  • 客户支持所有 AWS 服务操作
  • 它将 botocore 客户端暴露给开发者
  • 它通常与 AWS 服务 API 进行 1:1 映射
  • 它公开了蛇形方法名称(例如 ListBuckets API => list_buckets 方法)
  • 通常会产生原始的、非编码的数据(例如,DynamoDB 属性是表示原始 DynamoDB 值的字典)
  • 要求您对结果分页进行编码
  • 它由 AWS 服务 描述生成

以下是对 S3 存储桶对象进行客户端级访问的示例:

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'])

注意:此客户端级代码最多只能列出 1000 个对象。您必须使用 paginator ,或者实现你自己的循环,如果有超过 1000 个对象,使用继续标记重复调用 list_objects_v2()

好的,这就是低级客户端接口(interface)。现在进入更高级别(更抽象)的资源接口(interface)。

资源:

  • 这是较新的 boto3 API 抽象
  • 它提供了一个高级的、面向对象的 API
  • 它没有提供 100% 的 AWS 服务 API 覆盖率
  • 它使用标识符和属性
  • 它有 Action (对资源的操作)
  • 它公开了 AWS 资源的子资源和集合
  • 通常会生成编码数据,而不是原始 AWS 数据(例如,DynamoDB 属性是表示原始 DynamoDB 值的原生 Python 值)
  • 是否为您分页
  • 它是从 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 版本的代码实际上会比上面显示的更复杂。

最后,讨论对客户端和资源都至关重要的 session ,以及两者如何访问 AWS 凭证。

session :

  • 存储配置信息(主要是凭据和选定区域)
  • 允许您创建服务客户端和资源
  • boto3 在需要时为您创建默认 session

了解更多关于这些 boto3 概念的有用资源是 introductory re:Invent video .

https://stackoverflow.com/questions/42809096/

相关文章:

c - 如何在C程序中列出目录中的文件?

python - 规范化数据框的列

linux - 提取并删除目录中的所有.gz - Linux

python - 如何更改 seaborn 轴或图形级别图的图形大小

python - 什么时候应该使用 Flask.g?

linux - 使用 Bash 按列拆分命令输出?

python - 如何从 Python 中的 URL 读取图像数据?

python - UnicodeEncodeError : 'charmap' codec can'

linux - 将 cron 选项卡设置为工作日的特定时间

python - 在 Linux 上通过 Python 脚本截取屏幕截图