Boto:如何将 s3 用作资源或客户端,但不能同时用作两者?

Fra*_*ris 4 amazon-web-services python-3.x boto3

这是我对 Boto 和 AWS 的完整新手介绍。目前我唯一的目标是能够访问外部机构的 S3 存储桶,因此我特别想了解如何使用它们。这个最小的代码完成了我想要它做的事情,但我还没有弄清楚如何通过仅将 s3r 声明为资源并避免使用 s3 作为客户端来使用它。似乎最好从 S3 资源访问存储桶,然后专门使用该存储桶,即bucket.new_key('testdir/')bucket.put_object(Key=('testdir/))。这是可能的,还是有一个很好的理由来重新构建我的处理方式?谢谢!

import boto3

bucket_name = 'my-bucket-name'
region_name = 'my-region-name'

print('Acquiring s3 service')
s3 = boto3.client('s3', region_name=region_name)
s3r = boto3.resource('s3', region_name=region_name)OB

print('Accessing bucket')
bucket = s3r.Bucket(bucket_name)

print('Emptying bucket')
bucket.objects.all().delete()

print('Uploading folder structures')
s3.put_object(Bucket=bucket_name, Key=('testdir/'))
s3.put_object(Bucket=bucket_name, Key=('testdir/subdir1/'))
s3.put_object(Bucket=bucket_name, Key=('testdir/subdir2/'))
Run Code Online (Sandbox Code Playgroud)

Ano*_*ard 6

boto3 API 为大多数 AWS API 提供“客户端”和“资源”对象模型。 该文档对差异有这样的说明(有一个警告我稍后会提到):

\n
\n

资源代表 Amazon Web Services (AWS) 的面向对象的接口。它们提供了比服务客户端进行的原始低级调用更高级别的抽象

\n
\n

换句话说,“客户端”API 是底层 AWS REST 调用的一对一包装器。“资源”API 调用旨在更易于使用,并且它们提供了一些“生活质量”改进,使编写代码更快。使用哪一种很大程度上取决于编码风格的偏好。在大多数情况下,您可以通过“客户端”调用完成的工作也可以通过“资源”调用完成。但并非总是如此。当然,对于您的示例,这两种情况都是可能的:

\n
s3 = boto3.client(\'s3\')\n\n# List all of the objects in a bucket, note that since we\'re fairly\n# close to the underlying REST API with the client interface, we need\n# to worry about paginating the list objects\npaginator = s3.get_paginator(\'list_objects_v2\')\nfor page in paginator.paginate(Bucket=bucket_name):\n    for cur in page.get(\'Contents\', []):\n        # And delete each object in turn\n        s3.delete_object(Bucket=bucket_name, Key=cur[\'Key\'])\n\n# Create a zero-byte object to represent the folder\ns3.put_object(Bucket=bucket_name, Key=\'testdir/\')\n
Run Code Online (Sandbox Code Playgroud)\n

使用资源接口可以完成相同的工作

\n
s3r = boto3.resource(\'s3\')\n\n# Same idea with resource\nbucket = s3r.Bucket(bucket_name)\n# Paginating, and calling delete on each object in turn is handled\n# behind the scenes by all() and delete() in turn\nbucket.objects.all().delete()\n# Creating the object, again make a zero-byte object to mimic creating\n# a folder as the S3 Web UI does\nbucket.put_object(Key=\'testdir/\')\n
Run Code Online (Sandbox Code Playgroud)\n

但是,文档中有一个警告:

\n
\n

AWS Python SDK 团队不打算向 boto3 中的资源接口添加新功能。现有接口将在 boto3\xe2\x80\x99s 生命周期内继续运行。客户可以通过客户端界面访问更新的服务功能。

\n
\n

这取决于个人喜好。我个人更喜欢使用客户端界面,因为它可以更轻松地理解和跟踪正在进行哪些底层 API 调用,并提供新的 AWS 功能,但这实际上取决于您。

\n