Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Cloudflare platform skill covering Workers, D1, R2, KV, AI, Durable Objects, and security.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/pulumi/configuration.md
1# Resource Configuration23## Workers (cloudflare.WorkerScript)45```typescript6import * as cloudflare from "@pulumi/cloudflare";7import * as fs from "fs";89const worker = new cloudflare.WorkerScript("my-worker", {10accountId: accountId,11name: "my-worker",12content: fs.readFileSync("./dist/worker.js", "utf8"),13module: true, // ES modules14compatibilityDate: "2025-01-01",15compatibilityFlags: ["nodejs_compat"],1617// v6.x: Observability18logpush: true, // Enable Workers Logpush19tailConsumers: [{service: "log-consumer"}], // Stream logs to Worker2021// v6.x: Placement22placement: {mode: "smart"}, // Smart placement for latency optimization2324// Bindings25kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}],26r2BucketBindings: [{name: "MY_BUCKET", bucketName: bucket.name}],27d1DatabaseBindings: [{name: "DB", databaseId: db.id}],28queueBindings: [{name: "MY_QUEUE", queue: queue.id}],29serviceBindings: [{name: "OTHER_SERVICE", service: other.name}],30plainTextBindings: [{name: "ENV_VAR", text: "value"}],31secretTextBindings: [{name: "API_KEY", text: secret}],3233// v6.x: Advanced bindings34analyticsEngineBindings: [{name: "ANALYTICS", dataset: "my-dataset"}],35browserBinding: {name: "BROWSER"}, // Browser Rendering36aiBinding: {name: "AI"}, // Workers AI37hyperdriveBindings: [{name: "HYPERDRIVE", id: hyperdriveConfig.id}],38});39```4041## Workers KV (cloudflare.WorkersKvNamespace)4243```typescript44const kv = new cloudflare.WorkersKvNamespace("my-kv", {45accountId: accountId,46title: "my-kv-namespace",47});4849// Write values50const kvValue = new cloudflare.WorkersKvValue("config", {51accountId: accountId,52namespaceId: kv.id,53key: "config",54value: JSON.stringify({foo: "bar"}),55});56```5758## R2 Buckets (cloudflare.R2Bucket)5960```typescript61const bucket = new cloudflare.R2Bucket("my-bucket", {62accountId: accountId,63name: "my-bucket",64location: "auto", // or "wnam", etc.65});66```6768## D1 Databases (cloudflare.D1Database)6970```typescript71const db = new cloudflare.D1Database("my-db", {accountId, name: "my-database"});7273// Migrations via wrangler74import * as command from "@pulumi/command";75const migration = new command.local.Command("d1-migration", {76create: pulumi.interpolate`wrangler d1 execute ${db.name} --file ./schema.sql`,77}, {dependsOn: [db]});78```7980## Queues (cloudflare.Queue)8182```typescript83const queue = new cloudflare.Queue("my-queue", {accountId, name: "my-queue"});8485// Producer86const producer = new cloudflare.WorkerScript("producer", {87accountId, name: "producer", content: code,88queueBindings: [{name: "MY_QUEUE", queue: queue.id}],89});9091// Consumer92const consumer = new cloudflare.WorkerScript("consumer", {93accountId, name: "consumer", content: code,94queueConsumers: [{queue: queue.name, maxBatchSize: 10, maxRetries: 3}],95});96```9798## Pages Projects (cloudflare.PagesProject)99100```typescript101const pages = new cloudflare.PagesProject("my-site", {102accountId, name: "my-site", productionBranch: "main",103buildConfig: {buildCommand: "npm run build", destinationDir: "dist"},104source: {105type: "github",106config: {owner: "my-org", repoName: "my-repo", productionBranch: "main"},107},108deploymentConfigs: {109production: {110environmentVariables: {NODE_VERSION: "18"},111kvNamespaces: {MY_KV: kv.id},112d1Databases: {DB: db.id},113},114},115});116```117118## DNS Records (cloudflare.DnsRecord)119120```typescript121const zone = cloudflare.getZone({name: "example.com"});122const record = new cloudflare.DnsRecord("www", {123zoneId: zone.then(z => z.id), name: "www", type: "A",124content: "192.0.2.1", ttl: 3600, proxied: true,125});126```127128## Workers Domains/Routes129130```typescript131// Route (pattern-based)132const route = new cloudflare.WorkerRoute("my-route", {133zoneId: zoneId,134pattern: "example.com/api/*",135scriptName: worker.name,136});137138// Domain (dedicated subdomain)139const domain = new cloudflare.WorkersDomain("my-domain", {140accountId: accountId,141hostname: "api.example.com",142service: worker.name,143zoneId: zoneId,144});145```146147## Assets Configuration (v6.x)148149Serve static assets from Workers:150151```typescript152const worker = new cloudflare.WorkerScript("app", {153accountId: accountId,154name: "my-app",155content: code,156assets: {157path: "./public", // Local directory158// Assets uploaded and served from Workers159},160});161```162163## v6.x Versioned Deployments (Advanced)164165For gradual rollouts, use 3-resource pattern:166167```typescript168// 1. Worker (container for versions)169const worker = new cloudflare.Worker("api", {170accountId: accountId,171name: "api-worker",172});173174// 2. Version (immutable code + config)175const version = new cloudflare.WorkerVersion("v1", {176accountId: accountId,177workerId: worker.id,178content: fs.readFileSync("./dist/worker.js", "utf8"),179compatibilityDate: "2025-01-01",180compatibilityFlags: ["nodejs_compat"],181// Note: Bindings configured at deployment level182});183184// 3. Deployment (version + bindings + traffic split)185const deployment = new cloudflare.WorkersDeployment("prod", {186accountId: accountId,187workerId: worker.id,188versionId: version.id,189// Bindings applied to deployment190kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}],191});192```193194**When to use:** Blue-green deployments, canary releases, gradual rollouts195**When NOT to use:** Simple single-version deployments (use WorkerScript)196197---198See: [README.md](./README.md), [api.md](./api.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)199