{"id":239,"library":"aiobotocore","title":"aiobotocore","description":"aiobotocore is an asyncio-native, mostly feature-complete async wrapper around botocore, enabling non-blocking AWS service calls via aiohttp (with experimental httpx support). Current version is 3.3.0. Releases track botocore closely — minor/patch releases drop frequently (often weekly) to relax or bump the botocore dependency range, with occasional minor releases adding features like socket_factory support in AioConfig.","status":"active","version":"3.3.0","language":"python","source_language":"en","source_url":"https://github.com/aio-libs/aiobotocore","tags":["aws","async","asyncio","botocore","aiohttp","s3","boto","cloud"],"install":[{"cmd":"pip install aiobotocore","lang":"bash","label":"Core install"},{"cmd":"pip install aiobotocore boto3","lang":"bash","label":"With boto3 (install separately — extras removed in v3)"},{"cmd":"pip install 'types-aiobotocore[essential]'","lang":"bash","label":"Type stubs for common services"}],"dependencies":[{"reason":"Core AWS service model and signing logic; aiobotocore pins a narrow botocore range per release — mismatches with boto3 or awscli are the #1 install conflict","package":"botocore","optional":false},{"reason":"Default async HTTP backend","package":"aiohttp","optional":false},{"reason":"Used internally for patching botocore internals","package":"wrapt","optional":false},{"reason":"Higher-level AWS resource API; must be installed separately — aiobotocore[boto3] extra was removed in v3.0.0","package":"boto3","optional":true},{"reason":"Experimental alternative HTTP backend via AioConfig(http_session_cls=aiobotocore.httpxsession.HttpxSession)","package":"httpx","optional":true},{"reason":"Type annotations for IDE completion and static analysis (Pylance, pyright, mypy)","package":"types-aiobotocore","optional":true}],"imports":[{"note":"Top-level aiobotocore.get_session(loop=...) is the old pre-1.0 pattern. The loop parameter was removed. Always import from aiobotocore.session.","wrong":"import aiobotocore; aiobotocore.get_session(loop=loop)","symbol":"get_session","correct":"from aiobotocore.session import get_session"},{"note":"Use when you need to subclass or explicitly type the session object.","symbol":"AioSession","correct":"from aiobotocore.session import AioSession"},{"note":"Required to pass connector_args (keepalive_timeout, use_dns_cache, etc.) or to set the experimental httpx backend.","symbol":"AioConfig","correct":"from aiobotocore.config import AioConfig"},{"note":"Default HTTP session class; import only needed when customising the session class directly.","symbol":"AIOHTTPSession","correct":"from aiobotocore.httpsession import AIOHTTPSession"},{"note":"Experimental httpx backend. Pass via AioConfig(http_session_cls=HttpxSession). Not fully tested; some aiohttp features are unported.","symbol":"HttpxSession","correct":"from aiobotocore.httpxsession import HttpxSession"},{"note":"Error types live in botocore, not aiobotocore. Always catch botocore.exceptions.ClientError for AWS API errors.","symbol":"ClientError","correct":"import botocore.exceptions; botocore.exceptions.ClientError"}],"quickstart":{"code":"import asyncio\nimport os\nfrom aiobotocore.session import get_session\nimport botocore.exceptions\n\nasync def main():\n    session = get_session()\n    async with session.create_client(\n        's3',\n        region_name='us-east-1',\n        aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID', ''),\n        aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY', ''),\n    ) as client:\n        try:\n            response = await client.list_buckets()\n            for bucket in response.get('Buckets', []):\n                print(bucket['Name'])\n        except botocore.exceptions.ClientError as e:\n            print(f\"AWS error: {e.response['Error']['Code']} - {e.response['Error']['Message']}\")\n        except botocore.exceptions.NoCredentialsError:\n            print('No credentials found')\n\nasyncio.run(main())\n","lang":"python","description":"List S3 buckets using an async context-managed client with credentials from environment variables."},"warnings":[{"fix":"Always use: async with session.create_client('s3', ...) as client: ...","message":"create_client() MUST be used as an async context manager (async with). Calling it without a context manager and manually closing is unreliable, and since v3.0.0 creating a new ClientSession after the client exits its context is explicitly forbidden and raises an error.","severity":"breaking","affected_versions":">=1.0.0"},{"fix":"Install separately: pip install aiobotocore boto3  or  pip install aiobotocore awscli","message":"The aiobotocore[boto3] and aiobotocore[awscli] packaging extras were removed in v3.0.0. Installing them will raise a pip error about unknown extras.","severity":"breaking","affected_versions":">=3.0.0"},{"fix":"Use the async method: frozen = await credentials.get_frozen_credentials()","message":"Credential properties (credentials.access_key, credentials.secret_key, credentials.token) raise NotImplementedError because they do not trigger an async refresh cycle.","severity":"breaking","affected_versions":">=1.4.0"},{"fix":"Pin all AWS-related packages together (aiobotocore, boto3, botocore) to a mutually compatible set. Check the aiobotocore release notes for the supported botocore range. Use a lockfile (pip-tools, poetry, uv) to resolve conflicts upfront.","message":"aiobotocore pins botocore to a narrow version range that changes with every release. Installing aiobotocore alongside boto3, awscli, s3fs, or moto frequently causes pip dependency conflicts because those packages independently pin botocore.","severity":"gotcha","affected_versions":"<3.0.0 worst; improved but still present in >=3.0.0"},{"fix":"async with response['Body'] as stream:\n    data = await stream.read()","message":"get_object() response Body must be consumed inside an async context manager. Reading Body outside of 'async with response[\"Body\"] as stream:' can leave the underlying TCP connection dangling and cause connection pool exhaustion.","severity":"gotcha","affected_versions":"all"},{"fix":"paginator = client.get_paginator('list_objects_v2')\nasync for page in paginator.paginate(Bucket='my-bucket'):\n    for obj in page.get('Contents', []):\n        print(obj['Key'])","message":"Paginators are async iterators in aiobotocore. You must use 'async for result in paginator.paginate(...):', NOT a regular 'for' loop. A regular for loop will not await pages and silently yields nothing or raises TypeError.","severity":"gotcha","affected_versions":"all"},{"fix":"Use get_session() with no arguments, and run coroutines with asyncio.run(main()).","message":"Passing the 'loop' parameter to get_session() is a legacy pattern from pre-asyncio.run() era and is no longer supported. Python's asyncio manages the event loop implicitly.","severity":"deprecated","affected_versions":">=2.x"},{"fix":"Ensure AWS credentials are properly configured in the execution environment. This can be done via environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) or by configuring an AWS credentials file. Verify that the credentials have the necessary permissions for the AWS service being accessed.","message":"AWS error: AuthorizationHeaderMalformed. This usually means that AWS credentials (Access Key ID and Secret Access Key) are not configured correctly or are missing in the environment where the code is running. Common causes include missing environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) or an improperly configured AWS credentials file (~/.aws/credentials).","severity":"breaking","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-12T12:15:44.566Z","next_check":"2026-06-25T00:00:00.000Z","problems":[{"fix":"Install 'aiobotocore' using pip: 'pip install aiobotocore'.","cause":"The 'aiobotocore' library is not installed in the Python environment.","error":"ModuleNotFoundError: No module named 'aiobotocore'"},{"fix":"Use 'aiobotocore.session.get_session()' to create a session instead.","cause":"The 'AioSession' attribute does not exist in the 'aiobotocore' module.","error":"AttributeError: module 'aiobotocore' has no attribute 'AioSession'"},{"fix":"Await the 'create_client' coroutine: 'client = await session.create_client('sqs')'.","cause":"The 'create_client' method returns a coroutine that needs to be awaited.","error":"AttributeError: 'ClientCreatorContext' object has no attribute 'send_message'"},{"fix":"Use a virtual environment to isolate dependencies and explicitly pin compatible versions of 'aiobotocore', 'botocore', and 'boto3' in your project's dependencies.","cause":"There is a version incompatibility between 'aiobotocore' and 'botocore' (or 'boto3'), often due to other installed packages requiring different 'botocore' versions.","error":"aiobotocore==X.Y.Z requires botocore<A.B.C,>=D.E.F but botocore G.H.I was resolved"},{"fix":"Ensure AWS credentials are configured properly, typically via environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`), a shared credentials file (`~/.aws/credentials`), or an IAM role attached to the execution environment.","cause":"The aiobotocore client, inheriting from botocore, cannot find valid AWS credentials in the standard locations (environment variables, shared credentials file, IAM role).","error":"botocore.exceptions.NoCredentialsError: Unable to locate credentials"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":80,"quickstart_tag":"verified","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.89,"mem_mb":22.6,"disk_size":"59.0M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.86,"mem_mb":22.6,"disk_size":"61.1M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.64,"mem_mb":22.6,"disk_size":"61M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.65,"mem_mb":22.6,"disk_size":"64M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.17,"mem_mb":24.6,"disk_size":"62.8M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.17,"mem_mb":24.6,"disk_size":"65.2M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.97,"mem_mb":24.6,"disk_size":"65M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.95,"mem_mb":24.6,"disk_size":"68M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.23,"mem_mb":24.3,"disk_size":"54.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.23,"mem_mb":24.3,"disk_size":"56.8M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.21,"mem_mb":24.3,"disk_size":"57M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.19,"mem_mb":24.3,"disk_size":"59M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.19,"mem_mb":25.4,"disk_size":"53.7M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.17,"mem_mb":25.4,"disk_size":"56.0M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.16,"mem_mb":25.4,"disk_size":"56M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.16,"mem_mb":25.4,"disk_size":"58M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.74,"mem_mb":20.9,"disk_size":"58.9M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.77,"mem_mb":20.9,"disk_size":"61.1M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"essential","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.69,"mem_mb":20.9,"disk_size":"62M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.66,"mem_mb":20.9,"disk_size":"64M"}]},"quickstart_checks":{"last_tested":"2026-04-23","tag":"verified","tag_description":"quickstart runs on critical runtimes, recently tested","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}