Object storage

Last updated: June 22, 2026

American Cloud object storage is S3-compatible, so anything that already speaks S3 — the AWS CLI, the AWS SDKs, s3cmd, rclone, your framework's upload library — works by pointing at a new endpoint. And there are no egress fees: you download your own data without paying per gigabyte to access it (see why egress fees matter).

That makes it a natural fit for AI-driven workflows. With the American Cloud MCP server connected, you can ask your assistant to create a storage unit, hand you the connection details, and write the integration code for your stack — all from the same chat where you're building the app.

This page is a recipe: copy a prompt, see exactly what your assistant does with it, then drop in working S3 code.

What you'll need

  • The American Cloud MCP server connected to your assistant. If you haven't set it up yet, start with the overview, then your client guide: Claude Code, Cursor, or other clients.
  • For the create steps below, a read-write API key plus the --allow-writes flag. Reading your usage and fetching connection details work with a read-only key. See Safety.

How the pieces fit: a storage unit holds your buckets and has its own S3 access keys. You create one unit, add buckets inside it, and use that unit's keys to connect any S3 client. Storage is metered by usage, so you're not sizing a disk up front.

Create a storage unit and bucket

Start a conversation and paste:

Create an object storage unit called {app-name}-prod, then add a bucket called uploads inside it. Show me the cost estimate first.

What your assistant will do:

  1. Call get_cost_estimate_object_storage to show the metered pricing before anything is created — object storage is billed by actual usage, so this is the per-GB rate and any minimum, not a fixed disk size.
  2. Once you confirm, call create_object_storage_unit to provision the unit and return its identifier.
  3. Call create_object_storage_bucket against that unit to create the uploads bucket.
  4. Report back the unit and bucket so you can confirm they exist.

Want a guardrail against runaway growth? Add a cap in the same breath:

Also set a 500 GB limit on that unit so it can't grow unbounded.

The assistant uses set_object_storage_quota to apply the limit. Ask it to remove the cap later and it does the same in reverse.

You can always take inventory of what you have:

List my object storage units with their current usage, and show the buckets in each one.

This runs list_object_storage_units (with usage figures) and list_object_storage_buckets — both read-only, so they work even before you enable writes.

Fetch your access keys and endpoint

To connect any S3 client you need the unit's access key, secret, and endpoint. Ask:

Fetch the S3 access keys and connection details for my {app-name}-prod storage unit.

The assistant calls get_object_storage_keys for the unit and returns the access key, secret key, and the S3 endpoint to use.

The keys tool returns a secret — its tool description is labeled sensitive for exactly this reason. Treat the secret like any other credential: don't paste it into shared chats or commit it to a repo. Put it in an environment variable or a secrets manager, and rotate it if it's ever exposed.

