Skip to main content
With boto3, your application continues to use the normal AWS service model and request dictionaries. Configure the endpoint for the process or for one client.

Set it for the process

Then create the client without endpoint_url:

Set it on one client

Use a separate Session or dependency-injected client for Cloud Adapter. Avoid changing a process-wide endpoint behind unrelated AWS clients. An explicit endpoint_url takes precedence over AWS_ENDPOINT_URL_S3.

Verify object behavior

Inspect the corresponding native target object after put_object. If the application depends on metadata, ETags, version IDs, ranges, conditionals, or multipart uploads, assert those behaviors separately against the S3 target profile.

Distinguish service and transport failures

A ClientError means an HTTP service response reached Botocore. A connection or read timeout may have no response metadata at all. After a timed-out write, check target state before deciding whether to retry.

Production checklist

  • Pin boto3 and Botocore versions together.
  • Keep the endpoint, region, retry policy, and credentials explicit.
  • Reuse clients across requests.
  • Do not log Authorization, signed URLs, secret values, or object bodies.
  • Capture ResponseMetadata and Cloud Adapter diagnostic headers.
  • Add integration tests for paginators, waiters, retries, and error codes used by the application.
Backend credentials are configured on Cloud Adapter. They do not belong in the Python application’s AWS session.