วิธีใช้ Cloudflare R2 ร่วมกับ Supabase Edge Functions เพื่อจัดเก็บไฟล์แบบปลอดภัยบน Edge

ที่มาภาพ: Unknown Source

วิธีใช้ Cloudflare R2 ร่วมกับ Supabase Edge Functions เพื่อจัดเก็บไฟล์แบบปลอดภัยบน Edge

⚡ สรุป 30 วิ

การจัดเก็บไฟล์บน Edge ช่วยลด latency และเพิ่มความปลอดภัยให้กับแอปพลิเคชันของคุณ Supabase Edge Functions เป็นจุดเชื่อมต่อระหว่างฟรอนท์เอนด์และบริการคลาวด์ Cloudflare R2 ให้พื้นที่จัดเก็บแบบไม่มีค่า egr…

Overview — Overview

การจัดเก็บไฟล์บน Edge ช่วยลด latency และเพิ่มความปลอดภัยให้กับแอปพลิเคชันของคุณ Supabase Edge Functions เป็นจุดเชื่อมต่อระหว่างฟรอนท์เอนด์และบริการคลาวด์ Cloudflare R2 ให้พื้นที่จัดเก็บแบบไม่มีค่า egress fee บนเครือข่าย CDN ที่กระจายทั่วโลก บทความนี้จะสรุปวิธีตั้งค่า R2 ร่วมกับ Edge Functions อย่างเป็นขั้นตอน และชี้แนวทางรักษาความปลอดภัยสูงสุด

Why Combine Cloudflare R2 & Supabase Edge Functions — WhyCombine

การใช้สองบริการร่วมกันให้คุณได้ข้อดีหลายประการ

  • **Latency ต่ำ: ฟังก์ชันทำงานที่ตำแหน่งใกล้ผู้ใช้ที่สุด ส่งไฟล์โดยตรงจาก R2 ที่อยู่บน CDN
  • **ค่าใช้จ่ายคงที่: R2 ไม่เรียกเก็บค่า egress ทำให้ต้นทุนลดลงเมื่อมีการดาวน์โหลดจำนวนมาก
  • **ความปลอดภัยแบบ Zero‑Trust: คีย์ลับจัดเก็บใน Supabase Secrets จึงไม่ต้องฝังไว้ในโค้ด
  • **สเกลอัตโนมัติ: ทั้งสองบริการรองรับปริมาณการร้องขอระดับโลกโดยไม่มีการตั้งค่าเพิ่มเติม
Tip: หากคุณมีแค่ไฟล์สื่อ (ภาพ‑วิดีโอ) หรือเอกสารที่ต้องการให้ผู้ใช้ดาวน์โหลดเร็ว ๆ ควรเลือกโซลูชันนี้เป็นอันดับแรก

Prerequisites — Prereqs

ก่อนลงมือทำขั้นตอนต่อไป คุณควรมีสิ่งเหล่านี้

  • บัญชี Supabase และโครงการที่เปิดใช้งาน Edge Functions
  • บัญชี Cloudflare พร้อมโดเมนหรือ subdomain ที่ผูกกับ R2 bucket
  • ความรู้พื้นฐานเกี่ยวกับ JavaScript/TypeScript และการเรียก API ด้วย fetch

Step‑by‑Step Setup — Setup

1. Create a Cloudflare R2 Bucket — CreateBucket

สร้าง bucket บน R2 เพื่อเป็นที่เก็บไฟล์ของคุณ

  • เข้าสู่หน้า Dashboard ของ Cloudflare R2 Create Bucket
  • ตั้งชื่อ bucket (เช่น `my‑app‑assets`) และเลือก Region ใกล้ผู้ใช้หลัก
  • จดบันทึก Account ID, Bucket Name, Access Key ID และ Secret Access Key

2. Store R2 Credentials in Supabase Secrets — StoreSecrets

