Tools & SDKs
boto3 (Python)
boto3 is the official AWS SDK for Python. Configure it to talk to the gateway with a custom endpoint URL and path-style addressing.
Install
pip install boto3 Client setup
import boto3
s3 = boto3.client(
"s3",
endpoint_url="https://s3.uploom.io",
aws_access_key_id="<access-key-id>",
aws_secret_access_key="<secret-access-key>",
region_name="us-east-1",
config=boto3.session.Config(signature_version="s3v4", s3={"addressing_style": "path"}),
) Buckets
# List
for b in s3.list_buckets()["Buckets"]:
print(b["Name"], b["CreationDate"])
# Head
s3.head_bucket(Bucket="bucket") Upload a file
# One-shot, single-part
s3.upload_file("./photo.jpg", "bucket", "photos/2026/photo.jpg",
ExtraArgs={"ContentType": "image/jpeg"})
# Streaming
with open("./huge.iso", "rb") as f:
s3.upload_fileobj(f, "bucket", "backups/huge.iso") Download
s3.download_file("bucket", "photos/2026/photo.jpg", "./photo.jpg")
with open("./photo.jpg", "wb") as f:
s3.download_fileobj("bucket", "photos/2026/photo.jpg", f) List objects
paginator = s3.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket="bucket", Prefix="photos/"):
for obj in page.get("Contents", []):
print(obj["Key"], obj["Size"]) Multipart upload
import boto3
from boto3.s3.transfer import TransferConfig
s3 = boto3.client("s3", endpoint_url="https://s3.uploom.io", ...)
config = TransferConfig(multipart_threshold=8 * 1024 * 1024, multipart_chunksize=16 * 1024 * 1024)
s3.upload_file("./huge.iso", "bucket", "backups/huge.iso", Config=config) boto3 switches to multipart automatically when the body is above the threshold.
Presigned URL
url = s3.generate_presigned_url(
"put_object",
Params={"Bucket": "bucket", "Key": "uploads/x.bin"},
ExpiresIn=900,
)
print(url) Credentials from env
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_ENDPOINT_URL_S3=https://s3.uploom.io
Then boto3.client("s3") works without any code change.