For the steps below, store what the assistant returns as environment variables. Use the endpoint your assistant reports for S3_ENDPOINT (it includes the https:// scheme):

sh
export S3_ENDPOINT="https://<endpoint-from-assistant>"
export S3_ACCESS_KEY="<access-key-from-assistant>"
export S3_SECRET_KEY="<secret-from-assistant>"
export S3_BUCKET="uploads"

Wire an app to it

Object storage is S3-compatible, so every integration below is standard S3 code with two changes: a custom endpoint and your American Cloud credentials. Pick your tool.

Node.js with the AWS SDK v3

Install the S3 client:

sh
npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner

Upload a file and generate a presigned download URL. The credentials and endpoint come from the environment variables you set above — forcePathStyle: true is the one S3-compatibility detail to remember:

js
import { readFile } from "node:fs/promises";
import { S3Client, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
 
const s3 = new S3Client({
  endpoint: process.env.S3_ENDPOINT,
  region: "us-east-1", // any value; required by the SDK but unused
  forcePathStyle: true,
  credentials: {
    accessKeyId: process.env.S3_ACCESS_KEY,
    secretAccessKey: process.env.S3_SECRET_KEY,
  },
});
 
const Bucket = process.env.S3_BUCKET;
 
// Upload a file
await s3.send(
  new PutObjectCommand({
    Bucket,
    Key: "avatars/user-123.png",
    Body: await readFile("./user-123.png"),
    ContentType: "image/png",
  }),
);
 
// Generate a presigned URL that lets someone download it for 1 hour
const url = await getSignedUrl(
  s3,
  new GetObjectCommand({ Bucket, Key: "avatars/user-123.png" }),
  { expiresIn: 3600 },
);
 
console.log("Download link:", url);

Presigned URLs let you share a private object temporarily without exposing your keys — ideal for user downloads, email attachments, or time-limited access. For a longer walkthrough, see uploading files to object storage with Node.js.

AWS CLI

The standard aws CLI works against object storage with the --endpoint-url flag. Set credentials however you normally would (aws configure, env vars, or a named profile):

sh
export AWS_ACCESS_KEY_ID="$S3_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="$S3_SECRET_KEY"
 
# List objects in a bucket
aws s3 ls "s3://$S3_BUCKET/" --endpoint-url "$S3_ENDPOINT"
 
# Upload a file
aws s3 cp ./report.pdf "s3://$S3_BUCKET/reports/report.pdf" --endpoint-url "$S3_ENDPOINT"
 
# Sync a local directory up
aws s3 sync ./public "s3://$S3_BUCKET/static/" --endpoint-url "$S3_ENDPOINT"

Prefer a dedicated tool? The s3cmd guide walks through the configuration wizard end to end and every common bucket and object command.

rclone for bulk sync and migration

rclone is the fastest way to move large datasets, and it talks S3 on both ends — so it can copy directly from another S3 provider into American Cloud. Add a remote (rclone config, provider type Other/S3-compatible) or write it inline:

sh
# An American Cloud remote, configured inline
rclone copy ./build americancloud:$S3_BUCKET/releases/v2 --progress
 
# S3-to-S3 migration: copy straight from another provider's bucket
rclone copy oldprovider:legacy-bucket americancloud:$S3_BUCKET --progress --transfers 16

Because there are no egress fees on the American Cloud side, pulling data in is free — only the source provider's egress applies. For a full provider switch, pair this with migrate from AWS.

Let your assistant write the integration

You don't have to translate any of this by hand. If you're working in a coding agent like Claude Code, tell it your stack and the env var names you used:

I've stored my object storage credentials in S3_ENDPOINT, S3_ACCESS_KEY, S3_SECRET_KEY, and S3_BUCKET. Add an upload route to my Next.js app that stores user avatars in object storage and returns a presigned URL. Read the values from the environment — don't hardcode the secret.

The assistant has both the connection details (from get_object_storage_keys) and your codebase, so it can write the S3 client, the route handler, and the env wiring for your framework, then explain what it did. Ask it to use the env vars rather than inlining the secret.

Common patterns

A few things developers reach for object storage to do, and the prompts to set them up.

User uploads and static assets

Serve user-generated content and your app's static files straight from a bucket:

My app needs somewhere to put user-uploaded images. Create an object storage unit and an "uploads" bucket, fetch the keys, and add an upload helper to my project that returns a presigned URL for each file.

Off-site backups from a VM

Push nightly database dumps or upload directories off your server and into a bucket. In a coding agent that can reach your VM over SSH:

Set up a nightly cron job on my VM that tars /var/www/uploads and pushes it to my object storage bucket under backups/, keeping the last 14 days. Use the AWS CLI with my endpoint and rotate out anything older.

What your assistant will do:

  1. Confirm (or create, with create_object_storage_bucket) a bucket to hold the backups.
  2. Fetch the keys with get_object_storage_keys so the VM can authenticate.
  3. Over SSH, install the AWS CLI if needed, write a backup script that archives the directory and uploads it with aws s3 cp --endpoint-url, and prune objects older than 14 days.
  4. Add a cron entry to run it nightly and confirm the schedule.

Zero egress fees matter most here: restoring a backup means downloading it, and that download is free.

Build artifacts and data archives

Hosting build outputs, release bundles, or long-term archives is the same shape — a bucket plus an upload step in your pipeline:

Add a step to my deploy script that uploads the contents of ./dist to my object storage bucket under releases/$(git rev-parse --short HEAD)/, so every build is archived.

Next steps