[ PROMPT_NODE_24208 ]
Pulumi Cloudflare API 与数据源
[ SKILL_DOCUMENTATION ]
# API 与数据源
## 输出与导出
导出资源标识符:
```typescript
export const kvId = kv.id;
export const bucketName = bucket.name;
export const workerUrl = worker.subdomain;
export const dbId = db.id;
```
## 资源依赖
通过输出建立隐式依赖:
```typescript
const kv = new cloudflare.WorkersKvNamespace("kv", {
accountId: accountId,
title: "my-kv",
});
// Worker 依赖于 KV(通过 kv.id 隐式建立)
const worker = new cloudflare.WorkerScript("worker", {
accountId: accountId,
name: "my-worker",
content: code,
kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}], // 创建依赖关系
});
```
显式依赖:
```typescript
const migration = new command.local.Command("migration", {
create: pulumi.interpolate`wrangler d1 execute ${db.name} --file ./schema.sql`,
}, {dependsOn: [db]});
const worker = new cloudflare.WorkerScript("worker", {
accountId: accountId,
name: "worker",
content: code,
d1DatabaseBindings: [{name: "DB", databaseId: db.id}],
}, {dependsOn: [migration]}); // 确保迁移先运行
```
## 在 API 调用中使用输出
```typescript
const db = new cloudflare.D1Database("db", {accountId, name: "my-db"});
db.id.apply(async (dbId) => {
const response = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${accountId}/d1/database/${dbId}/query`,
{method: "POST", headers: {"Authorization": `Bearer ${apiToken}`, "Content-Type": "application/json"},
body: JSON.stringify({sql: "CREATE TABLE users (id INT)"})}
);
return response.json();
});
```
## 自定义动态提供者 (Custom Dynamic Providers)
针对提供者中未包含的资源:
```typescript
import * as pulumi from "@pulumi/pulumi";
class D1MigrationProvider implements pulumi.dynamic.ResourceProvider {
async create(inputs: any): Promise {
const response = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${inputs.accountId}/d1/database/${inputs.databaseId}/query`,
{method: "POST", headers: {"Authorization": `Bearer ${inputs.apiToken}`, "Content-Type": "application/json"},
body: JSON.stringify({sql: inputs.sql})}
);
return {id: `${inputs.databaseId}-${Date.now()}`, outs: await response.json()};
}
async update(id: string, olds: any, news: any): Promise {
if (olds.sql !== news.sql) await this.create(news);
return {};
}
async delete(id: string, props: any): Promise {}
}
class D1Migration extends pulumi.dynamic.Resource {
constructor(name: string, args: any, opts?: pulumi.CustomResourceOptions) {
super(new D1MigrationProvider(), name, args, opts);
}
}
const migration = new D1Migration("migration", {
accountId, databaseId: db.id, apiToken, sql: "CREATE TABLE users (id INT)",
}, {dependsOn: [db]});
```
## 数据源
**获取区域 (Zone):**
```typescript
const zone = cloudflare.getZone({name: "example.com"});
const zoneId = zone.then(z => z.id);
```
**获取账户(通过 API):**
直接使用 Cloudflare API 或自定义动态资源。
## 导入现有资源
```bash
# 导入 Worker
pulumi import cloudflare:index/workerScript:WorkerScript my-worker /
# 导入 KV 命名空间
pulumi import cloudflare:index/workersKvNamespace:WorkersKvNamespace my-kv
# 导入 R2 存储桶
pulumi import cloudflare:index/r2Bucket:R2Bucket my-bucket /
# 导入 D1 数据库
pulumi import cloudflare:index/d1Database:D1Database my-db /
# 导入 DNS 记录
pulumi import cloudflare:index/dnsRecord:DnsRecord my-record /
```
## 密钥管理
```typescript
import * as pulumi from "@pulumi/pulumi";
const config = new pulumi.Config();
const apiKey = config.requireSecret("apiKey"); // 在状态文件中加密存储
const worker = new cloudflare.WorkerScript("worker", {
accountId: accountId,
name: "my-worker",
content: code,
secretTextBindings: [{name: "API_KEY", text: apiKey}],
});
```
存储密钥:
```bash
pulumi config set --secret apiKey "secret-value"
```
## 转换模式 (Transform Pattern)
在创建前修改资源参数:
```typescript
import {Transform} from "@pulumi/pulumi";
interface BucketArgs {
accountId: pulumi.Input;
transform?: {bucket?: Transform};
}
function createBucket(name: string, args: BucketArgs) {
const bucketArgs: cloudflare.R2BucketArgs = {
accountId: args.accountId,
name: name,
location: "auto",
};
const finalArgs = args.transform?.bucket?.(bucketArgs) ?? bucketArgs;
return new cloudflare.R2Bucket(name, finalArgs);
}
```
## v6.x Worker 版本控制资源
**Worker** - 版本的容器:
```typescript
const worker = new cloudflare.Worker("api", {accountId, name: "api-worker"});
export const workerId = worker.id;
```
**WorkerVersion** - 不可变的代码与配置:
```typescript
const version = new cloudflare.WorkerVersion("v1", {
accountId, workerId: worker.id,
content: fs.readFileSync("./dist/worker.js", "utf8"),
compatibilityDate: "2025-01-01",
});
export const versionId = version.id;
```
**WorkersDeployment** - 带有绑定的活动部署:
```typescript
const deployment = new cloudflare.WorkersDeployment("prod", {
accountId, workerId: worker.id, versionId: version.id,
kvNamespaceBindings: [{name: "MY_KV", namespaceId: kv.id}],
});
```
**用途:** 高级部署(金丝雀、蓝绿部署)。大多数应用应使用 `WorkerScript`(自动版本控制)。
---
参阅:[README.md](./README.md), [configuration.md](./configuration.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
数据来源:claude-code-templates(MIT),中文翻译由 AI 生成。详见关于我们。
粤公网安备44030002003366号