Skip to content

How to Update Your Application's S3 Endpoint for Quake AI

How-to · Updated Sep 2026

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.

Before this

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#

SettingOld value (AWS example)New value (Quake AI)
Endpoint URLhttps://s3.amazonaws.com (or omitted)https://object.us-east-2.rumble.cloud
Access keyYour AWS access keyYour Quake AI access key
Secret keyYour AWS secret keyYour Quake AI secret key
RegionVaries (us-east-1, eu-west-1, etc.)us-east-1 (required for SigV4 compatibility)
Path styleVirtual-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:

bash
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)#

Python
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:

Python
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)#

JavaScript
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)#

Go
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)#

java
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:

HCL
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 forHow to find itWhat to do
Lifecycle policy dependencySearch for put_bucket_lifecycle_configuration or PutBucketLifecycleConfigurationImplement retention with external cron jobs
Event notification dependencySearch for put_bucket_notification_configuration, SNS ARNs, SQS ARNs, Lambda ARNsReplace with application-level polling
Bucket policy dependencySearch for put_bucket_policy or JSON policy documentsTranslate to Swift ACLs
S3 Select usageSearch for select_object_contentDownload and query locally
Presigned URL generationSearch for generate_presigned_url or getSignedUrlPresigned URLs are supported; no changes needed

Gradual cutover with dual-write#

For zero-downtime migration, write to both providers during the transition:

Python
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#

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

Was this page helpful?