AIOBoto3 Client Manager
Manage and cache aioboto3 clients without context managers.
Installation
$ pip install aioboto3-cm
Tutorial
import asyncio
from aioboto3_cm import AIOBoto3CM
# this can be created outside of a coroutine!
abcm = AIOBoto3CM()
async def main():
sts_client = await abcm.client("sts")
resp = await sts_client.get_caller_identity()
print(resp)
# clients are cached and reused
same_sts_client = await abcm.client("sts")
# close the client before exiting
await abcm.close("sts")
# you can also close all clients at once if you created several
await abcm.close_all()
asyncio.run(main())
Other useful and more advanced feature include:
- aioboto3-cm can keep track of several named aioboto3 Sessions, client groups, and clients.
- Client groups are a construct used to arbitrarily group clients if needed.
- The default session refers to the session that is referenced if a session name is not specified in the
clientfunction. Same for the default client group. - The default session and client group are automatically created if not specified when the first client is created.
- Setting default client args at the class instance level
- Registering the default session manually
- Registering other named sessions from tools like aioboto3-assume for auto-refreshing, indefinite sessions.
- Async Safe - Use in multiple concurrent coroutines. Not thread safe
A more advanced example outlining all of these features:
import asyncio
from aioboto3 import Session
from aioboto3_cm import AIOBoto3CM
from aioboto3_assume import assume_role
from botocore.config import Config
abcm = AIOBoto3CM(
default_client_kwargs={ # set defaults when creating clients
"config": Config(
retries={
"total_max_attempts": 10
}
)
}
)
session = Session(region_name="us-east-1")
# Register a default session
abcm.register_session(session)
# Add sessions for things like cross accounts roles
abcm.register_session(
session=assume_role( # use aioboto3_assume.assume_role for auto-refreshing credentials
source_session=session,
assume_role_kwargs={
"RoleArn": "arn:aws:iam::123412341234:role/my_role",
"RoleSessionName": "my-role-session"
}
),
abcm_session_name="123412341234"
)
async def main():
# This client will have the default Config object we configured above
sts_client = await abcm.client("sts")
# This client is for the cross account session, and will be apart of a new group "no_retries"
cross_account_sts_client = await abcm.client(
"sts",
config=Config(
retries={
"total_max_attempts": 1
}
),
abcm_session_name="123412341234", # this will use the cross account session we registered earlier
abcm_client_group="no_retries" # Will be kept under a specific client group
)
# This are cached and can be retrieved using the same service, region, session name, and client group name
same_cross_account_sts_client = await abcm.client(
"sts",
config=Config( # Note that since this client exists, any client KWArgs do not do anything
retries={
"total_max_attempts": 10
}
),
abcm_session_name="123412341234",
abcm_client_group="no_retries"
)
# Make sure to close all clients before exiting.
await abcm.close_all()
asyncio.run(main())
FastAPI Tutorial
aioboto3-cm can be integrated into FastAPI with the lifecycle feature.
This assumes you will be using aioboto3-cm throughout the life of your FastAPI app as a cache for aioboto3 clients.
from contextlib import asynccontextmanager
from aioboto3_cm import AIOBoto3CM
from fastapi import FastAPI
abcm = AIOBoto3CM()
@asynccontextmanager
async def lifespan(app: FastAPI):
try:
# Nothing needed for startup. You could prefill sessions or clients...
yield
finally:
# Clean up all clients before exiting
await abcm.close_all()
app = FastAPI(lifespan=lifespan)
@app.get("/my_role")
async def my_role():
sts_client = await abcm.client("sts")
result = await sts_client.get_caller_identity()
return {"result": result}
Changelog
Changelog for aioboto3-cm.
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.1.1] - 2026-01-21
Fixed
aioboto3_cm.AIOBoto3CM.client- method now propagates the exception that was raised when trying to create the aioboto3 client.
[0.1.0] - 2026-01-19
Initial release.
Release files for aioboto3-cm 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aioboto3_cm-0.1.1.tar.gz | 13.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aioboto3_cm-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.0 kB
Release files / aioboto3_cm-0.1.1.tar.gz
| Download URL | aioboto3_cm-0.1.1.tar.gz |
|---|---|
| Size | 13.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
23729a1a6f5ec2a1b3e6c146ed256b2582cbded75577a199cba143cf00d6c776
|
|
BLAKE2b-256 checksum How to use checksums |
8aafed2b0236e47f116946217146cb76bcaa0c5ce9728014e4cf733515b259c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|
Release files / aioboto3_cm-0.1.1-py3-none-any.whl
| Download URL | aioboto3_cm-0.1.1-py3-none-any.whl |
|---|---|
| Size | 12.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a28de3aafa81202291f20a6523b2399652c6fbcefef581a1e3a7ac7563800fe3
|
|
BLAKE2b-256 checksum How to use checksums |
2b1c0cec2fbb61c4b180fcfc9763dd7fe60e575f7a15bf222ac818f3b882c079
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|