🐍 Python (boto3)
boto3 is the standard AWS SDK for Python (pip install boto3).
Setup
import boto3
s3 = boto3.client(
"s3",
endpoint_url="https://s3.lighthouse.storage",
aws_access_key_id="YOUR_ACCESS_KEY",
aws_secret_access_key="YOUR_SECRET_KEY",
region_name="us-east-1",
)
Upload
# create a bucket
s3.create_bucket(Bucket="my-app-data")
# upload a file (multipart automatically for large files)
s3.upload_file("model.bin", "my-app-data", "models/model.bin")
# upload bytes with content type and metadata
s3.put_object(
Bucket="my-app-data",
Key="config.json",
Body=b'{"version": 2}',
ContentType="application/json",
Metadata={"owner": "alice"},
)
Get the CID
head = s3.head_object(Bucket="my-app-data", Key="models/model.bin")
print(head["Metadata"]["cid"])
# bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
Download, list, presign
# download
s3.download_file("my-app-data", "models/model.bin", "local-model.bin")
# stream a range (bytes 0-1023)
part = s3.get_object(Bucket="my-app-data", Key="models/model.bin", Range="bytes=0-1023")
first_kb = part["Body"].read()
# list with pagination — handled by the paginator
for page in s3.get_paginator("list_objects_v2").paginate(Bucket="my-app-data", Prefix="models/"):
for obj in page.get("Contents", []):
print(obj["Key"], obj["Size"])
# presigned URL, valid 1 hour
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": "my-app-data", "Key": "config.json"},
ExpiresIn=3600,
)