ข้ามไปเนื้อหาหลัก

Category: guide

Cloudflare Workers — Serverless บน Edge Network

คู่มือ Cloudflare Workers — เขียน serverless function ที่รันบน 300+ edge locations พร้อม KV, D1, R2 storage

· อ่านประมาณ 2 นาที

สารบัญ

Cloudflare Workers คืออะไร

Workers รัน JavaScript/TypeScript ใกล้ผู้ใช้ที่สุด (edge) — latency ต่ำกว่า serverless ทั่วไป เพราะไม่มี cold start และ network ใกล้ user

Worker พื้นฐาน

// src/index.ts
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);

    if (url.pathname === '/api/hello') {
      return Response.json({ message: 'สวัสดีจาก Edge!' });
    }

    return new Response('Not Found', { status: 404 });
  },
};

// type สำหรับ bindings
interface Env {
  KV_STORE: KVNamespace;
  DB:       D1Database;
  BUCKET:   R2Bucket;
}

Wrangler CLI

npm install -g wrangler
wrangler login
wrangler init my-worker
wrangler dev        # local dev
wrangler deploy     # deploy

KV Store — key-value storage

// wrangler.toml
// [[kv_namespaces]]
// binding = "KV_STORE"
// id = "..."

// อ่าน
const value = await env.KV_STORE.get('key');
const json  = await env.KV_STORE.get('data', { type: 'json' });

// เขียน
await env.KV_STORE.put('key', 'value', { expirationTtl: 3600 });

// ลบ
await env.KV_STORE.delete('key');

D1 — SQLite บน Edge

const result = await env.DB.prepare(
  'SELECT * FROM products WHERE category = ?'
).bind('exhaust').all();

console.log(result.results);  // typed rows

R2 — Object Storage (ไม่มี egress fee)

// อัพโหลด
await env.BUCKET.put('images/photo.jpg', imageData, {
  httpMetadata: { contentType: 'image/jpeg' },
});

// ดึง
const object = await env.BUCKET.get('images/photo.jpg');
if (!object) return new Response('Not Found', { status: 404 });

return new Response(object.body, {
  headers: { 'Content-Type': 'image/jpeg' },
});

Cron Triggers

// wrangler.toml
// [[triggers.crons]]
// crons = ["0 9 * * *"]  # ทุกวัน 09:00 UTC

export default {
  async scheduled(event: ScheduledEvent, env: Env) {
    await sendDailyReport(env);
  },
};

เมื่อไหร่ใช้ Workers

  • API ที่ต้องการ latency ต่ำ globally
  • Edge middleware (auth check, redirect, A/B test)
  • Background jobs ด้วย Queue
  • Image transformation ด้วย Workers Images

ข้อจำกัด: Workers รัน V8 isolate ไม่ใช่ Node.js — บาง npm package ที่ใช้ Node-only API อาจไม่ทำงาน