异步boto3包装器
项目描述
版本11的破坏性更改:上传/下载文件等传递给S3Transfer的配置已更新,以匹配boto3使用的配置
版本9的破坏性更改:aioboto3.resource和aioboto3.client方法不再存在,请创建一个会话然后调用session.client等... 这是为了各种原因,但主要是防止默认会话比应有的时间更长,这会破坏替换事件循环的情况。
现在必须将.client和.resource函数用作异步上下文管理器。
由于aiobotocore已达到版本1.0.1,修复各种问题(如存储桶区域重定向和Web假设角色类型凭据支持)所付出的努力,现在必须使用上下文管理器实例化客户端,这进一步适用于资源创建器。您以前可以通过调用res = aioboto3.resource('dynamodb')来完成这项工作,但这不再有效。如果您真的想这样做,您可以这样做res = await aioboto3.resource('dynamodb').__aenter__(),但您需要记住调用__aexit__。
很可能有一些我没有注意到的部分现在无法工作,请创建一个问题,我们将快速解决它们。
现在创建服务资源也必须是异步的,例如。
async def main():
session = aioboto3.Session()
async with session.resource("s3") as s3:
bucket = await s3.Bucket('mybucket') # <----------------
async for s3_object in bucket.objects.all():
print(s3_object)
升级到 aiobotocore 1.0.1 也带来了在 EKS 中运行的支持,以及异步化 get_presigned_url
这个包主要是将 boto3 和 aiobotocore 的出色工作结合在一起的包装器。
aiobotocore 允许您通过在命令前加上 await 的方式,以异步方式使用几乎所有 boto3 客户端命令。
使用 aioboto3,您现在可以以异步方式使用 boto3 提供的高级 API。我主要开发这个库是因为我想在异步微服务中使用 boto3 dynamodb Table 对象。
虽然 boto3 中的所有资源都应该工作,但我并没有测试所有这些资源,所以如果您在下面的表中找不到您需要的资源,请尝试使用它,如果它工作正常,请向我提交一个简单的测试案例,我将将其添加到表中。
服务 |
状态 |
---|---|
DynamoDB 服务资源 |
已测试并正常工作 |
DynamoDB 表 |
已测试并正常工作 |
S3 |
正常工作 |
Kinesis |
正常工作 |
SSM 参数存储 |
正常工作 |
Athena |
正常工作 |
示例
使用 aioboto3 将项目放入 DynamoDB 表的简单示例
import asyncio
import aioboto3
from boto3.dynamodb.conditions import Key
async def main():
session = aioboto3.Session()
async with session.resource('dynamodb', region_name='eu-central-1') as dynamo_resource:
table = await dynamo_resource.Table('test_table')
await table.put_item(
Item={'pk': 'test1', 'col1': 'some_data'}
)
result = await table.query(
KeyConditionExpression=Key('pk').eq('test1')
)
# Example batch write
more_items = [{'pk': 't2', 'col1': 'c1'}, \
{'pk': 't3', 'col1': 'c3'}]
async with table.batch_writer() as batch:
for item_ in more_items:
await batch.put_item(Item=item_)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
# Outputs:
# [{'col1': 'some_data', 'pk': 'test1'}]
无法工作或已修复的内容
由于这个库实际上是 boto3 的包装器,因此有些内容无法神奇地异步化。
已修复
s3_client.download_file* 这是由 s3transfer 模块执行的。 – 使用 get_object 修复
s3_client.upload_file* 这是由 s3transfer 模块执行的。 – 使用自定义分块上传修复
s3_client.copy 这是由 s3transfer 模块执行的。 – 使用 get_object -> upload_fileobject 修复
dynamodb_resource.Table.batch_writer 现在返回一个执行相同功能的异步上下文管理器
资源等待器 - 您现在可以 await 作为资源对象一部分的等待器,而不仅仅是客户端等待器,例如 await dynamodbtable.wait_until_exists()
资源对象的属性通常是自动加载的,现在它们都是协程,它们来自的元数据将在第一次 await 时加载,然后缓存。
S3 存储桶的 .objects 对象现在可以正常工作,并且已经被异步化。示例请参考 - https://aioboto3.readthedocs.io/en/latest/usage.html#s3-resource-objects
Amazon S3 客户端端加密
Boto3 不支持 AWS 客户端端加密,所以直到他们支持为止,我已经添加了基本支持。文档请参考 CSE
CSE 需要 python cryptography 库,所以如果您执行 pip install aioboto3[s3cse],它将包括 cryptography。
这个库目前支持使用 KMS 管理的主密钥执行信封加密,使用 AES/CBC/PKCS5Padding 或更优的 AES/GCM/NoPadding。生成的文件与 Java 加密 SDK 兼容,因此我将假设它们与 Ruby、PHP、Go 和 C++ 库兼容。
不支持非 KMS 管理的密钥,但如果您需要使用它,请提交一个问题,我会调查。
文档
文档在此处 - https://aioboto3.readthedocs.io/en/latest/
示例在此处 - https://aioboto3.readthedocs.io/en/latest/usage.html
功能
紧密模仿 boto3 的用法。
待办事项
更多示例
设置文档
调查是否需要将 aws xray sdk 进行猴子补丁以使其更异步。
致谢
此包是用Cookiecutter和audreyr/cookiecutter-pypackage项目模板创建的。它还使用了aiobotocore和boto3库。所有荣誉都归功于它们,这主要是一个包装了一些示例。
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。