ทำ Line Message API บน AWS Lambda

มาทำความรู้จักและใช้งาน Line Message API บน AWS Lambda
Line and Lambda

สวัสดีครับ วันนี้เราจะมาทำ Line Message API บน AWS Lambda กัน แต่ก่อนอื่นเลย เราจะพูดถึง Line Message API กับ AWS Lambda ก่อน ว่าคืออะไร

Line Message API ก็คือ API ที่ทาง Line มีไว้ใช้สำหรับ Developer หรือนักพัฒนา โดยสามารถนำไปทำบอทหรือแจ้งเตือนต่าง ๆ ตามที่เราต้องการได้ ปัจจุบันเราสามารถใช้ SDK เพื่อความรวดเร็วในการพัฒนา สามารถเข้าไปดูได้ที่นี่

AWS Lambda คือ Serverless Computing หรือก็คือ การใช้งานโค้ดโดยที่ไม่ต้องสนใจเซิฟเวอร์ ดูแค่การทำงานของโค้ดก็พอ

เอาล่ะ น่าจะพอเข้าใจคร่าว ๆ แล้ว ใครยังไม่มี Line กับ AWS ก็ไปสมัครมาก่อน ซึ่งตัว AWS มี Free Tier คือ ใช้งานฟรี ถ้าเกินจาก Free Tier ที่กำหนดถึงจะคิดเงิน ส่วนใหญ่แล้ว เริ่มต้นเราไม่น่าจะใช้งานถึงตามที่เค้ากำหนด โดยสามารถเข้าไปดูรายละเอียดของ AWS Lambda Free Tier ได้ที่นี่

ก่อนเริ่มต้น เราแนะนำว่าให้ผู้อ่านนั้นมี Python ไว้ในเครื่องด้วย เพื่อตอนหลังจะเป็นการนำ Dependency หรือ Package ขึ้นมาบนเซิฟเวอร์ แต่ถ้าต้องการทดสอบอย่างเดียวก็สามารถไปโหลด .zip ใน github ของโปรเจคตัวอย่างได้เลย

เริ่มต้น เรามาทำการสร้าง Line Message ก่อนเลย เพื่อทำการเก็บค่า Access Token กับ Channel Secret เพื่อเอาไว้ต่อ API

  • ไปที่ https://developers.line.biz/en/ เพื่อทำการ Login เข้าใช้งาน
  • ทำการสร้าง Provider ไว้สำหรับจัดการ จากในรูป ใช้ชื่อ Tichaky
Create provider for manage
  • ทำการเลือก Create a Message API channel
Create a Messaging API channel
  • ทำการกรอกข้อมูลให้ครบ
Create a new channel
  • ในแถบ Basic Setting ให้เราทำการเก็บค่า Channel Secret เอาไว้
Provider description
  • ไปที่แถบ Message API กด Issue แล้วเก็บค่า Access Token เอาไว้
Channel access token for provider

ต่อมาจะเป็นการทำ Serverless บน AWS Lambda กัน

Account AWS
  • บนแถบค้นหา ให้พิมพ์ไปว่า lambda แล้วคลิกเข้าไป
Menu lambda
  • ทำการคลิกที่ Create Function เพื่อทำการสร้าง Function
Create Function for AWS Lambda
  • ทำการกรอกและเลือกรายละเอียดต่าง ๆ ในที่นี้เราจะใช้ Python ก็เลือกดังรูป เสร็จแล้วก็คลิก Create Function
Description for Create function AWS Lambda

ในส่วนของ Create a new role with basic Lambda permissions นั้น ถ้าผู้อ่านมีการตั้งค่าส่วนนี้อยู่แล้ว ก็เลือกเป็น Use an existing role ได้เลย

แก้ไขใหม่ ณ 05/12/22 อาจมีการเปลี่ยนแปลงไปบ้าง โดยจะมีในส่วนของ Enable Funtion URL มาให้ เราต้องไปติ๊กเลือกเอง แต่ถ้าสร้างทีหลังเราสามารถเพิ่มได้โดยไปที่เมนู Configuration แล้วไปที่ Function URL แล้ว create เอา หรือบางทีอาจจะติดปัญหาเรื่องของ Permission ในการใช้งาน Invoke ของ FunctionURL ด้วย ยังไงก็ลองทดสอบดูก่อน เพราะบางทีถ้าเราติ๊กเลือกตอน Create Function มันจะมี Permission ติดมาด้วย อันนี้ที่เคยลองนะ

  • ใช้เวลาสักครู่ก็จะได้ Function มาใช้งาน ลองทดสอบได้เลย โดยคลิกไปที่ Function URL ได้เลย
