AWS CloudFormation—Lambda & SAM

Mart — Tanathip Viriya
3 min readJun 16, 2020

--

หลังจากเราเรียนรู้เรื่อง Lambda 101 กันไปแล้วในบทความข้างล่างนี้

วันนี้มาเรียนรู้เรื่องการสร้าว Lambda ด้วย CloudFormation และ รวมไปถึงการใช้งานของ SAM หรือชื่อย่อของ AWS Serverless Application Model กัน ซึ่งมันเป็นเครื่องมือตัวนึงที่ช่วยให้สามารถบริหารจัดการ Serverless ได้อย่างง่ายดาย (เหมือน version CloudFormation ที่สร้างมาเพื่อใช้จัดการพวก Serverless โดยเฉพาะได้แก่ API Gateway, Lambda, etc.)

Lambda in action — Overview

ก่อนจะเริ่มกับ SAM เรามาเรียนรู้ Lambda กันก่อนว่าเวลาเขียนโค้ดขึ้นไปทํางานบน Lambda ต้องทําอย่างไรบ้างเพื่อที่เวลาเราอ่าน document จะได้รู้ว่าต้องหยิบตัวไหนขึ้นมาใช้งานบ้าง

  • Function
    เป็น resource ที่เราจะใช้ในการรัน code ของเราบน AWS Lambda โดย Function นี้จะทําหน้าที่จัดการกับ event และ runtimes
  • Runtime
    Lambda runtime เป็นเครื่องมือที่ช่วยให้เราสามารถรัน programming language หลายๆแบบบน environment เดียวกันได้ เพราะฉะนั้นสิ่งเดียวที่ต้องทําก็คือ set runtime ให้เป็น programming language ที่เราใช้นั้นเอง (เป็นตัวกลางที่จัดการ Lambda Service และ Function code เรานั้นเอง)
sample Lambda function code
  • Event
    ส่วน Event คือ JSON document เก็บข้อมูลที่ต้องใช้ในการ process โดย Lambda Runtime แปลง event เป็น object แล้วส่งเข้ามาใน function code ของเรา นั้นเลยเป็นเหตุผลที่เราจะต้องรับ event เป็น parameter เสมอ

CloudFormation with Lambda

เรามาเริ่มกับ CFN Lambda แบบเบสิคสุดๆๆๆก่อนเลย ด้วยการสร้าง Lambda Function ธรรมดาๆก่อนเลย และ อย่างที่บอกเสมอ การเรียนรู้ที่ดีที่สุดคือการ

Get Your Hand Dirty

เพราะฉะนั้นลองเล่นกัน เอา template ไปสร้าง stack แล้วไล่ดูนะ

File: https://hta-cloudformation-bucket.s3.amazonaws.com/serverless/create-lambda.json

โดยการจะใช้ CloudFormation Lambda เนี่ยมีจุดใหญ่ๆๆอยู่แค่ 2 เรื่องคือ

  • code application เราต้องเอาไปฝาก S3 ไว้เพราะ CloudFormation จะดึงลงมาจากตรงนั้น
  • Role ที่จะสร้างให้กับ Lambda ของเรา ได้สร้างหรือยัง?
Sample Lambda Role

ซึ่งจากรูป จะเห็นว่าจริงๆแล้ว Role มันจะประกอบด้วย 2 อย่างง่ายๆเลย ก็คือ AWS Service ตัวนึงชื่อ Security Token Service ที่เราระบุ service ที่จะให้ทํา assume role ไว้ กับ policy ที่เรา attach ว่าจะให้ Service ของเราทําอะไรได้บ้างนั้นเอง

แล้วที่เหลือก็แค่ไปใช้ Lambda Resources ก็จะได้ Lambda function ละ

เพราะสิ่งที่เหลือคือแค่ config handler และ ระบุ runtime ให้ lambda ซึ่งไม่ต้องใช้อะไรพิเศษแบบ 2 ตัวบน

