Skip to content
GitHubXDiscordRSS

R2Bucket

Creates and manages Cloudflare R2 Buckets for object storage with S3 compatibility.

Create a basic R2 bucket with default settings:

import { R2Bucket } from "alchemy/cloudflare";
const bucket = await R2Bucket("my-bucket", {
name: "my-bucket",
});

Create a bucket with location hint for optimal performance:

import { R2Bucket } from "alchemy/cloudflare";
const euBucket = await R2Bucket("eu-bucket", {
name: "eu-bucket",
locationHint: "eu",
jurisdiction: "eu",
});

Create a development bucket with public access enabled:

import { R2Bucket } from "alchemy/cloudflare";
const publicBucket = await R2Bucket("public-assets", {
name: "public-assets",
allowPublicAccess: true,
});
console.log(publicBucket.domain); // [random-id].r2.dev

This enables the r2.dev domain for the bucket. This URL is rate-limited and not recommended for production use.

Create a bucket with CORS rules:

import { R2Bucket } from "alchemy/cloudflare";
const corsBucket = await R2Bucket("cors-bucket", {
name: "cors-bucket",
cors: [
{
allowed: {
origins: ["https://example.com"],
methods: ["GET", "POST", "PUT", "DELETE", "HEAD"],
headers: ["*"],
},
},
],
});

Create a bucket that will be automatically emptied when deleted:

import { R2Bucket } from "alchemy/cloudflare";
const tempBucket = await R2Bucket("temp-storage", {
name: "temp-storage",
empty: true, // All objects will be deleted when this resource is destroyed
});
import { Worker, R2Bucket } from "alchemy/cloudflare";
const bucket = await R2Bucket("my-bucket", {
name: "my-bucket",
});
await Worker("my-worker", {
name: "my-worker",
script: "console.log('Hello, world!')",
bindings: {
BUCKET: bucket,
},
});