ตัวอย่างการใช้งาน SAM — Lambda และ Message Queue Event Source

Mart — Tanathip Viriya
2 min readJun 26, 2020

--

SAM ถือเป็น Serverless Application Model ที่ทําออกมาดีมากเลย มี template มากมายให้เลือกใช้ ทั้ง S3, Message Queue และ อื่นๆอีกมากมาย

โดยตัวอย่างนี้เราจะทํา 2 อย่างคือ

  1. เราจะสร้าง SAM — Lambda กับ Message Queue (SQS) แบบ FIFO
  2. เราจะสร้าง Simple Producer ตัวนึงคอยส่งค่าเข้าไปใน Queue ให้ Lambda ทํางาน

หน้าตา high level จะออกมาแบบนี้

High level

ทีนี้ถ้าเราใช้ SAM ขั้นตอนที่ 1 จะง่ายมากเลย เพราะมันมี template ที่ เราเอา event ไป hook ไว้ได้เหมือน S3 ในบทความก่อนๆได้เลย

https://github.com/howtoautomateinth/awesome-aws-workshop/blob/master/SQS/sqs-lambda-integration/template.yml

โดยใส่ type เป็น SQS แล้วเราก็แค่ referenec ไปที่ SQS resources ใน template ของเรา

https://github.com/howtoautomateinth/awesome-aws-workshop/blob/master/SQS/sqs-lambda-integration/template.yml

ซึ่งในบทความนี้อยากใช้ FIFO queue เลยกําหนด properties เพิ่มให้มันหน่อย

ทีนี้ถ้าเราต้องการจะดู message ที่อยู่ใน queue เราสามารถดูได้ง่ายๆด้วยการ view/delete feature บนหน้า console ตามรูปข้างล่าง แต่โดยปกติแล้วเราจะ polling ไม่เจออะไรหรอก เพราะว่าถ้าตัว application producer เราส่งไม่กี่ msg เข้า queue เวลาที่ lambda มันถูก trigger แล้วไป process มันเร็วกว่าที่เรา polling ใน console แน่ๆ

AWS SQS polling message view

เพราะฉะนั้นไปดูผลลัพธ์ที่ cloudwatch จะดีกว่า ว่าหลัง Lambda process แล้วมันจะได้ผลอะไรออกมาบ้างนั้นเอง

Sample Cloudwatch logs from SQS

ซึ่งผลลัพธ์ใน CloudWatch จะถูกส่งมาจาก Producer ที่ส่งข้อมูลง่ายๆตามด้านล่างเลย

วิธีลองใช้งาน

  1. Clone repository https://github.com/howtoautomateinth/awesome-aws-workshop/tree/master/SQS/sqs-lambda-integration
  2. สั่ง sam package, sam deploy — guided
  3. แล้วก็ไปที่ https://github.com/howtoautomateinth/awesome-aws-workshop/tree/master/SQS/sqs-lambda-integration/sqs-app-producer สั่ง npm install
  4. ก่อนจะ produce message เข้า SQS ด้วยการ node index.js เราต้องเปลี่ยน QueueUrl ให้กับทาง NodeJs ก่อน เพราะที่มีอยู่ในไฟล์เป็นแค่ตัวอย่างที่ปิดไปแล้วนั้นเอง
  5. ไปดูผลลัพธ์ใน CloudWatch จะเห็น log แบบเดียวกับในรูป

Troubleshooting

  • ต้องระวังเรื่องของ sam package มันมักจะแปลงค่าของ GetAtt ผิดไปเป็น List แล้วเวลาเรา deploy มันจะ error เพราะ issues นี้
ใน template.yml ก่อน package
กลายเป็น list เฉย เลยต้องมาแก้ตรงนี้ก่อนจะ deploy
  • Queue name ถ้าเราจะกําหนดเป็น FIFO เราต้องใส่ suffix .fifo ในชื่อ queue name properties ด้วย

--

--