mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-03-22 06:11:27 -07:00
update skills
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
# Resource Configuration
|
||||
|
||||
## Workers (cloudflare.WorkerScript)
|
||||
|
||||
```typescript
|
||||
import * as cloudflare from "@pulumi/cloudflare";
|
||||
import * as fs from "fs";
|
||||
|
||||
const worker = new cloudflare.WorkerScript("my-worker", {
|
||||
accountId: accountId,
|
||||
name: "my-worker",
|
||||
content: fs.readFileSync("./dist/worker.js", "utf8"),
|
||||
module: true, // ES modules
|
||||
compatibilityDate: "2025-01-01",
|
||||
compatibilityFlags: ["nodejs_compat"],
|
||||
|
||||
// v6.x: Observability
|
||||
logpush: true, // Enable Workers Logpush
|
||||
tailConsumers: [{service: "log-consumer"}], // Stream logs to Worker
|
||||
|
||||
// v6.x: Placement
|
||||
placement: {mode: "smart"}, // Smart placement for latency optimization
|
||||
|
||||
// Bindings
|
||||
kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}],
|
||||
r2BucketBindings: [{name: "MY_BUCKET", bucketName: bucket.name}],
|
||||
d1DatabaseBindings: [{name: "DB", databaseId: db.id}],
|
||||
queueBindings: [{name: "MY_QUEUE", queue: queue.id}],
|
||||
serviceBindings: [{name: "OTHER_SERVICE", service: other.name}],
|
||||
plainTextBindings: [{name: "ENV_VAR", text: "value"}],
|
||||
secretTextBindings: [{name: "API_KEY", text: secret}],
|
||||
|
||||
// v6.x: Advanced bindings
|
||||
analyticsEngineBindings: [{name: "ANALYTICS", dataset: "my-dataset"}],
|
||||
browserBinding: {name: "BROWSER"}, // Browser Rendering
|
||||
aiBinding: {name: "AI"}, // Workers AI
|
||||
hyperdriveBindings: [{name: "HYPERDRIVE", id: hyperdriveConfig.id}],
|
||||
});
|
||||
```
|
||||
|
||||
## Workers KV (cloudflare.WorkersKvNamespace)
|
||||
|
||||
```typescript
|
||||
const kv = new cloudflare.WorkersKvNamespace("my-kv", {
|
||||
accountId: accountId,
|
||||
title: "my-kv-namespace",
|
||||
});
|
||||
|
||||
// Write values
|
||||
const kvValue = new cloudflare.WorkersKvValue("config", {
|
||||
accountId: accountId,
|
||||
namespaceId: kv.id,
|
||||
key: "config",
|
||||
value: JSON.stringify({foo: "bar"}),
|
||||
});
|
||||
```
|
||||
|
||||
## R2 Buckets (cloudflare.R2Bucket)
|
||||
|
||||
```typescript
|
||||
const bucket = new cloudflare.R2Bucket("my-bucket", {
|
||||
accountId: accountId,
|
||||
name: "my-bucket",
|
||||
location: "auto", // or "wnam", etc.
|
||||
});
|
||||
```
|
||||
|
||||
## D1 Databases (cloudflare.D1Database)
|
||||
|
||||
```typescript
|
||||
const db = new cloudflare.D1Database("my-db", {accountId, name: "my-database"});
|
||||
|
||||
// Migrations via wrangler
|
||||
import * as command from "@pulumi/command";
|
||||
const migration = new command.local.Command("d1-migration", {
|
||||
create: pulumi.interpolate`wrangler d1 execute ${db.name} --file ./schema.sql`,
|
||||
}, {dependsOn: [db]});
|
||||
```
|
||||
|
||||
## Queues (cloudflare.Queue)
|
||||
|
||||
```typescript
|
||||
const queue = new cloudflare.Queue("my-queue", {accountId, name: "my-queue"});
|
||||
|
||||
// Producer
|
||||
const producer = new cloudflare.WorkerScript("producer", {
|
||||
accountId, name: "producer", content: code,
|
||||
queueBindings: [{name: "MY_QUEUE", queue: queue.id}],
|
||||
});
|
||||
|
||||
// Consumer
|
||||
const consumer = new cloudflare.WorkerScript("consumer", {
|
||||
accountId, name: "consumer", content: code,
|
||||
queueConsumers: [{queue: queue.name, maxBatchSize: 10, maxRetries: 3}],
|
||||
});
|
||||
```
|
||||
|
||||
## Pages Projects (cloudflare.PagesProject)
|
||||
|
||||
```typescript
|
||||
const pages = new cloudflare.PagesProject("my-site", {
|
||||
accountId, name: "my-site", productionBranch: "main",
|
||||
buildConfig: {buildCommand: "npm run build", destinationDir: "dist"},
|
||||
source: {
|
||||
type: "github",
|
||||
config: {owner: "my-org", repoName: "my-repo", productionBranch: "main"},
|
||||
},
|
||||
deploymentConfigs: {
|
||||
production: {
|
||||
environmentVariables: {NODE_VERSION: "18"},
|
||||
kvNamespaces: {MY_KV: kv.id},
|
||||
d1Databases: {DB: db.id},
|
||||
},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## DNS Records (cloudflare.DnsRecord)
|
||||
|
||||
```typescript
|
||||
const zone = cloudflare.getZone({name: "example.com"});
|
||||
const record = new cloudflare.DnsRecord("www", {
|
||||
zoneId: zone.then(z => z.id), name: "www", type: "A",
|
||||
content: "192.0.2.1", ttl: 3600, proxied: true,
|
||||
});
|
||||
```
|
||||
|
||||
## Workers Domains/Routes
|
||||
|
||||
```typescript
|
||||
// Route (pattern-based)
|
||||
const route = new cloudflare.WorkerRoute("my-route", {
|
||||
zoneId: zoneId,
|
||||
pattern: "example.com/api/*",
|
||||
scriptName: worker.name,
|
||||
});
|
||||
|
||||
// Domain (dedicated subdomain)
|
||||
const domain = new cloudflare.WorkersDomain("my-domain", {
|
||||
accountId: accountId,
|
||||
hostname: "api.example.com",
|
||||
service: worker.name,
|
||||
zoneId: zoneId,
|
||||
});
|
||||
```
|
||||
|
||||
## Assets Configuration (v6.x)
|
||||
|
||||
Serve static assets from Workers:
|
||||
|
||||
```typescript
|
||||
const worker = new cloudflare.WorkerScript("app", {
|
||||
accountId: accountId,
|
||||
name: "my-app",
|
||||
content: code,
|
||||
assets: {
|
||||
path: "./public", // Local directory
|
||||
// Assets uploaded and served from Workers
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## v6.x Versioned Deployments (Advanced)
|
||||
|
||||
For gradual rollouts, use 3-resource pattern:
|
||||
|
||||
```typescript
|
||||
// 1. Worker (container for versions)
|
||||
const worker = new cloudflare.Worker("api", {
|
||||
accountId: accountId,
|
||||
name: "api-worker",
|
||||
});
|
||||
|
||||
// 2. Version (immutable code + config)
|
||||
const version = new cloudflare.WorkerVersion("v1", {
|
||||
accountId: accountId,
|
||||
workerId: worker.id,
|
||||
content: fs.readFileSync("./dist/worker.js", "utf8"),
|
||||
compatibilityDate: "2025-01-01",
|
||||
compatibilityFlags: ["nodejs_compat"],
|
||||
// Note: Bindings configured at deployment level
|
||||
});
|
||||
|
||||
// 3. Deployment (version + bindings + traffic split)
|
||||
const deployment = new cloudflare.WorkersDeployment("prod", {
|
||||
accountId: accountId,
|
||||
workerId: worker.id,
|
||||
versionId: version.id,
|
||||
// Bindings applied to deployment
|
||||
kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}],
|
||||
});
|
||||
```
|
||||
|
||||
**When to use:** Blue-green deployments, canary releases, gradual rollouts
|
||||
**When NOT to use:** Simple single-version deployments (use WorkerScript)
|
||||
|
||||
---
|
||||
See: [README.md](./README.md), [api.md](./api.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
|
||||
Reference in New Issue
Block a user