Description function for AWS Lambda

เอาล่ะครับ ตอนนี้เราได้ Serverless Function มาใช้งานคร่าว ๆ แล้ว ต่อไปเราจะเริ่มการเขียนโค้ด โดยทาง Serverless นั้นก็มีโค้ดสำเร็จไว้ให้แล้ว ก็ไปที่ https://github.com/serverless/examples/blob/master/aws-python-line-echo-bot/handler.py แต่ทางเรามีการแก้ไขโค้ดจากนี้นิดหนึ่ง จะเป็นแบบนี้

import json
import os

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)


def lambda_handler(event, context):
    line_bot_api = LineBotApi(os.environ['YOUR_CHANNEL_ACCESS_TOKEN'])
    handler = WebhookHandler(os.environ['YOUR_CHANNEL_SECRET'])

    msg = json.loads(event['body'])

    line_bot_api.reply_message(
        msg['events'][0]['replyToken'],
        TextSendMessage(text=msg['events'][0]['message']['text'])
    )

    return {
        "statusCode": 200,
        "body": json.dumps({"message": 'ok'})
    }

เมื่อใส่โค้ดเสร็จทำการ Deploy แต่โค้ดจะยังใช้งานต้องไปตั้งค่าอื่นเพิ่มเติม

คลิกไปที่ Config เพื่อกำหนดค่า ENV (os.environ ในโค้ดจะเป็นการดึงค่าจากตัวแปรที่ฝังอยู่ในเครื่อง ป้องกันเรื่องความปลอดภัย ไม่ให้โทเคนหรือข้อมูลสำคัญไปอยู่ในโค้ด)

Go to configuration for Function AWS Lambda

คลิกที่ Environment variables

Go to Environment variables for function AWS Lambda

ทำการกด Edit เพื่อไปยังหน้าเพิ่มและแก้ไข Environment

Edit enviroment variables for Function AWS Lambda

ทำการเพิ่มตัวแปร YOUR_CHANNEL_ACCESS_TOKEN กับ YOUR_CHANNEL_SECRET และเอาค่าเก็บไว้จากข้างบนมาใส่แล้วกด Save

Edit enviroment variables for Function AWS Lambda

ต่อมาจะต้องทำการเพิ่ม Dependency หรือ Package ขึ้นไป เพราะทาง AWS Lambda เราเอาแค่ Source code เฉพาะส่วนของ Line ขึ้นไป แต่ยังไม่มี Dependency หรือ Package ให้มัน

เราสามารถเข้าไปดูได้ที่นี่ เพื่อต้องการดูวิธีเพิ่ม Dependency แบบต่าง ๆ ในที่นี้เราจะใช้วิธีการ .zip ขึ้นไป

เข้าไปที่ https://github.com/Tichakon/aws-lambda-python-line เพื่อทำการ Clone ลงมา

Github AWS Lambda Python Line

ผู้อ่านสามารถนำไฟล์ my-deployment-package.zip อัพโหลดบน AWS Lambda เลยก็ได้ แต่อาจจจะเป็นเวอร์ชั่นไม่ตรงกัน มีอีกวิธีหนึ่งก็คือเราต้องทำกับอัพเดท Package โดยลบโฟลเดอร์ Package ทิ้งไป แล้วใช้คำสั่งใน Command Line หรือ Terminal แต่ในเครื่องต้องติดตั้ง Python ไว้แล้วนะ

pip install --target ./package requests line-bot-sdk

จากคำสั่งด้านบนเป็นการโหลด Dependency หรือ Package ชื่อ requests และ line-bot-sdk มาไว้ในโฟลเดอร์ ./package จากนั้นใช้คำสั่ง

bash command.sh

