บันทึกการเชื่อมต่อ Google Cloud Storage ด้วย Go Part1(การดึงรูปภาพด้วย API)
วันนี้จะขอยกตัวอย่างและวิธีการ Implement เพื่อดึงรูปภาพที่เรามีอยู่ใน Google Cloud Storage ออกมาเพื่อส่งกลับไปให้ที่ฝั่งของหน้าบ้าน ด้วยภาษา golang นะครับ และ framework ที่ใช้อยู่คือ Echo นะครับ
ก่อนที่จะลงมือทำเราจะต้องสร้างหรือมี bucket ที่ไว้ใช้เก็บรูปก่อนนะครับ หลังจากนั้นก็ต้องคิดและออกแบบการเก็บรูปที่บน Google Cloud Storage กันก่อนนะครับว่าอยากเก็บด้วยสไตล์ไหนเพื่อตอบสนองต่อ requirement ของเรา โดยในท้ายที่สุดก็ได้ข้อสรุปว่าจะต้องทำการจัดเก็บตามชื่อของ รหัสของ user / + ตำแหน่งของรูปภาพหรือโฟว์เดอร์ที่จัดเก็บ และก็ตามด้วยชื่อรูปภาพหรือตัวรูปภาพนั่นเอง เช่น “113/profile/user_profile.png” เป็นต้น
หน้าตาและตำแหน่งของรูปภาพที่เราต้องการดึงเพื่อส่งไปประมวลผลที่ฝั่งหน้าบ้านนะครับ
ขั้นตอนการสร้าง API
เริ่มต้นเราจะทำการสร้าง api ที่จะใช้งานก่อนโดยการประกาศให้เป็น method: GET
ถัดมาที่ต้องทำคือการสร้างฟังก์ชันชื่อว่า getImage ขึ้นมาโดยด้านในจะมีการดึงค่า userId ที่ของคนที่เรียกเข้ามา และมีการเรียกดึงค่า imagePath จาก queryParam มาใช้
ใน scope ของกล่องสีแดงตามรูปด้านบนคือ ขั้นตอนในการตรวจสอบว่ารูปที่ส่งเข้ามาจะต้องถูก format ของการส่ง ซึ่งที่ตั้งไว้คือจะต้องเป็นเป็นไฟล์ .png เท่านั้น
ส่วนต่อมาก็คือเราต้องทำการต่อ imagePath ที่ถูกต้องที่จะต้องใช้ในการอ้างถึงรูปที่เราต้องการเรียก ซึ่งก็คือ pattern ที่เรากำหนดไปก่อนหน้านี้นะครับ ให้เหมือนกับ “113/profile/user-profile.png” อันนี้นะครับ
โดยเราจะสร้าง context ที่ทำงานเป็น background เพื่อไว้ใช้ในการเชื่อมต่อกับ gcloud หลังจากนั้นก็จะทำการเชื่อมต่อกับ Google Cloud Storage ด้วย command “storage.NewClient(ctx)” ด้วยการโยนค่า context ที่เราได้ประกาศไว้ก่อนหน้านะครับ อย่าลืมเช็คว่าเราเรียก storage ถูกตัวด้วย package อีกทีนะครับ
ต่อมาที่เราต้องทำก็คือการประกาศตัวแปรที่เป็นชื่อของ bucket ที่เราต้องการเรียก โดย bucket นั้นคือ ถังที่เราสร้างเมื่อตอนที่ต้องการใช้งาน Google cloud storage โดยจะต้องประกาศชื่อให้ตรงกันเท่านั้นนะครับ เพราะเมื่อชื่อไม่ตรงมันจะเกิด error ขึ้นทันทีเพราะว่าหาข้อมูลไม่เจอ
หลังจากนั้นเราก็จะทำการร้องข้อไปทาง Google Cloud Storage ว่าเราอยากได้รูปจากถังตามชื่อที่เราได้ประกาศไว้และตำแหน่งของรูปตามที่ตั้งไว้และเรียกใช้การอ่านข้อมูลด้วย method NewReader เพื่อดึงข้อมูลรูปกลับมา ในกรณีที่เกิดความผิดพลาดขึ้นในตอนที่ร้องขอไปมันจะเข้า scope err ซึ่งจะ return error ไปให้ที่ฝั่งหน้าบ้าน โดยกรณีที่มันจะเกิด err ขึ้นได้นั้นจะมีด้วยกันหลักๆ คือ
- เมื่อเรียกไปแล้วและค้นพบว่าชื่อของ bucket ไม่ถูกต้องทำให้หาไม่เจอ
- ค่าของ imagePath ที่ส่งไปไม่ถูกต้องทำให้หารูปในถังไม่เจอ หรือเกิดจากการที่ไม่มีรูปอยู่ในถังแล้วทำให้หาไม่เจอ
ในกรณีที่อ่านค่าได้ โดยจากรูปเราจะได้ค่ากลับมาในรูปของตัวแปร “rc” เพื่อเอาไปใช้โดยค่าที่ได้รับจะอยู่ในรูปของ *Reader
โดยก่อนหน้าที่จะเอาค่าที่ได้ไปทำอย่างอื่นต่อต้องอย่าลืมปิด Reader ที่เราเปิดขึ้นด้วย โดยเมื่อเราสร้าง Reader เพื่อขออ่านค่าข้อมูลจาก gloud storage ในตอนที่อ่านก็จะมีการเชื่อมต่อค้างอยู่ตลอดไปถึงรูปนั้น เมื่อเราอ่านค่าได้ผลลัพธ์กลับมาก็ควรที่จะสั่งปิดท่อเชื่อมต่อเหล่านั้นด้วย
เมื่อเราได้รับข้อมูลที่ดึงมาจาก Google Cloud Storage แล้วนั้น ต่อมาที่เราต้องทำก็คือ การแปลงค่าจาก Reader ให้อยู่ในรูปของข้อมูลที่เราเอาไปใช้ต่อได้ เราเลยใช้ ioutil.ReadAll และโยนข้อมูลที่เราได้รับมาเข้าไป ซึ่ง method ที่นำมาใช้งานนี้จะ return ออกมา 2 ค่า โดยจะมีค่า data และ error
ค่า data ที่ได้รับมาจะอยู่ในรูปของ “[]byte” ซึ่งต่อมาเราจะต้องเอาค่านี้แหละส่งกลับไปให้ที่ฝั่งหน้าบ้านเพื่อแสดงผล โดยจะทำการสร้าง header ของ response เพื่อกำหนดค่าให้ตรงกับเงื่อนไขในการส่งรูปรวมถึงการเรียก method write() ด้วย data ที่เราได้รับมาจากการแปลงเป็น “[]byte” และสุดท้ายคือการเรียกคำสั่ง flush() เพื่อเป็นการส่ง response ที่เราพึ่งได้กำหนดค่านั้นออกไปในทันที
คราวนี้ก็มาถึงขั้นตอนการทดสอบ API ที่เราพึ่งได้สร้างไปกันนะครับ
โดยก่อนที่เราจะสั่ง gorun เพื่อให้ compile ตัว source code ของเรานั้น จะต้องมีการ export ตัว credential ที่ได้มากจาก Google cloud ด้วย ซึ่งการจะไปขอ credential นั้นจะต้อง login เข้าไปที่ Google cloud แล้วเข้าไปขอ generate credential เพื่อเอามาใช้ในการเรียกผ่าน api ก่อนนะครับ
ก่อนอื่นเลยจะต้องเข้าไปที่เมนู IAM & admin เพื่อมาสร้าง Service account ที่ไว้ใช้เรียกผ่าน API กันก่อน แล้วกดปุ่มสร้าง service account
หลังจากสร้างเสร็จแล้วก็ให้กดเข้าไปแก้ไข service account ที่เราได้เพิ่มไป แล้วเลือก Create key เพื่อที่จะใช้ในการเชื่อมต่อ
หลังจากที่กดสร้างก็จะได้ไฟล์ credential key ออกมา ซึ่งเราจะใช้ไฟล์ดังกล่าวในการเชื่อมต่อ โดยการใช้ command export จากไฟล์ดังกล่าว
ทดลองยิง API ผ่าน Postman
และข้อมูลของ response ที่เราได้ตั้งค่าไว้
จบแล้วนะครับสำหรับการสร้าง API เพื่อไปดึงรูปจาก Google Cloud Storage แล้วส่งกลับมาที่ฝั่งหน้าบ้าน สำหรับใครที่สนใจอยากศึกษาเพิ่มสามารถดูได้จาก document ของ golang และรายละเอียดของ google cloud storage ในการเชื่อมต่อได้ที่ด้านล่าง
https://godoc.org/cloud.google.com/go/storage
https://cloud.google.com/storage/docs/reference/libraries#client-libraries-usage-go