เก็บคีย์อย่างปลอดภัยเพื่อให้ Edge Functions ใช้งานได้

  • ไปที่ Supabase Dashboard Settings API Environment Variables
  • เพิ่มตัวแปร: `R2_ACCOUNT_ID`, `R2_ACCESS_KEY_ID`, `R2_SECRET_ACCESS_KEY`
  • กำหนดค่าเป็นค่าส่วนตัว (private) เพื่อไม่ให้เปิดเผยต่อสาธารณะ

3. Write the Edge Function — WriteFunction

สร้างฟังก์ชันเพื่ออัปโหลดและดาวน์โหลดไฟล์จาก R2

```ts // supabase/functions/upload-file.ts import { serve } from "https://deno.land/x/sift/mod.ts";

serve(async (req) => { const url = new URL(req.url); if (url.pathname !== "/upload") return new Response("Not Found", { status: 404 });

// ตรวจสอบวิธีการ POST if (req.method !== "POST") return new Response("Method Not Allowed", { status: 405 });

const form = await req.formData(); const file = form.get("file") as File; if (!file) return new Response("File missing", { status: 400 });

// ดึงคีย์จาก Secrets const accountId = Deno.env.get("R2_ACCOUNT_ID"); const accessKey = Deno.env.get("R2_ACCESS_KEY_ID"); const secretKey = Deno.env.get("R2_SECRET_ACCESS_KEY");

// สร้าง URL ของ R2 (ใช้ S3‑compatible API) const r2Url = `https://${accountId}.r2.cloudflarestorage.com/${process.env.BUCKET_NAME}/${file.name}`;

const uploadRes = await fetch(r2Url, { method: "PUT", headers: { "Authorization": `AWS ${accessKey}:${secretKey}`, "Content-Type": file.type, "Cache-Controlpublic, max-age=31536000" }, body: file.stream(), });