คำสั่งนี้เป็นการรันไฟล์ที่เป็น .sh แล้วไฟล์ใน .sh มีอะไรบ้างนั้น เราไปดูกัน

rm -f my-deployment-package.zip
cd package
zip -r ../my-deployment-package.zip .
cd ..
zip -g my-deployment-package.zip lambda_function.py

เนื่องจากว่าถ้าเราไปดูใน Document ของ AWS จะพบว่าเค้าทำทีละบรรทัด ผู้เขียนเลยมัดรวมไว้เลย อธิบายโค้ดจะเป็นตามนี้

  • บรรทัดที่ 1 ทำการลบไฟล์ที่ชื่อว่า my-deployment-package.zip ทิ้งไป
  • บรรทัดที่ 2 เข้าไปในไฟล์ที่ชื่อว่า package
  • บรรทัดที่ 3 ทำการ zip ไฟล์ข้างในออกมาไว้ข้างนอก 1 ขั้น (1 ขั้นก็คือเหมือนประมาณว่า สมมติเราอยู่ใน Directory project เรา cd package แปลว่าตอนนี้เราเข้าไปอยู่ในโฟลเดอร์ package แล้วเราเอาไฟล์ออกมาข้างนอกหนึ่งขั้น ไฟล์เราก็จะมาอยู่ข้างนอก package ก็คือยังอยู่ใน project แต่อยู่ข้างนอก package)
  • บรรทัดที่ 4 ออกมาข้างนอก 1 ขั้น
  • บรรทัดที่ 5 ทำการซิฟไฟล์โดยเอา lambda_function.py มาใส่ใน my-deployment-package.zip ด้วย

การ Upload .zip ขึ้นไปมี 2 วิธีด้วยกัน คือ จาก Local หรือเครื่องเราขึ้นไปเลย หรืออัพโหลดขึ้น Awazon S3 ก่อน แล้วก็เลือก URL เอา ในที่นี้จะใช้จาก Local ขึ้นไป

สำหรับคนที่ต้องการอัพโหลดไฟล์จากใน โปรเจคขึ้นไปเลย ก็คือให้ใช้ไฟล์ my-deployment-package.zip แล้วคลิกที่ Upload from แล้วเลือก .zip file เอาไฟล์เราขึ้นไปก็เป็นอันเสร็จสิ้น

Upload package for Function AWS Lambda

ทำการทดสอบ เพิ่ม Line ที่เราสร้างขึ้นไป และทำการทดสอบ

Result line

สำหรับคนที่ต้องการ Dependency หรือ Package เวอร์ชั่นใหม่ก็ Clone โปรเจคลงมาก่อน แล้วใช้คำสั่งตามนี้ เพื่อเป็นการลง Package

pip install --target ./package requests line-bot-sdk

จากนั้นให้รันคำสั่ง command.sh เพื่อทำการลบ .zip อันเก่า รวม Package แล้วสร้าง .zip อันใหม่

bash command.sh

จากนั้นก็นำไฟล์อัปโหลดขึ้นบนเซิฟเวอร์ข้างบนและเทสได้เลย ก็เป็นอันเสร็จสิ้น

เสร็จแล้วครับ กับการสร้าง Line Message API ด้วย AWS Lambda ซึ่งเราสามารถนำไปทำเป็น Bot Line โดยที่ไม่ต้องเสียค่าใช้จ่ายค่าเซิฟเวอร์เลย (ถ้าใช้ไม่เกินนะ) สำหรับบทความนี้ก็พอแค่นี้ก่อนละกันครับ หากมีคำถามหรือข้อสงสัยสามารถสอบถามได้ทาง Email หรือทาง Social ที่ทางเว็บมีให้ครับ สำหรับวันนี้ สวัสดีครับ

ช่องทางการติดต่อ

Email: [email protected]

Website: https://blog.tichaky.com/

Facebook: https://www.facebook.com/tichaky

Youtube: https://www.youtube.com/@tichaky_diary

Medium: https://medium.com/@tichakon.bank

Post navigation

มาดู Droplets ของ DigitalOcean กัน

เชื่อมต่อ Twilio SMS เข้ากับ Logto

เริ่มต้นใช้งาน Docker กัน Part 2

ติดตั้ง Laravel ด้วย Docker กัน