บันทึกการเชื่อมต่อ Google Cloud Storage ด้วย Go Part1(การดึงรูปภาพด้วย API)

Vorrawut Judasri
3 min readJul 31, 2019

--

วันนี้จะขอยกตัวอย่างและวิธีการ Implement เพื่อดึงรูปภาพที่เรามีอยู่ใน Google Cloud Storage ออกมาเพื่อส่งกลับไปให้ที่ฝั่งของหน้าบ้าน ด้วยภาษา golang นะครับ และ framework ที่ใช้อยู่คือ Echo นะครับ

สร้าง bucket เพื่อเก็บรูปไว้ด้านใน

ก่อนที่จะลงมือทำเราจะต้องสร้างหรือมี bucket ที่ไว้ใช้เก็บรูปก่อนนะครับ หลังจากนั้นก็ต้องคิดและออกแบบการเก็บรูปที่บน Google Cloud Storage กันก่อนนะครับว่าอยากเก็บด้วยสไตล์ไหนเพื่อตอบสนองต่อ requirement ของเรา โดยในท้ายที่สุดก็ได้ข้อสรุปว่าจะต้องทำการจัดเก็บตามชื่อของ รหัสของ user / + ตำแหน่งของรูปภาพหรือโฟว์เดอร์ที่จัดเก็บ และก็ตามด้วยชื่อรูปภาพหรือตัวรูปภาพนั่นเอง เช่น “113/profile/user_profile.png” เป็นต้น

รูปภาพและตำแหน่งของไฟล์รูป

หน้าตาและตำแหน่งของรูปภาพที่เราต้องการดึงเพื่อส่งไปประมวลผลที่ฝั่งหน้าบ้านนะครับ

ขั้นตอนการสร้าง API

เริ่มต้นเราจะทำการสร้าง api ที่จะใช้งานก่อนโดยการประกาศให้เป็น method: GET

สร้าง API ด้วย Method : GET

ถัดมาที่ต้องทำคือการสร้างฟังก์ชันชื่อว่า getImage ขึ้นมาโดยด้านในจะมีการดึงค่า userId ที่ของคนที่เรียกเข้ามา และมีการเรียกดึงค่า imagePath จาก queryParam มาใช้

การสร้างฟังก์ชันที่รับค่าจาก userId และ ImagePath เพื่อที่จะต้องใช้ในการดึงรูปตามตำแหน่งที่๔ุกต้อง

ใน scope ของกล่องสีแดงตามรูปด้านบนคือ ขั้นตอนในการตรวจสอบว่ารูปที่ส่งเข้ามาจะต้องถูก format ของการส่ง ซึ่งที่ตั้งไว้คือจะต้องเป็นเป็นไฟล์ .png เท่านั้น

imagePath ที่จะอ้างถึงรูปตาม pattern ที่เราได้กำหนดไว้

ส่วนต่อมาก็คือเราต้องทำการต่อ imagePath ที่ถูกต้องที่จะต้องใช้ในการอ้างถึงรูปที่เราต้องการเรียก ซึ่งก็คือ pattern ที่เรากำหนดไปก่อนหน้านี้นะครับ ให้เหมือนกับ “113/profile/user-profile.png” อันนี้นะครับ

โดยเราจะสร้าง context ที่ทำงานเป็น background เพื่อไว้ใช้ในการเชื่อมต่อกับ gcloud หลังจากนั้นก็จะทำการเชื่อมต่อกับ Google Cloud Storage ด้วย command “storage.NewClient(ctx)” ด้วยการโยนค่า context ที่เราได้ประกาศไว้ก่อนหน้านะครับ อย่าลืมเช็คว่าเราเรียก storage ถูกตัวด้วย package อีกทีนะครับ

package ของ storage ที่เราจะต้องใช้งาน Google Cloud Storage

ต่อมาที่เราต้องทำก็คือการประกาศตัวแปรที่เป็นชื่อของ bucket ที่เราต้องการเรียก โดย bucket นั้นคือ ถังที่เราสร้างเมื่อตอนที่ต้องการใช้งาน Google cloud storage โดยจะต้องประกาศชื่อให้ตรงกันเท่านั้นนะครับ เพราะเมื่อชื่อไม่ตรงมันจะเกิด error ขึ้นทันทีเพราะว่าหาข้อมูลไม่เจอ

ประกาศชื่อ bucket ที่ต้องการเชื่อมต่อหรือเรียกถึง

หลังจากนั้นเราก็จะทำการร้องข้อไปทาง Google Cloud Storage ว่าเราอยากได้รูปจากถังตามชื่อที่เราได้ประกาศไว้และตำแหน่งของรูปตามที่ตั้งไว้และเรียกใช้การอ่านข้อมูลด้วย method NewReader เพื่อดึงข้อมูลรูปกลับมา ในกรณีที่เกิดความผิดพลาดขึ้นในตอนที่ร้องขอไปมันจะเข้า scope err ซึ่งจะ return error ไปให้ที่ฝั่งหน้าบ้าน โดยกรณีที่มันจะเกิด err ขึ้นได้นั้นจะมีด้วยกันหลักๆ คือ

  1. เมื่อเรียกไปแล้วและค้นพบว่าชื่อของ bucket ไม่ถูกต้องทำให้หาไม่เจอ
  2. ค่าของ imagePath ที่ส่งไปไม่ถูกต้องทำให้หารูปในถังไม่เจอ หรือเกิดจากการที่ไม่มีรูปอยู่ในถังแล้วทำให้หาไม่เจอ
