R2
มันคืออะไร
ลองนึกภาพโกดังเก็บของขนาดใหญ่บนอินเทอร์เน็ต ที่คุณเอากล่องไฟล์ไปฝากไว้แล้วค่อยมาหยิบทีหลัง R2 คือบริการจัดเก็บออบเจกต์ (object storage) ของ Cloudflare — โกดังนั้นเอง — ที่ไว้เก็บไฟล์ต่างๆ เช่น รูปภาพ วิดีโอ ข้อมูลสำรอง ไฟล์ที่ผู้ใช้อัปโหลด หรือไฟล์ที่ได้จากการ build มันใช้ (Application Programming Interface — ชุดคำสั่งที่เครื่องมือต่างๆ ใช้คุยกับมัน) แบบเดียวกับ Amazon S3 ดังนั้นเครื่องมือและ SDK (Software Development Kits — ชุดโค้ดสำเร็จรูปสำหรับพัฒนา) ของ S3 ส่วนใหญ่จึงใช้งานกับมันได้เลยโดยไม่ต้องแก้ไข ความแตกต่างที่โดดเด่นที่สุดคือเรื่องราคา: R2 คิดค่าใช้จ่ายจากพื้นที่จัดเก็บและการดำเนินการ (operations) แต่ ไม่มีค่าธรรมเนียม egress (ไม่คิดเงินสำหรับข้อมูลที่ออกจากโกดัง) ดังนั้นการส่งข้อมูลออกจึงฟรี
จุดแข็ง
- ไม่มีค่าธรรมเนียม egress เลย — ประหยัดได้มากสำหรับแอปที่มีสื่อหนักๆ หรือให้ดาวน์โหลดบ่อยๆ
- API ที่เข้ากันได้กับ S3 ทำให้เครื่องมือและไลบรารีที่มีอยู่แล้วใช้งานได้ทันที
- เชื่อมต่อ (bind) เข้ากับ Worker ได้โดยตรงสำหรับการอ่านและเขียน โดยไม่ต้องมีข้อมูลรับรอง (credentials) ฝังอยู่ในโค้ด
- สามารถวางไว้หลัง CDN (Content Delivery Network — เครือข่ายเซิร์ฟเวอร์ทั่วโลกที่เก็บสำเนาไฟล์ไว้ใกล้ผู้เข้าชมแต่ละคน) ของ Cloudflare เพื่อการส่งข้อมูลที่รวดเร็วและมีแคช
- รองรับการขยายขนาดสำหรับออบเจกต์และบักเก็ตขนาดใหญ่โดยไม่ต้องตั้งค่าล่วงหน้า
ข้อแลกเปลี่ยน
- เป็นที่จัดเก็บออบเจกต์ ไม่ใช่ระบบไฟล์หรือฐานข้อมูล — ไม่สามารถค้นหาข้อมูลภายในไฟล์ได้
- การดำเนินการ (PUT/GET/LIST) มีค่าใช้จ่าย ดังนั้นรูปแบบการเข้าถึงที่เรียกใช้บ่อยๆ จะสะสมเป็นค่าใช้จ่ายที่มากขึ้น
- ความสอดคล้องของข้อมูล (consistency) และฟีเจอร์ต่างๆ มีรายละเอียดต่างจาก S3 อยู่บ้าง ควรตรวจสอบกรณีขอบ ( case) ให้ดี
- สำหรับค่าข้อมูลเล็กๆ ที่เปลี่ยนแปลงบ่อย KV (ที่เก็บข้อมูลแบบ key-value เหมือนพจนานุกรมขนาดยักษ์) หรือ D1 (ฐานข้อมูล ) จะเหมาะสมกว่า
เมื่อไหร่ควรใช้
ใช้ R2 สำหรับไฟล์ที่ผู้ใช้อัปโหลด ไฟล์ที่สร้างขึ้นเอง ไฟล์สแตติกขนาดใหญ่ การส่งออกข้อมูล (data exports) และข้อมูลสำรอง — โดยเฉพาะที่ใดก็ตามที่ค่าใช้จ่ายด้านแบนด์วิดท์บน S3 จะสร้างความเจ็บปวด
เข้ากับ vibe coding ได้ดีแค่ไหน
R2 เข้ากันได้ดีกับการสร้างงานที่ขับเคลื่อนโดย AI เพราะการเชื่อมต่อแบบ binding ช่วยตัดขั้นตอนวุ่นวายเรื่องข้อมูลรับรองแบบที่เคยเจอออกไป — เอเจนต์เขียนข้อมูลไปที่ env.BUCKET ได้โดยตรง บอกเอเจนต์ให้ชัดเจนว่าไฟล์เป็นแบบสาธารณะ (public — เสิร์ฟผ่าน Worker หรือโดเมนที่กำหนดเอง) หรือแบบส่วนตัว (private — เข้าถึงผ่านลิงก์ที่มีลายเซ็นรับรอง) เพื่อให้มันเชื่อมต่อการส่งข้อมูลได้ถูกต้อง ตัวอย่างด้านล่างแสดงการเชื่อมต่อบักเก็ตและอัปโหลดไฟล์จาก (Command Line Interface)
# wrangler.toml
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "uploads"
npx wrangler r2 bucket create uploads
npx wrangler r2 object put uploads/logo.png --file ./logo.png