if (!uploadRes.ok) return new Response("Upload failed", { status: 500 }); return new Response(JSON.stringify({ url: r2Url }), { headers: { "Content-Typeapplication/json" } }); }); ```

  • บันทึกไฟล์ในโฟลเดอร์ `functions/` ของ Supabase โปรเจค
  • ใช้คำสั่ง `supabase functions deploy upload-file` เพื่อนำไปใช้งาน

4. Create a Public Endpoint for Download — DownloadEndpoint

เพิ่มฟังก์ชันหรือใช้ URL โดยตรงจาก R2 เพื่อให้ผู้ใช้ดาวน์โหลดไฟล์

  • หากต้องการควบคุมการเข้าถึง ให้สร้าง Edge Function อีกตัวหนึ่งตรวจสอบ JWT ก่อนทำ redirect ไปยัง URL ของ R2
  • ตัวอย่างโค้ดสั้น ๆ

```ts serve(async (req) => { const token = req.headers.get("Authorization")?.split()[1]; // ตรวจสอบ token ด้วย Supabase Auth if (!await verifyToken(token)) return new Response("Unauthorized", { status: 401 });

const url = new URL(req.url); const filename = url.searchParams.get("file"); const r2Url = `https://${Deno.env.get("R2_ACCOUNT_ID")}.r2.cloudflarestorage.com/${process.env.BUCKET_NAME}/${filename}`; return Response.redirect(r2Url, 302); }); ```

5. Test End‑to‑End Flow — Test

ตรวจสอบว่าไฟล์อัปโหลดสำเร็จและสามารถดาวน์โหลดจาก Edge ได้

  • ใช้ Postman หรือ cURL ส่ง `multipart/form-data` ไปยัง `/upload`
  • รับ URL ของไฟล์ที่ตอบกลับ แล้วเปิดในเบราว์เซอร์ ตรวจสอบ latency และ cache header
Tip: เปิด DevTools Network เพื่อดูค่า `cf-cache-status` ควรเป็น `HIT` หลังจากครั้งแรก

Security Best Practices — Security

การรักษาความปลอดภัยของไฟล์บน Edge ต้องคำนึงถึงหลายมิติ

  • **ใช้ Secrets เท่านั้น: อย่าเก็บ Access Key ไว้ในโค้ดหรือ environment ของ client
  • **ตั้งค่า CORS ให้เข้มงวด: จำกัด origin ที่สามารถอัปโหลด/ดาวน์โหลดได้
  • **ทำการตรวจสอบประเภทไฟล์ (MIME) และขนาดไฟล์: ป้องกันการอัพโหลดสคริปต์อันตราย
  • **เปิดใช้งาน Object‑Level ACL: กำหนดให้ไฟล์ที่สำคัญเป็น `private` แล้วใช้ฟังก์ชันทำ signed URL เมื่อจำเป็น

Performance & Cost Comparison — Comparison

คุณลักษณะCloudflare R2Supabase Storage
**Latency (Edge)(CDN ทุกจุด)(ต้องผ่าน API ของ Supabase)
ค่า egressฟรี (ไม่มี charge)มีค่าใช้จ่ายต่อ GB ที่ส่งออก
การจัดการคีย์ต้องเก็บใน Secrets ของแอปจัดการโดย Supabase Auth เอง
รองรับ S3‑compatible APIใช่ไม่ (มี SDK เฉพาะ)
ราคา Storage/GB ต่อเดือน$0.015$0.025
Caution: หากต้องเก็บไฟล์ที่ต้องการความเป็นส่วนตัวสูง ควรใช้ R2 พร้อม signed URL แทนการทำให้ไฟล์เป็น public อย่างสมบูรณ์

Integration with Supabase Auth — AuthIntegration

เพื่อให้ผู้ใช้เข้าสู่ระบบก่อนอัปโหลดหรือดาวน์โหลดไฟล์ ให้ผสาน Edge Function กับ JWT ของ Supabase

  • ในฟังก์ชันตรวจสอบ token ด้วย `supabase.auth.api.getUserByCookie(req)` หรือเรียก `/auth/v1/user` ผ่าน service key
  • หากผู้ใช้ไม่มีสิทธิ์ ควรตอบกลับเป็น 403 Forbidden ทันที

Monitoring & Logging — Monitoring

การมอนิเตอร์ช่วยให้คุณตรวจพบปัญหาเร็วขึ้น

  • เปิด R2 Analytics ใน Cloudflare Dashboard เพื่อดูจำนวน request, ขนาดข้อมูลที่ส่งออก/เข้า
  • ใช้ Supabase Edge Functions Logs (ผ่าน dashboard หรือ CLI) เพื่อตรวจสอบ error ของฟังก์ชัน
  • ตั้งค่า webhook แจ้งเตือนเมื่ออัตราการ upload เกินเกณฑ์ที่กำหนด

Summary — Summary

การใช้ Cloudflare R2 ร่วมกับ Supabase Edge Functions ให้คุณสร้างระบบจัดเก็บไฟล์บน Edge ที่เร็ว ปลอดภัย และคุ้มค่าด้วยต้นทุนต่ำ

  • สร้าง bucket บน R2 แล้วเก็บ Credential ใน Supabase Secrets
  • เขียน Edge Function เพื่ออัปโหลด/ดาวน์โหลดโดยใช้ S3‑compatible API ของ R2
  • ตรวจสอบและบังคับใช้ security policy (CORS, MIME, signed URL)
  • ใช้ CDN ของ Cloudflare ลด latency ให้ผู้ใช้ทั่วโลกได้อย่างมีประสิทธิภาพ

สิ่งที่ควรจำ

  • เก็บคีย์ลับใน Secrets เท่านั้น
  • เปิด CORS เฉพาะโดเมนที่ต้องการ
  • ตรวจสอบ MIME และขนาดไฟล์ก่อนบันทึก
  • ใช้ signed URL สำหรับไฟล์ส่วนตัว
  • ติดตาม Log ของ R2 & Edge Functions อย่างสม่ำเสมอ

แชร์บทความนี้:

ชอบบทความแบบนี้?

สมัคร AI Automate Weekly Newsletter — รับเคล็ดลับ AI + how-to ใหม่
ทุกสัปดาห์ตรงถึง inbox ฟรี ไม่มีสแปม

แหล่งข่าวต้นฉบับ

ชื่อต้นฉบับ
วิธีใช้ Cloudflare R2 ร่วมกับ Supabase Edge Functions เพื่อจัดเก็บไฟล์แบบปลอดภัยบน Edge
ผู้เขียน
กองบรรณาธิการ Thai Tech News
แหล่ง
บทความต้นฉบับ Thai Tech News · ช่วยร่างด้วย AI, เรียบเรียง/ตรวจสอบโดยกองบรรณาธิการ
วันที่เผยแพร่
9 สิงหาคม 2569 เวลา 17:51

Related

บทความที่เกี่ยวข้อง

วิธีตั้งค่า Sandboxed Python Environment ด้วย pyenv‑virtualenv บน Windows เพื่อความปลอดภัยGrowth
21 สิงหาคม 2569 เวลา 18:30

วิธีตั้งค่า Sandboxed Python Environment ด้วย pyenv‑virtualenv บน Windows เพื่อความปลอดภัย

การสร้างสภาพแวดล้อม Python ที่ทำงานแบบ sandboxed ช่วยให้คุณรันโค้ดจากแหล่งที่ไม่เชื่อถือได้โดยไม่เสี่ยงต่อระบบหลักของ Windows ​คอมพิวเตอร์ ​บทความนี้จะแนะนำวิธีตั้งค่า **pyenv‑virtualenv** บน Windows…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ8 นาที
วิธีตั้งค่า Git Hook เพื่อตรวจสอบคุณภาพโค้ดก่อน Commit อย่างปลอดภัยGrowth
21 สิงหาคม 2569 เวลา 12:30

วิธีตั้งค่า Git Hook เพื่อตรวจสอบคุณภาพโค้ดก่อน Commit อย่างปลอดภัย

Git Hook คือสคริปต์ที่ทำงานอัตโนมัติเมื่อเกิดเหตุการณ์บางอย่างในระบบเวอร์ชันคอนโทรล เช่น `pre‑commit` หรือ `post‑merge` การใช้ Hook ช่วยให้เราตรวจสอบคุณภาพโค้ดก่อนที่การเปลี่ยนแปลงจะถูกบันทึกเข้าสู่ r…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ7 นาที
วิธีตั้งค่า Windows Terminal พร้อมโปรไฟล์ PowerShell เพื่อเพิ่มประสิทธิภาพการทำงานGrowth
21 สิงหาคม 2569 เวลา 11:00

วิธีตั้งค่า Windows Terminal พร้อมโปรไฟล์ PowerShell เพื่อเพิ่มประสิทธิภาพการทำงาน

การใช้ Windows Terminal ร่วมกับ PowerShell เป็นวิธีที่ทำให้การทำงานบนคอมพิวเตอร์เร็วขึ้นและเป็นระเบียบมากยิ่งขึ้น บทความนี้จะแนะนำขั้นตอนตั้งค่าโปรไฟล์ PowerShell อย่างละเอียด เพื่อเพิ่มประสิทธิภาพในก…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ7 นาที
วิธีเชื่อมต่อ Google Cloud BigQuery กับ Power BI โดยใช้ Direct Query อย่างปลอดภัยGrowth
20 สิงหาคม 2569 เวลา 18:30

วิธีเชื่อมต่อ Google Cloud BigQuery กับ Power BI โดยใช้ Direct Query อย่างปลอดภัย

การเชื่อมต่อ Google Cloud BigQuery กับ Power BI ด้วยโหมด **Direct Query** ช่วยให้ผู้ใช้สามารถดึงข้อมูลสดจากคลังข้อมูลขนาดใหญ่ได้โดยไม่ต้องทำการนำเข้าข้อมูลลงเครื่องมือ BI อีกครั้ง ทำให้งานรายงานเป็นแบ…

ต้นฉบับ TTN · ร่างด้วย AI ตรวจโดยบรรณาธิการ7 นาที
คัดลอกลิงก์แล้ว!