Custom S3
Connect private AWS S3, Cloudflare R2 or compatible object storage independently of your GPU cloud.
Use a private S3-compatible bucket for your organization's documents, datasets and trained adapters. Storage is independent of compute: an AWS S3 or Cloudflare R2 bucket can support training on RunPod, Vast.ai, Verda, Lambda, AWS or Azure.
A new organization can connect S3 and create projects without first connecting RunPod. Connect a GPU provider when you are ready to train. Managed inference, publishing and managed experiment evaluation still require RunPod compute and a RunPod network volume; custom S3 does not add serving on the other clouds.
Before you create the bucket
Choose the location carefully. After the organization has projects, its storage backend, bucket, endpoint and signing region cannot be changed in Connections. Replacing credentials rotates access to the same location; it does not move data. Moving existing projects from a RunPod volume or another bucket requires a separate migration.
Use a dedicated private bucket and a dedicated access key limited to it. With your organization's own S3 connection, training machines receive the bucket's access key and secret for dataset, image and multipart adapter transfers. The runner's project/run prefix is not a permission boundary: the key can access everything its storage policy allows. Do not reuse a key with access to unrelated buckets or production data.
The service needs AWS Signature V4, presigned downloads/uploads, bucket inspection, object listing, object read/write/delete and multipart uploads. Use a normal object bucket, not an S3 website, CDN URL or Azure Blob container. Native Azure Blob Storage is not S3-compatible.
Option A: AWS S3
1. Create a private bucket
- Open Amazon S3 → General purpose buckets → Create bucket.
- Select your desired AWS region and enter a unique bucket name, for example
my-team-tensorant-data. - Keep Block all public access enabled. Use bucket-owner-enforced object ownership with ACLs disabled.
- Keep default server-side encryption, or configure the encryption policy your organization requires.
- Create the bucket and record its name and region, such as
us-east-1.
The bucket remains private even though its API endpoint is publicly reachable; signed credentials authorize access. A public bucket policy or static website is unnecessary. AWS bucket creation
2. Give a dedicated identity access to this bucket
Create a dedicated IAM user without console access and attach this policy, replacing BUCKET_NAME in both resource ARNs:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "InspectAndListWorkspace",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::BUCKET_NAME"
},
{
"Sid": "TransferWorkspaceObjects",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": "arn:aws:s3:::BUCKET_NAME/*"
}
]
}This grants the object operations Tensorant needs without granting bucket administration or access to other buckets. s3:ListBucket also authorizes the bucket-existence check. Do not restrict it to an invented project prefix: connection checks and different projects use their own prefixes. S3 API permissions
If you require SSE-KMS with a customer-managed key, the identity and key policy also need the appropriate KMS access, including kms:GenerateDataKey and kms:Decrypt for uploads, reads and multipart operations. Limit that access to the bucket's key. A policy that requires clients to explicitly send a particular encryption header may need adjustment; Tensorant uses the bucket's default encryption configuration. S3 with KMS
In the IAM user's Security credentials → Access keys, create an access key for an application outside AWS. Save the Access key ID and Secret access key. This storage form accepts that two-part key pair; it has no field for temporary STS session tokens. The optional session token in the AWS compute connection applies only to EC2 credentials. AWS access keys
3. Use these connection values
| Tensorant field | AWS example |
|---|---|
| Bucket name | my-team-tensorant-data |
| Signing region | The bucket's actual region, such as us-east-1 |
| Service endpoint (optional for AWS S3) | Leave empty to use the regional AWS endpoint |
| Addressing style | auto; virtual is also suitable for a DNS-compatible bucket name |
| Access key ID | The dedicated storage IAM user's key ID |
| Secret access key | That key's secret |
If you enter an AWS endpoint explicitly, use the service endpoint, for example https://s3.us-east-1.amazonaws.com, with the matching signing region. Do not include the bucket in the endpoint field.
Option B: Cloudflare R2
1. Create a bucket and a scoped token
- Open the Cloudflare dashboard and choose the account that will own the workspace.
- Open Storage & databases → R2 object storage and create a bucket. Record the exact bucket name and any jurisdiction restriction you select.
- From R2's overview, open Manage API Tokens and create an account or user API token suitable for your organization.
- Choose Object Read & Write and limit the token to the single Tensorant bucket.
- Copy the resulting Access Key ID, Secret Access Key and S3 API endpoint. The Cloudflare bearer API-token string itself is not the S3 secret key.
Keep the bucket private. You do not need a public development URL or a custom domain. R2 API token setup
2. Use these connection values
| Tensorant field | R2 example |
|---|---|
| Bucket name | my-team-tensorant-data |
| Signing region | auto |
| Service endpoint (optional for AWS S3) | https://ACCOUNT_ID.r2.cloudflarestorage.com |
| Addressing style | path |
| Access key ID | R2's S3 Access Key ID |
| Secret access key | R2's S3 Secret Access Key |
Replace ACCOUNT_ID with your real account ID, or copy the endpoint shown by R2. Jurisdiction-restricted buckets use a corresponding endpoint, such as https://ACCOUNT_ID.eu.r2.cloudflarestorage.com; use that endpoint instead of the default account endpoint. The signing region remains auto. R2 S3 API configuration
Other S3-compatible services
Ask the storage provider for its S3 service endpoint, signing region and supported addressing style. "Region" here is the value used to sign S3 requests; it is not your GPU's region.
| Style | Request shape | When to choose it |
|---|---|---|
path |
https://service.example.com/bucket/object |
The service documents path-style access, including the R2 setup above |
virtual |
https://bucket.service.example.com/object |
The service supports bucket subdomains, DNS and matching TLS certificates |
auto |
SDK selection; training transfers use path style | AWS default, or a service that supports path style and automatic SDK selection |
Customer endpoints must use HTTPS on port 443, resolve to public IP addresses, and contain no username, password, query, fragment or bucket path. Localhost, IP-address URLs, private/internal endpoints, HTTP and native Azure Blob endpoints are unsupported. Use the RunPod network-storage option for a RunPod S3 endpoint.
Both Tensorant's service and your GPU machines need to reach the endpoint. A bucket policy allowing only one private VPC endpoint can prevent the control plane or a GPU in another cloud from accessing it. Public network reachability does not require public object access.
Save and check the connection
An organization owner opens Settings → Connections, chooses Connect S3 storage on the Data storage card, and enters the six values above. Select Connect S3 storage to save.
Tensorant checks the bucket, lists a unique probe prefix, then writes, reads and deletes a small probe object. These are real storage API requests and can incur the service's normal request charges; they do not rent a GPU. A read-only key cannot pass the check.
After saving:
- Confirm storage shows Connected.
- Create a project and upload a small source file. Confirm you can read it and create a dataset version.
- Connect your chosen compute provider, select it under Training provider, and launch a short training trial with a price and time limit.
- Confirm the trial verifies its adapter in storage and releases its GPU. This checks network access from the GPU, which the storage connection check alone cannot establish.
Follow training runs for the trial and recovery flow. An S3 connection does not automatically mount the bucket as a GPU filesystem. Training uses local working files and transfers artifacts to the bucket.
Rotate credentials and retain your data
For an organization with projects, choose Replace keys on the Data storage card. In Replace S3 credentials, enter new keys for the same bucket, region and endpoint, then choose Replace credentials. Keep the old key valid while any running or recovering GPU still uses it; those machines received their credentials at launch. Verify the replacement connection, allow old runs to finish and clean up, then revoke the old key. New runs use the replacement keys.
Do not delete or expire source files, dataset versions, adapter files or objects needed by active runs. Configure lifecycle rules deliberately; aborting old incomplete multipart uploads is different from deleting completed workspace objects. If versioning is enabled, old object versions can remain billable after normal object deletion. Storage, requests and cross-cloud transfer are billed by the corresponding providers.
Changing a GPU provider leaves project storage in place. Changing a storage credential does not copy, migrate or rename any project data.
Troubleshooting
| Symptom | Check |
|---|---|
Bucket check returns AccessDenied |
The key has bucket-list permission as well as object permissions; bucket policies, KMS policies and account policies do not deny it. |
| Read succeeds but connection cannot save | Writes or deletes are denied, or an Object Lock/retention rule prevents deleting the probe. |
SignatureDoesNotMatch or a region error |
Check the secret, signing region, service endpoint and addressing style. R2 uses region auto; AWS uses the bucket's region. |
| Endpoint validation fails | Use a public HTTPS service hostname on port 443, without bucket/path/query; private endpoints and Azure Blob URLs are unsupported. |
| Bucket-subdomain DNS or certificate failure | Use path if the service supports it; virtual requires working bucket-subdomain DNS and TLS. |
| Large transfers fail | Check multipart support and permissions, KMS access if used, and network timeouts. A small probe cannot test every large upload. |
| Training cannot fetch data or upload its adapter | Verify outbound access from the GPU subnet, storage-policy reachability from that cloud, and that the launch-time storage key is still valid. |
| Existing projects prevent changing the bucket | This is intentional. Rotate keys for the same location; moving data requires a separate migration. |
Need a hand? Visit troubleshooting