[ PROMPT_NODE_24210 ]
Cloudflare Pulumi 资源配置
[ SKILL_DOCUMENTATION ]
# 资源配置
## 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 模块
compatibilityDate: "2025-01-01",
compatibilityFlags: ["nodejs_compat"],
// v6.x: 可观测性
logpush: true, // 启用 Workers Logpush
tailConsumers: [{service: "log-consumer"}], // 将日志流式传输到 Worker
// v6.x: 放置 (Placement)
placement: {mode: "smart"}, // 智能放置以优化延迟
// 绑定 (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: 高级绑定
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",
});
// 写入值
const kvValue = new cloudflare.WorkersKvValue("config", {
accountId: accountId,
namespaceId: kv.id,
key: "config",
value: JSON.stringify({foo: "bar"}),
});
```
## R2 存储桶 (cloudflare.R2Bucket)
```typescript
const bucket = new cloudflare.R2Bucket("my-bucket", {
accountId: accountId,
name: "my-bucket",
location: "auto", // 或 "wnam" 等
});
```
## D1 数据库 (cloudflare.D1Database)
```typescript
const db = new cloudflare.D1Database("my-db", {accountId, name: "my-database"});
// 通过 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]});
```
## 队列 (cloudflare.Queue)
```typescript
const queue = new cloudflare.Queue("my-queue", {accountId, name: "my-queue"});
// 生产者
const producer = new cloudflare.WorkerScript("producer", {
accountId, name: "producer", content: code,
queueBindings: [{name: "MY_QUEUE", queue: queue.id}],
});
// 消费者
const consumer = new cloudflare.WorkerScript("consumer", {
accountId, name: "consumer", content: code,
queueConsumers: [{queue: queue.name, maxBatchSize: 10, maxRetries: 3}],
});
```
## Pages 项目 (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 记录 (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 域名/路由
```typescript
// 路由 (基于模式)
const route = new cloudflare.WorkerRoute("my-route", {
zoneId: zoneId,
pattern: "example.com/api/*",
scriptName: worker.name,
});
// 域名 (专用子域名)
const domain = new cloudflare.WorkersDomain("my-domain", {
accountId: accountId,
hostname: "api.example.com",
service: worker.name,
zoneId: zoneId,
});
```
## 资产配置 (v6.x)
从 Workers 提供静态资产:
```typescript
const worker = new cloudflare.WorkerScript("app", {
accountId: accountId,
name: "my-app",
content: code,
assets: {
path: "./public", // 本地目录
// 资产已上传并由 Workers 提供服务
},
});
```
## v6.x 版本化部署 (高级)
对于渐进式发布,使用 3 资源模式:
```typescript
// 1. Worker (版本的容器)
const worker = new cloudflare.Worker("api", {
accountId: accountId,
name: "api-worker",
});
// 2. Version (不可变代码 + 配置)
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"],
// 注意:绑定在部署级别配置
});
// 3. Deployment (版本 + 绑定 + 流量拆分)
const deployment = new cloudflare.WorkersDeployment("prod", {
accountId: accountId,
workerId: worker.id,
versionId: version.id,
// 绑定应用于部署
kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}],
});
```
**何时使用:** 蓝绿部署、金丝雀发布、渐进式滚动更新
**何时不使用:** 简单的单版本部署(使用 WorkerScript)
---
参阅:[README.md](./README.md), [api.md](./api.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
数据来源:claude-code-templates(MIT),中文翻译由 AI 生成。详见关于我们。
粤公网安备44030002003366号