จำลอง Amazon S3 ไว้ใช้ใน development และ test

Nuttavut Thongjor

ในนี้มีใครใช้ Amazon S3 เป็นที่เก็บข้อมูลบ้างยกมือขึ้นครับ? เอาหละทีนี้เปลี่ยนจากยกมือมาล้วงกระเป๋าตังค์บ้าง คุณจ่ายค่าบริการของบริการนี้ไปเท่าไหร่? ในส่วนหนึ่งของค่าใช้จ่ายนั้นมีบ้างไหมเป็นพื้นที่ไว้เก็บไฟล์ที่เราอัพโหลดเพื่อทดสอบบนเครื่อง development หรือรันเทส?

ปัญหาเรื่องเงินจิ๊บจ้อยเพราะเราคงไม่ได้ทดสอบการอัพโหลดไป S3 มากมายนัก แต่ที่หนักกว่าคือถ้าทีมคุณมีหลายคน ทดสอบการอัพโหลดไฟล์ในโหมด development ไปที่เดียวกัน เช่นอัพโหลด avatar ของ user ไปที่โฟลเดอร์ /users/:user_id/avatar เริ่มเห็นความวิบัติไหมครับ

นายเอเป็นพนักงานอาวุโสทำโปรเจคนี้มานานแล้ว ดังนั้น database ในโหมด development ของเขาจึงอุดมไปด้วยสารพัด user แต่ไม่ใช่สำหรับนายบีพนักงานหนุ่มที่พึ่งเริ่มโปรเจค การพึ่งเริ่มหมายความว่า database ของเขานั้นสะอาดมาก ไม่มี users ไหนอยู่เลยในฐานข้อมูล

นายบีเป็นคนขยันมากพอรู้ว่าต้องทำโปรเจคนี้ก็จัดแจงสร้าง user ขึ้นมาแล้วอัพโหลดรูปตนเองเป็น avatar แน่นอนว่ารูปของเขาขึ้นไปอยู่บน S3 เรียบร้อยแล้วที่โฟลเดอร์ /users/1/avatar ผ่านไป5นาที นายเอ เข้าเว็บเพื่อจะทดสอบโปรแกรม... เห้ยหน้าตูเปลี่ยนไป ในทางกลับกัน เมื่อนายบีสร้าง user คนที่2แต่ยังไม่ทันอัพโหลด avatar แต่...ก็มีรูป avatar โผล่มาซะงั้่น

นายเอและบีอยู่ทีมเดียวกัน ใช้ S3 เดียวกันบนโฟลเดอร์เดียวกัน จะอัพโหลดหรือลบอะไรก็กระทบกันเอง น่าปวดหัวและไม่สนุกถ้าเจอสถานการณ์เช่นนี้

แยกบัญชี AWS S3 กันไปเลย

ความคิดดีครับ...แต่ ใครจ่ายตังค์? ถ้าให้พนักงานมีบัญชีอเมซอนของตนเองไว้ทดสอบเอง โดนเรียกเก็บเป็นค่าบัตรเครดิตเท่าไหร่ให้เอามาเบิกกับบริษัท? หรือเจ้านายจะสร้าง Bucket ขึ้นมาซักสิบอันสำหรับพนักงานสิบคนดี? ไม่ว่าวิธีไหนก็ดูไม่น่าทำทั้งสิ้น

จำลองมันซิ

เมื่อทางออกที่ดีคือการไม่ใช้ร่วมกัน เราก็ต่างคนต่างมี S3 ของตนเองไปเลย แต่ไม่ใช่ด้วยการถือ AWS S3 คนละบัญชีนะ ในบทความนี้ผมจะแนะนำการจำลอง AWS S3 ขึ้นมาทำงานบน development และ test ด้วย fake-s3

เนื่องจากเครื่องมือนี้พัฒนาด้วยภาษา Ruby เราจึงต้องติดตั้งผ่าน Gem ดังนี้

Code
1gem install fakes3

ส่วนวิธีการรันก็แสนง่าย

Code
1fakes3 -r /mnt/fakes3_root -p 4567

เพียงเท่านี้คุณก็ได้ mini S3 ไว้ใช้งานแล้ว ประหยัดและสะดวกสบาย ไม่ต้องห่วงว่าไฟล์จะชนกับใคร คุณเพียงเปลี่ยน endpoint และ port จากเดิมที่ชี้ไปที่ AWS S3 ให้มาใช้ S3 ของคุณที่ http://localhost:4567 ทุกอย่างคือจบครับ สามารถดูวิธีการเชื่อมต่อได้ ที่นี่

โอ้ ผมพึ่งนึกขึ้นได้ fake-s3 เหมาะสำหรับ development และ test อย่านำไปใช้แทน AWS S3 บน production นะครับ!

สารบัญ

สารบัญ

  • แยกบัญชี AWS S3 กันไปเลย
  • จำลองมันซิ