รู้จักกับ Cloud SQL
หัวข้อต่อจากนี้จะเป็นการเริ่ม Deploy service ขึ้น server ซึ่งผู้สอนจะขออนุญาตใช้ Google Cloud เนื่องจาก มีประสบการณ์อยู่แล้ว และ เป็น 1 ในวิธีที่ deploy ที่ง่ายที่สุดอีก 1 ตัวด้วย
จริงๆ หากใครมีประสบการณ์ deploy docker image > container กับตัวอื่นๆใน Service เจ้าอื่นๆอยู่แล้ว สามารถเลือกใช้เจ้าอื่นแทนได้เช่นกัน
Cloud SQL คืออะไร ?
Ref: https://cloud.google.com/sql/docs/introduction
Cloud SQL คือ fully-managed database service ทีี่สามารถ setup, maintain และจัดการ database ตระกูล SQL (relational database) ผ่าน Google Cloud Platform ได้ โดย Cloud SQL นั้นได้เตรียม SQL ประเภทต่างๆตั้งแต่ MySQL, PostgreSQL และ SQL Server โดยที่เราไม่ต้องกังวลกับการจัดการ database อะไรเลย ไม่ว่าจะเป็นเรื่อง hardward, patching, backup เพียงแค่กดสร้าง database ภายใน Cloud SQL เราก็จะได้ feature ของ database เหล่านั้นมาได้เลย โดยจุดเด่นๆของ Cloud SQL คือ
-
Fully Managed Cloud SQL สามารถดูแลได้หมดตั้งแต่การทำ replication, patch, backup
-
Compatibility Cloud SQL ใช้งานร่วมกับ MySQL, PostgreSQL กับ SQL Server ได้ (ซึ่งก็ถือว่าครอบคลุม SQL เจ้าใหญ่ๆข องโลกไว้แล้ว)
-
Scalability สามารถ scale ผ่าน Cloud SQL ได้เลยโดยการจัดการผ่านหน้า UI ของ Cloud SQL อย่างเดียว (ไม่ว่าจะเป็น scale up / down) โดยที่เราไม่ต้องกังวลเรื่องการจัดการเรื่องพวกนี้เลย (รวมถึง support พวก read replicas ด้วยในกรณีที่ใครต้องการ การจัดการ database แบบ horizoncal)
-
Security มี feature เรื่องของ Security อยู่แล้วตั้งแต่การ Encrypt data รวมถึงสามารถควบคุม network ผ่านการจัดการ Network security และ IAM สำหรับการทำ authentication และ authorization
-
Integration กับ GCP สามารถใช้งานร่วมกับ service อื่นๆของ GCP ได้แบบ seamless เช่น App Engine, Compute Engine, Google Kubernetes Engine (GKE)
-
Dashboard สามารถตรวจสอบ performance ของการ query และ insight ของตัว query ผ่าน Dashboard ของ Cloud SQL ได้
ในโจทย์ของหัวข้อนี้เราจะทำการสร้าง database SQL ตัว postgreSQL เหมือนกันกับที่เราสร้างใน docker-compose
ไว้ เพียงแต่จะมาสร้างผ่าน Cloud แทน เพื่อให้สามารถเรียกใช้งานจาก server ได้ ตอนที่ตัว web application ของเราขึ้น server เรีย บร้อยแล้ว
ทำการสร้าง Cloud SQL
(สำหรับใครที่พึ่งเริ่มต้นเลย) ให้สร้าง account Google Cloud และผูก Billing เอาไว้ผ่านตัว https://cloud.google.com/
หลังจากนั้นให้เปิด service Cloud SQL ขึ้นมา จะเจอหน้าจอประมาณนี้ออกมา ทำการกด "Create Instance" เพื่อเป็นการสร้างเครื่องของ database ขึ้นมา
หลังจากนั้นจะมี 3 ประเภทให้เลือก ให้เลือกเป็น "PostgreSQL"
หลังจากนั้นทำการตั้งชื่อและ password สำหรับ database
- เลือกใช้เป็น PostgreSQL ตัวล่าสุด (ซึ่งก็คือ PostgreSQL 15 ณ วันที่เขียนหัวข้อนี้)
- เลือกเป็น Enterprise (หรืออะไรก็ได้ที่เกี่ยวกับ development ในกรณีที่ UI ไม่เหมือนเดิมแล้ว) เพื่อเป็นการทดสอบเปิด Cloud SQL แบบ scale เล็กออกมาก่อน
ทำการเลือก spec ของ Cloud SQL ตามนี้ โดย
- เลือกใช้ 1 vCPU, 3.75 GB เนื่องจากเป็น scale เล็กสุดที่พอจะรัน postgreSQL ออกมาได้
- เลือก zone เป็น asia-southease1 (Singapore) เนื่องจากเป็น Data center ที่อยู่ใกล้ประเทศไทยมากที่สุด
หลังจากนั้น ให้ทำการเพิ่ม whitelist IP เพื่อให้เครื่อง local ของเราสามารถเรียกใช้งาน Cloud SQL จากเครื่อง local ได้
โดย IP ที่ต้องใส่นั้นจะต้องใส่เป็น Public IP จากเครื่องเราที่ internet มองเห็นอยู่ วิธีการที่ง่ายที่สุดคือเปิดจากเว็บไซต์นี้ https://checkip.amazonaws.com/
จะได้ Public IP ที่ internet มองเห็ นมายังเครื่องเรา เราสามารถหยิบ IP จากตัวนี้ไปใส่เพิ่มในหัวข้อ "Authorized Network" เพื่อเป็นการระบุเพิ่ม IP มาได้
- สำหรับใครที่เจอประเด็นเรื่องการใส่ IP สามารถใส่เป็น "0.0.0.0/0" เพื่อเป็นการ allow ทุก network ได้เช่นเดียวกัน (แต่ห้ามทำเด็ดขาดตอนขึ้น production งาน เพราะจะส่งผลทำให้ใครที่รู้ Public IP เราและ Credential เรา จะสามารถเข้าถึง database เราได้ทันที)
หลังจากนั้นทำการกด Create เพื่อสร้าง Cloud SQL ออกมา เมื่อไหร่ก็ตามที่ได้ dashboard และ Public IP ออกมาเรียบร้อย และขึ้นข้อความว่า create เสร็จแล้ว ถือว่าการสร้างนี้เสร็จแล้วเรียบร้อย
ทำการทดสอบเชื่อม Cloud SQL ด้วย pgAdmin
หลังจากสร้างเสร็จ เราจะได้ Public IP ออกมาให้นำ Public IP นี้กับ user (postgres), password (ที่เราตั้งตอน create database ขึ้นมา) มาใส่รวมกันที่ pgadmin ของ docker-compose ที่เรารันไว้อยู่
โดยถ้าไม่มีปัญหาอะไรเกิดขึ้น ต้องสามารถต่อเข้าไปยัง database ของ Cloud SQL ได้ ขึ้นเป็น connection ใหม่ใน pgadmin ออกมาได้
ทดสอบการต่อผ่าน GORM
ลองทำ public IP เดียวกันมาเปลี่ยน env ผ่าน GORM ให้เป็นลักษณะประมาณนี้ใน .env
DB_HOST=35.197.157.93
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD='4Dy%CU@cCTE}dX52'
DB_NAME=postgres
DB_HOST
= public IP ของ Cloud SQLDB_USER
,DB_PASSWORD
= user, password ของ Cloud SQLDB_NAME
= postgres (เป็น default ของ Cloud SQL)
ถ้าสามารถ start project และยิง API CRUD (เช่นลองยิงสร้าง user ผ่าน POST /users
) แล้วไม่ติดปัญหาอะไร แปลว่า connection ของ Cloud SQL นั้นสามารถใช้งานร่วมกับ GORM ได้เรียบร้อย ถือเป็นอันเสร็จสิ้นการสร้าง Cloud Database