How to Update Your Application's S3 Endpoint for Quake AI
Coming from another cloud?
▸AWS·Amazon S3
This Quake AI feature maps to AWS’s Amazon S3.
▸Azure·Blob Storage
This Quake AI feature maps to Azure’s Blob Storage.
▸Google Cloud·Storage
This Quake AI feature maps to Google Cloud’s Storage.
How to update your application's S3 endpoint for Quake AI
After migrating your data, update your application code to read and write from Quake AI instead of the previous provider. Because Quake AI is S3-compatible, this is typically a configuration change, not a code rewrite.
What changes#
| Setting | Old value (AWS example) | New value (Quake AI) |
|---|---|---|
| Endpoint URL | https://s3.amazonaws.com (or omitted) | https://object.us-east-2.rumble.cloud |
| Access key | Your AWS access key | Your Quake AI access key |
| Secret key | Your AWS secret key | Your Quake AI secret key |
| Region | Varies (us-east-1, eu-west-1, etc.) | us-east-1 (required for SigV4 compatibility) |
| Path style | Virtual-hosted (default on AWS) | Path style recommended |
Environment variables#
Many S3 SDKs read credentials and endpoint from environment variables. Set these and your application may require zero code changes:
export AWS_ACCESS_KEY_ID="YOUR_RUMBLE_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_RUMBLE_SECRET_KEY"
export AWS_ENDPOINT_URL="https://object.us-east-2.rumble.cloud"
export AWS_DEFAULT_REGION="us-east-1"AWS_ENDPOINT_URL is supported by the AWS CLI (v2.13+), boto3 (v1.29+), and the AWS SDK for JavaScript v3. Other SDKs may require explicit configuration in code.
SDK examples#
Python (boto3)#
import boto3
s3 = boto3.client(
"s3",
endpoint_url="https://object.us-east-2.rumble.cloud",
aws_access_key_id="YOUR_RUMBLE_ACCESS_KEY",
aws_secret_access_key="YOUR_RUMBLE_SECRET_KEY",
region_name="us-east-1",
)
response = s3.list_buckets()
for bucket in response["Buckets"]:
print(bucket["Name"])For boto3 resource interface:
s3 = boto3.resource(
"s3",
endpoint_url="https://object.us-east-2.rumble.cloud",
aws_access_key_id="YOUR_RUMBLE_ACCESS_KEY",
aws_secret_access_key="YOUR_RUMBLE_SECRET_KEY",
region_name="us-east-1",
)
for bucket in s3.buckets.all():
print(bucket.name)Node.js (AWS SDK v3)#
import { S3Client, ListBucketsCommand } from "@aws-sdk/client-s3";
const client = new S3Client({
endpoint: "https://object.us-east-2.rumble.cloud",
region: "us-east-1",
credentials: {
accessKeyId: "YOUR_RUMBLE_ACCESS_KEY",
secretAccessKey: "YOUR_RUMBLE_SECRET_KEY",
},
forcePathStyle: true,
});
const response = await client.send(new ListBucketsCommand({}));
console.log(response.Buckets);Go (AWS SDK v2)#
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("us-east-1"),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
"YOUR_RUMBLE_ACCESS_KEY",
"YOUR_RUMBLE_SECRET_KEY",
"",
)),
)
if err != nil {
log.Fatal(err)
}
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
o.BaseEndpoint = aws.String("https://object.us-east-2.rumble.cloud")
o.UsePathStyle = true
})
result, err := client.ListBuckets(context.TODO(), &s3.ListBucketsInput{})
if err != nil {
log.Fatal(err)
}
for _, bucket := range result.Buckets {
fmt.Println(*bucket.Name)
}
}Java (AWS SDK v2)#
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3Configuration;
import java.net.URI;
S3Client s3 = S3Client.builder()
.endpointOverride(URI.create("https://object.us-east-2.rumble.cloud"))
.region(Region.US_EAST_1)
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create("YOUR_RUMBLE_ACCESS_KEY", "YOUR_RUMBLE_SECRET_KEY")))
.serviceConfiguration(S3Configuration.builder()
.pathStyleAccessEnabled(true)
.build())
.build();
s3.listBuckets().buckets().forEach(bucket ->
System.out.println(bucket.name()));Terraform (S3 backend)#
For storing Terraform/OpenTofu state on Quake AI:
terraform {
backend "s3" {
bucket = "my-tf-state"
key = "terraform.tfstate"
region = "us-east-1"
endpoint = "https://object.us-east-2.rumble.cloud"
access_key = "YOUR_RUMBLE_ACCESS_KEY"
secret_key = "YOUR_RUMBLE_SECRET_KEY"
skip_credentials_validation = true
skip_metadata_api_check = true
skip_region_validation = true
force_path_style = true
}
}Feature audit before switching#
Before changing your application's endpoint, verify that your code does not depend on S3 features unavailable on Quake AI:
| Check for | How to find it | What to do |
|---|---|---|
| Lifecycle policy dependency | Search for put_bucket_lifecycle_configuration or PutBucketLifecycleConfiguration | Implement retention with external cron jobs |
| Event notification dependency | Search for put_bucket_notification_configuration, SNS ARNs, SQS ARNs, Lambda ARNs | Replace with application-level polling |
| Bucket policy dependency | Search for put_bucket_policy or JSON policy documents | Translate to Swift ACLs |
| S3 Select usage | Search for select_object_content | Download and query locally |
| Presigned URL generation | Search for generate_presigned_url or getSignedUrl | Presigned URLs are supported; no changes needed |
Gradual cutover with dual-write#
For zero-downtime migration, write to both providers during the transition:
import boto3
old_s3 = boto3.client("s3", region_name="us-east-1")
new_s3 = boto3.client(
"s3",
endpoint_url="https://object.us-east-2.rumble.cloud",
aws_access_key_id="YOUR_RUMBLE_ACCESS_KEY",
aws_secret_access_key="YOUR_RUMBLE_SECRET_KEY",
region_name="us-east-1",
)
def upload(bucket, key, body):
new_s3.put_object(Bucket=bucket, Key=key, Body=body)
old_s3.put_object(Bucket=bucket, Key=key, Body=body)
def download(bucket, key):
try:
return new_s3.get_object(Bucket=bucket, Key=key)["Body"].read()
except Exception:
return old_s3.get_object(Bucket=bucket, Key=key)["Body"].read()Once you confirm the Quake AI endpoint is stable, remove the old provider calls and the fallback logic.
See also#
- Plan your migration: compatibility matrix, feature gap workarounds
- Create S3 credentials: generate access keys for Quake AI
- Migrate from AWS S3: full data migration guide
Usage Guidelines
The sample code, software libraries, command line tools, proofs of concept, templates, and other related technology on this page (including any of the foregoing that is provided by Quake AI personnel) is provided to you as Quake AI Content under the Quake AI Customer Agreement, or the relevant written agreement between you and Quake AI (whichever applies). Do not use this Quake AI Content in your production accounts, or on production or other critical data. You are responsible for testing, securing, and optimizing the Quake AI Content (such as sample code) as appropriate for production grade use based on your specific quality control practices and standards. Deploying Quake AI Content may incur Quake AI charges for creating or using Quake AI chargeable resources, such as running Compute instances or storing data in Object Storage. Your use is also subject to the Acceptable Use Policy.
For the full policy, see Usage Guidelines.
Last validated: 08.09.2026
Quick answers
- What is the S3-compatible endpoint hostname?CLIAPI
- Where do I set CORS rules, lifecycle policies, or bucket policies in the Console?Console
- Why do Object Storage API curl examples fail before the first request?API
- Why does my public bucket URL return 404 from the browser after I apply a public-read policy?APIConsole
See Also
S3 on Quake AI
Prerequisite
How to Migrate from Azure blob storage to Quake AI
Shares: S3, Migration
How to Migrate from Backblaze B2 to Quake AI
Shares: S3, Migration
How to Migrate from DigitalOcean Spaces to Quake AI
Shares: S3, Migration
How to Migrate from Google Cloud storage to Quake AI
Shares: S3, Migration