Tunneling Firebase Emulator Suite

Suchit Pongnumkul
incubate.co.th
Published in
2 min readNov 4, 2020

เมื่อ ngrok ไม่ตอบโจทย์การใช้งาน Firebase Emulator Suite ก็ต้องย้ายค่ายไปซบอก jprq แทน

ไม่นานมานี้ Firebase ได้ออกตัว Emulator Suite มา ทำให้นักพัฒนาที่ใช้ Firebase อยู่สามารถทดสอบ code ภายในเครื่องของตัวเองได้โดยไม่จำเป็นต้อง deploy ไปที่ Firebase Server

ใน Emulator Suite จะประกอบด้วย

  • Firestore Emulator
  • Realtime Database Emulator
  • Functions Emulator
  • Hosting Emulator
  • Pub/Sub Emulator
  • และล่าสุดที่เพิ่งเปิดตัวไปคือ Auth Emulator
Firebase Emulator Suite รูปจาก https://firebase.google.com/docs/emulator-suite

ซึ่งแต่ละตัวก็จะใช้ port ต่างๆกัน ทำให้เวลาทำการทดสอบภายในเครื่องไม่มีปัญหาเรื่องการชนกันของ port แต่อย่างใด

แต่ๆๆๆ ถ้าต้องการให้คนอื่นทดสอบโปรแกรมที่เขียนอยู่ในเครื่อง หรือต้องมีการเชื่อมต่อกับระบบอื่นๆที่ต้องใช้ https request ผ่าน fixed uri ก็จะทำงานได้ไม่สะดวก ทำให้เกิดความจำเป็นต้องใช้ ngrok ขึ้น

นักพัฒนาหลายๆคน เวลาต้องการทดสอบเวป ระหว่างการเขียนโปรแกรม ไม่ว่าจะเป็น front-end หรือ back-end ก็จะใช้ ngrok ในการทำให้เครื่องคอมที่ตัวเองใช้งานอยู่สามารถเข้าถึงได้จาก internet ภายนอก ซึ่งเรียกวิธีนี้ว่า tunneling (ให้นึกถึงการขุดอุโมงเชื่อมโลกภายนอกเข้ามาที่เครื่องเรา ผ่าน Firewall หรือ ระบบเครือข่ายของบริษัท)

ตัวอย่าง case ที่ใช้งานกันบ่อยๆก็คือ “การใช้ ngrok เพื่อทดสอบ LINE bot” ตามทบทความของคุณหนึ่ง Sitthi Thiammekha LINE API Expert

หรือ ใช้ pyngrok บน Google Colab ของคุณ Korakot Chaovavanich

ซึ่งข้อดีของ ngrok คือ ใช้ง่าย และ ฟรี (เน้นตรงนี้!) ทำให้เป็นที่นิยมของนักพัฒนามากขึ้นเรื่อยๆ โดยสิ่งที่ ต้องทำเวลาใช้งาน ngrok ก็แค่สั่ง run ngrok และระบุ port ที่ต้องการเชื่อม แล้วก็จะได้ url ที่ทำให้ต่อเข้าเครื่องเราที่ port ที่ระบุได้

ปัญหาของ ngrok คือ ตัวฟรี ให้เปิดได้แค่ 4 tunnels ทำให้ไม่สามารถใช้กับตัว Firebase Emulator Suite ทั้งหมดพร้อมๆกันได้ ซึ่งถ้าเราจะใช้แค่ Functions เพื่อทำ chatbot หรือใช้แค่ hosting เพื่อเป็น web server ก็คงจะเพียงพอ แต่ถ้าต้องการใช้ Hosting ที่มีการ Authentication ด้วย CustomToken บน Functions เพื่อเขียนข้อมูลลง Firestore และ Realtime Database พร้อมๆกัน ก็จะไม่สามารถทำได้ ฟรีๆ อีกแล้ว (แต่สามารถจ่ายเงินเดือนละ $5 สำหรับ basic plan ได้เพิ่มเป็น 8 tunnels ก็พอจะทำได้)

หลังจากหาวิธีทดแทนมาสักพัก ก็ไปเจอ บทความ “How I build Ngrok Alternative” ของคุณ Azimjon Pulatov ที่ มีเนื้อหาอธิบายเกี่ยวกับการใช้ websocket ทำ tunneling โดยสามารถดูตัวอย่างได้จากวิดีโอข้างล่างนี้

นอกจากอธิบายการทำงานแล้ว ยัง opensource ทั้ง code ฝั่ง server (เขียนด้วย golang) และ client (เขียนด้วย python) และมี server รันให้ที่ jprq.live ด้วย

วิธีการใช้งานก็ง่ายมากคือ ทำการ install โปรแกรมด้วยคำสั่ง

pip3 install jprq

โดยจะต้องมี python3 อยู่ในเครื่องก่อน เมื่อลงโปรแกรมเสร็จแล้วให้สั่งรันด้วยคำสั่งjprq ตามด้วย เลข port ที่ต้องการเปิด เช่น

jprq 8080

สำหรับการเปิด port 8080

ซึ่งเมื่อรันแล้ว จะได้ผลออกมาคล้ายๆตัวอย่างข้างล่างนี้

Online at https://imaginative-suchit.jprq.live/

และสามารถเปิดเวปได้จาก url ที่แสดงผลไว้ ถ้าเปิด web server ไว้ที่ port 8080 โดยรูปแบบ uri จะเป็น random word คั้นด้วย - แล้วตามด้วย username ของระบบ เมื่อเปิดอันใหม่ ก็จะได้ random word คำใหม่

ถ้าหากว่าต้องการเปิดหลายๆ port ก็สามารถเปิดหลายๆ terminal หรือถ้าอยู่ใน bash ก็สามารถใส่ ‘&’ ไว้หลังเลข port เพื่อให้ทำงานใน background mode ได้ แบบนี้

jprq 8080 &

ทีนี้เราจะเปิดกี่ port ก็ตามใจเราแล้ว และเราจะได้ uri จำนวนเท่ากับ tunnel ที่เราเปิด เมื่อต้องการจะปิด tunnel ให้ ps ดู เลข process id แล้ว kill ทิ้งแทน

ทิ้งท้ายไว้ว่า python client ที่ได้มา ยังใช้งานยากอยู่ บทความหน้าจะมาเขียน nodejs client ให้ใช้งานง่ายขึ้น ใช้ความสามารถ Event Loop ทำให้เปิด port พร้อมๆกันได้หลาย port โดยไม่ต้องรันทีละครั้ง

--

--

Suchit Pongnumkul
incubate.co.th

LINE Certified Coach 2019 for API who studied Management of Technology and do development and consulting