ตอนประกาศ Ruby support บน AWS Lambda วานนี้ ผมตื่นเต้นจนลองทันที เราใช้ Lambda มานานที่ Honeybadger และผมรอเขียน functions ใน Ruby มานาน หลังเล่น Ruby support ใหม่ 몇 ชั่วโมง ผมมั่นใจว่าเราจะใช้เวลาน้อยลงกับ Node, Go, และ Python :)
ตัวอย่างเร็ว
AWS announcement blog post ทำให้ up และ running กับ Ruby on Lambda ได้เร็ว แต่ผมอยาก share example ใช้ Serverless framework deploy Ruby Lambda functions ผมพบว่า framework นี้ทำได้ fantastik job กำจัด annoyances ของ Lambda functions เวอร์ชันปัจจุบัน (1.34) ยังไม่มี template generation สำหรับ Ruby projects (PR merged สองชั่วโมงก่อนผมเขียน) แต่เริ่มได้ง่ายโดยไม่ต้อง generator นี่คือ sample config file สำหรับ walkthrough ฟังก์ชัน simple ที่ populate DynamoDB table ด้วย metadata ของ S3 objects ตอนถูกสร้าง:
Resources section ของ config สร้าง DynamoDB table ใหม่อัตโนมัติ และชื่อ table ใหม่วางใน environment variable สำหรับ function ซึ่งเราจะใช้ในโค้ด Function triggered by SNS events สำหรับ SNS topic ที่สร้างไว้ก่อนหน้า SNS topic นั้นได้ notifications สำหรับ PUT events บน S3 bucket ที่สร้าง manual
นี่คือ Ruby code:
โค้ดทำอะไรมากแค่ รับ SNS events loop ผ่าน records ใน SNS messages หา info ของแต่ละ S3 object ที่สร้าง ทำ HEAD request บน S3 object หา metadata ใส่ (create หรือ update) item ใน DynamoDB table dependency เดียวคือ AWS SDK ซึ่ง included ใน runtime environment ไม่ต้องกังวล Gemfile แต่ถ้ามี gems เพิ่มอยากนำมา ง่ายมาดูวิธี include additional gems พร้อมพูดถึง deployment
Deployment (การปรับใช้)
นำโค้ดสถานะนี้ไป Lambda ง่ายมาก ขอบคุณ Serverless framework:
sls deploy
คำสั่งเดียวนี้ทำทั้งหมด:
- Zip โค้ด
- วาง zip file บน S3
- Deploy function ใน Lambda (พร้อม environment variables และ SNS trigger)
- สร้าง IAM policies
- สร้าง DynamoDB table
Deploy เสร็จ สร้าง objects ใน bucket จะได้ items ใหม่ใน DynamoDB table
Dependencies (การพึ่งพา)
Include additional gem dependencies กับ deployed function ง่าย — สร้าง Gemfile เพิ่ม gems ที่อยาก bundle รัน bundle install --path vendor/bundle จะ bundle gems เข้า local directory และ zip รวมเข้า function พร้อมโค้ด
Caveat เดียวสำหรับ dependencies คือ gems ที่ต้อง C extension compile เนื่องจาก development environment ต่างจาก Lambda runtime ต้องทำเพิ่ม เพื่อ compile extensions ให้ทำงานใน AWS ขอบคุณ lambci Docker images และ Docker image ผมสร้างบน Ruby image ของพวกเขา ไม่ยาก มา bundle dependencies และ compile ให้ถูกต้อง รัน docker image ของผม:
docker run --rm -v $(pwd):/var/task stympy/lambda-ruby2.5
มันแค่รัน bundler command line ข้างบน gems จะวางใน vendor/bundle พร้อมเข้า ZIP file ที่สร้างโดย deploy command
พร้อมแล้ว หวังว่าคุณจะ enjoy รัน Ruby ใน Lambda เท่าผม :)