ใช้ Line Messaging API กับ AWS API Gateway

Pao Payungsak Klinchampa
Next-Hop Co., Ltd.
Published in
3 min readJun 1, 2020
Line with AWS API Gateway

ใน Blog นี้ผมจะแนะนำ AWS API Gateway คร่าวๆ + วิธีเอาไปใช้กับ Line Messaging API หรือ Line bot นั่นล้ะฮะ

ซึ่งเจ้า AWS API Gateway โดยมากเเล้ว เราก็มักจะเอามาทำเป็น Gateway เพื่อให้ Request ผ่านเข้าไปยัง Node ที่ run อยู่ด้านหลัง สามารถทำ HTTPS Termination ได้ จะเอา AWS WAF มา Integrate เข้าไปเพื่อ filter request ขยะ หรือ request ที่เป็นอันตรายก็ได้ หรือเอามาใช้เพื่อความสะดวกในการเรียกใช้ API กรณีมี API เป็นจำนวนมาก ก็ใช้ Domain name เดียวกัน

ซึ่งผมเอาเองก็ใช้ AWS API Gateway มาทำ HTTPS Termination แล้วชี้ไปหา Origin Server ที่ใช้ NGINX และให้ NGINX ทำ Revers Proxy กลับไปหา Container ที่ run webhook อยู่ครับ

สำหรับการตั้งค่า ก็ไม่ได้ยากอะไรเลย เพียงเเค่เรากดสร้าง REST API Gateway แล้วก็กำหนด path ที่ใช้กับ webhook เลือก Origin เป็น HTTP Proxy เเล้วใส่ URL ที่ชี้กลับไปหา EC2 หรือเครื่องที่ run webhook อยู่ ประมาณนี้ครับ

มาดูการตั้งค่า Path กัน !!

สำหรับตัว Webhook ของผม ที่จำเป็นก็มีเเค่ /webhook ที่เป็น POST เเค่นี้ครับ ส่วน /healthz อันนี้ผมเอาไว้เช็คว่า Webhook ยังทำงานอยู่มั๊ย ตรงส่วนนี้ให้เรา Add Path ให้ตรงตามใน Code ที่เราเขียนไว้ครับ (หรือบน AWS มันจะเรียกว่า Resource) ผมเเนะนำให้ทำเเบบนี้นะ เพราะหากมี Request ที่เป็นขยะหรือไม่ตรงตาม Path / HTTP Method ที่เราตั้งไว้เข้ามา มันก็จะมาตายที่ AWS API Gateway เลย ไม่ต้อง Forward กลับไปหา webhook ที่เรา run อยู่บน Origin server ให้เปลือง resource โดยไม่จำเป็น

ต่อมาก็มาดูที่ /webhook POST กันหน่อย ว่าตั้งอะไรไว้บ้าง

ก็ตามภาพด้านบนครับ กำหนด Integration type เป็น HTTP เเล้วกำหนด URL ที่ชี้กลับไปยัง Origin server ที่ช่อง Endpoint URL

และอีกสิ่งนึงที่สำคัญคือ ตรงนี้ครับ

ในส่วนของ Method Request ให้เรากำหนด HTTP Header ที่เป็น Custom header ของ Line ด้วย โดยมันจะมีชื่อว่า x-line-signature ครับ แล้วก็กาถูกตรง Require ด้วย

ตรงนี้ถ้าไม่ทำ Request Header จะไม่ถูกส่งกลับไปถึง Origin Server นะครับ ถ้าเราเปิด Debug เอาไว้ เวลามี Request เข้ามา มันจะบอกว่า ไม่มี signature อะไรซักอย่างเเนบมาด้วย

หลังจากตั้งค่าเสร็จสิ้น ก็กด Deploy ครับ ตามนี้

มันก็จะมีหน้าต่างเด้งขึ้นมาให้เราเลือก stage ที่ต้องการ ถ้ายังไม่ได้สร้าง stage ก็สร้างใหม่ขึ้นมาเลย จากนั้นก็กดปุ่ม Deploy ครับ เพื่อให้ Config มัน Apply

และเมื่อสำเร็จ ระบบมันจะเเสดง URL ยาวๆมาให้เรา ซึ่งเราสามารถเอา URL ตัวนี้ไปใส่ใน Line Developer หรือ Line OA ได้เลย

แต่ถ้าเรามี Domain name เป็นของตัวเอง เราก็เอา Domain name ของเรานี่ล้ะครับ มา connect กับ AWS API Gateway ได้เลย โดยให้ไปที่ Custom domain name ครับ

ในตัวอย่างผมสร้างไว้เเล้ว มันเลยเเสดงขึ้นมา

ค่าที่เราต้องใส่ก็คือ ที่ช่อง Domain name ครับ อย่างของผมจะตั้งชื่อว่า api.mycompany.co.th อะไรประมาณนี้

ส่วนที่ Endpoint type มันมีสองแบบให้เลือกครับ ของผมเลือกเเบบ Regional เพราะใช้เเค่ในไทย กับให้ Line เรียกใช้ ไม่ได้เอามาใช้ทั้งโลก แต่ถ้าเลือกเป็น Edge-Optimized อันนี้มันจะเรียกใช้ CloudFront ที่เป็น CDN มาให้เราครับ

ส่วน TLS ก็เเนะนำให้ใช้ v1.2 ครับ

และก็เลือก Certificate ครับ โดยต้องเป็น Cert ที่ Valid ไม่เอาแบบที่ Gen เองนะ และถ้าใช้ AWS เเล้ว ไปกดขอ Cert Free ได้เลยที่ AWS Certificate Manager ได้เลย

หรือถ้าเราซื้อ Cert มาเอง ก็ไม่ว่ากัน ก็จัดการไป Import ก่อนให้เรียบร้อยที่ AWS Certificate Manager แล้วมาเลือกที่ตรงนี้

หลังจากสร้าง Custom domain name เรียบร้อย ก็เอาไป Map กับ Stage ที่สร้างเอาไว้ก่อนหน้าได้เลยครับ ตามภาพด้านล่าง

จากนั้นก็จัดการ Add CNAME Record ตามชื่อ domain ที่เราตั้ง เเล้วชี้มาที่ AWS API Gateway ได้เลย

ส่วนถ้าใช้ AWS Route53 เลือกเป็น A Record เเล้วเลือก Alise ก็ได้นะ

ถ้าเลือก Regional ก็จะเป็นค่าประมาณนี้

xxx1234a.execute-api.ap-southeast-1.amazonaws.com

ถ้าเป็น Edge-Optimized ก็จะมีหน้าตาแบบนี้

xxx1234a.cloudfront.net

หลังจากนั้น ก็เอา URL ไปกรอกใส่ Line OA / Line Developer ได้เลยครับ

เพียงเเค่นี้ ก็พร้อมใช้งานเเล้ว หากมี API อื่นๆก็สร้างเป็น Resource เพิ่มเข้ามาก็ได้ เวลาเรียกใช้จากข้างนอก ก็เป็น domain เดียวกัน ไม่ต้องจำเยอะ เเถมเป็น HTTPS เเล้วเรียบร้อยด้วย

หวังว่าจะมีประโยชน์นะครับ เเล้วพบกันใหม่ในบทความหน้าครับ

--

--