เรียกฟังก์ชันเพื่อดึงข้อมูลของรูปกลับมาด้วย NewReader(ctx)

ในกรณีที่อ่านค่าได้ โดยจากรูปเราจะได้ค่ากลับมาในรูปของตัวแปร “rc” เพื่อเอาไปใช้โดยค่าที่ได้รับจะอยู่ในรูปของ *Reader

ข้อมูลของค่า rc ที่เราอ่านมาได้

โดยก่อนหน้าที่จะเอาค่าที่ได้ไปทำอย่างอื่นต่อต้องอย่าลืมปิด Reader ที่เราเปิดขึ้นด้วย โดยเมื่อเราสร้าง Reader เพื่อขออ่านค่าข้อมูลจาก gloud storage ในตอนที่อ่านก็จะมีการเชื่อมต่อค้างอยู่ตลอดไปถึงรูปนั้น เมื่อเราอ่านค่าได้ผลลัพธ์กลับมาก็ควรที่จะสั่งปิดท่อเชื่อมต่อเหล่านั้นด้วย

สั่ง rc.Close() เพื่อปิดการเชื่อมต่อกับอีกฝั่งเมื่อได้รับข้อมูลแล้ว

เมื่อเราได้รับข้อมูลที่ดึงมาจาก Google Cloud Storage แล้วนั้น ต่อมาที่เราต้องทำก็คือ การแปลงค่าจาก Reader ให้อยู่ในรูปของข้อมูลที่เราเอาไปใช้ต่อได้ เราเลยใช้ ioutil.ReadAll และโยนข้อมูลที่เราได้รับมาเข้าไป ซึ่ง method ที่นำมาใช้งานนี้จะ return ออกมา 2 ค่า โดยจะมีค่า data และ error

การแปลงค่าจาก Reader ให้เป็นค่า data ที่จะนำไปใช้งาน

ค่า data ที่ได้รับมาจะอยู่ในรูปของ “[]byte” ซึ่งต่อมาเราจะต้องเอาค่านี้แหละส่งกลับไปให้ที่ฝั่งหน้าบ้านเพื่อแสดงผล โดยจะทำการสร้าง header ของ response เพื่อกำหนดค่าให้ตรงกับเงื่อนไขในการส่งรูปรวมถึงการเรียก method write() ด้วย data ที่เราได้รับมาจากการแปลงเป็น “[]byte” และสุดท้ายคือการเรียกคำสั่ง flush() เพื่อเป็นการส่ง response ที่เราพึ่งได้กำหนดค่านั้นออกไปในทันที

แสดงข้อมูลที่จำเป็นต้องตั้งค่าเพื่อใช้ในการ retrun response ออกไป

คราวนี้ก็มาถึงขั้นตอนการทดสอบ API ที่เราพึ่งได้สร้างไปกันนะครับ

โดยก่อนที่เราจะสั่ง gorun เพื่อให้ compile ตัว source code ของเรานั้น จะต้องมีการ export ตัว credential ที่ได้มากจาก Google cloud ด้วย ซึ่งการจะไปขอ credential นั้นจะต้อง login เข้าไปที่ Google cloud แล้วเข้าไปขอ generate credential เพื่อเอามาใช้ในการเรียกผ่าน api ก่อนนะครับ

เมนู IAM& admin เพื่อเข้ามา create service account

ก่อนอื่นเลยจะต้องเข้าไปที่เมนู IAM & admin เพื่อมาสร้าง Service account ที่ไว้ใช้เรียกผ่าน API กันก่อน แล้วกดปุ่มสร้าง service account

กดเลือก service account ที่เราพึ่งสร้างไปเพื่อทำการสร้าง key

หลังจากสร้างเสร็จแล้วก็ให้กดเข้าไปแก้ไข service account ที่เราได้เพิ่มไป แล้วเลือก Create key เพื่อที่จะใช้ในการเชื่อมต่อ

หน้าเลือกประเภทไฟล์ key ที่จะสร้าง

หลังจากที่กดสร้างก็จะได้ไฟล์ credential key ออกมา ซึ่งเราจะใช้ไฟล์ดังกล่าวในการเชื่อมต่อ โดยการใช้ command export จากไฟล์ดังกล่าว

หน้าตาของไฟล์ credential ที่ได้รับจาก Google cloud
ตัวอย่างการเรียก export credentials ของ Google cloud ที่ต้องทำครั้งแรกสุดก่อนที่จะสั่ง gorun

ทดลองยิง API ผ่าน Postman

ตัวอย่างการดึงรูปโดยเรียกผ่าน API ด้วย Postman

และข้อมูลของ response ที่เราได้ตั้งค่าไว้

ข้อมูลของ 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

--

--