跳转到主要内容

异步boto3包装器

项目描述

https://img.shields.io/pypi/v/aioboto3.svg https://github.com/terrycain/aioboto3/actions/workflows/CI.yml/badge.svg Documentation Status Updates

版本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


这个包主要是将 boto3aiobotocore 的出色工作结合在一起的包装器。

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 进行猴子补丁以使其更异步。

致谢

此包是用Cookiecutteraudreyr/cookiecutter-pypackage项目模板创建的。它还使用了aiobotocoreboto3库。所有荣誉都归功于它们,这主要是一个包装了一些示例。

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。

源分发

aioboto3-13.1.1.tar.gz (32.5 kB 查看哈希值)

上传时间

构建分发

aioboto3-13.1.1-py3-none-any.whl (34.7 kB 查看哈希值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面