ทีนี้สมมุติว่าถ้าเราต้องการที่จะจับ Lambda เข้าไปใส่ใน vpc ที่เจาะจงละ? AWS ก็เตรียม Properties ที่ชื่อว่า VpcConfig ไว้ให้ละ ซึ่งจะทําหน้าที่ในการ attach Lambda ของเราเข้าไปให้ โดยเราต้องมีสองสิ่งคือ Security Group และ SubnetIds เท่านั้นเอง

ตัวอย่าง CFN Template อยู่ด้านล่างนี้

File: https://hta-cloudformation-bucket.s3.amazonaws.com/serverless/create-lambda-specific-vpc.json

AWS SAM คือ?

หลังจากลองเล่น Lambda ซึ่งเป็น 1 ใน Serverless ของ AWS แล้ว เรามาลองเข้าใจกับ AWS Serverless Application Model (AWS SAM) ที่เป็น open-source framework ที่มีไว้ช่วยให้เราสร้าง serverless application บน AWS

AWS SAM ประกอบด้วย 2 อย่างคือ

  • SAM template specification ซึ่งมีหน้าที่ในการจัดการ serverless application ของเรา ให้นึกถึงเรื่องของ CloudFormation มันจะมีรูปแบบหน้าตาเหมือนกันเลย เพียงแต่ใน template ของ SAM จะมีการระบุ transform ไว้ให้เป็น AWS::Serverless-2016–10–31 ไว้
  • SAM command-line interface เป็น tool ที่ช่วยให้เรา build, deploy serverless application ของเรา หรือแม้แต่ลอง test SAM application ของเรา local ได้ ด้วยการใช้ Docker image รันบน local machine

หน้าตาของ SAM?

Cloudformation สามารถเขียน template ได้ทั้ง json และ yaml ส่วน SAM จะ support แต่ yaml อย่างเดียว

จะเห็นว่าเหมือน Cloudformation เกือบทุกอย่าง มีการประกาศ resource เพื่อนํามาใช้และอื่นๆๆ เพียงแค่เราต้อง Transform เท่านั้นเอง

AWS SAM ทํางานยังไง?

สิ่งที่ SAM ทําคือมันจะไป deploy Cloudformation stack นั้นแหละ เพื่อที่ทําการควบคุม resource ของเราอีกที โดยไปสร้างพวก Role และ อื่นๆเพื่อไว้ใช้งาน interact resource ต่างๆ รวมไปถึงสร้าง S3 bucket เพื่อเก็บโค้ดเราไว้อีกด้วย

AWS SAM CLI Command Reference

ซึ่ง SAM ก็มี built-in command เตรียมไว้ให้เราช่วยสร้างโปรเจคไว้ให้เพียบเลย

https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html

เช่น สมมุติถ้าเราใช้ init มันก็จะสร้าง CloudFormation และ EventHandler ของ Lambda ให้เราพร้อมใช้งานเลย โดยมันจะคอยถามว่าเราจะสร้างอะไรเป็น guide เข้าไป เช่น

Sample SAM initial guide

ข้อเสียที่เห็นชัดๆๆคือไม่ใส่เรื่องของ Delete/undeploy ไว้ให้กับ AWS SAM CLI ทําให้เราต้องไป delete stack เองจาก Cloudformation

ใช้ตัวไหนดี?

จริงๆๆมันก็คือเครื่องมือตัวเดียวกัน Cloudformation เพียงแค่มันอาจจะ wrap ขั้นตอนต่างๆๆของเราไว้แล้ว ทําให้ช่วยลดเวลา แถมยัง local test ได้อีกด้วย ส่วนตัวใช้ SAM อาจจะง่ายต่อการจัดการมากกว่าเขียนเองใหม่จากศูนย์เลย

เพียงแต่เริ่มแรกสําหรับมือใหม่เริ่มเขียนจากศูนย์จะดีกว่า ไม่งั้นจะไล่ flow ไม่เป็น

--

--