AWS SAM — Serverless Application Model
Serverless Application Model
01SAM คืออะไร & ความสัมพันธ์กับ CloudFormation
AWS SAM (Serverless Application Model) คือ framework แบบ open-source สำหรับสร้าง serverless application บน AWS (Lambda, API Gateway, DynamoDB, Step Functions ฯลฯ) จุดสำคัญที่ต้องจำคือ SAM เป็น extension ของ CloudFormation ไม่ใช่บริการแยก เราเขียน template สั้นๆ แบบ serverless แล้ว SAM จะ transform มันให้กลายเป็น CloudFormation resource เต็มรูปแบบตอน deploy
หัวใจคือ template ทุกไฟล์ต้องมีบรรทัด Transform: AWS::Serverless-2016-10-31 ซึ่งเป็น CloudFormation macro ที่บอกให้ engine ขยาย SAM syntax (เช่น 1 resource Function) ออกเป็นหลาย CloudFormation resource จริง (Lambda function + IAM Role + Log Group + API Gateway ฯลฯ)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31 # บรรทัดบังคับของ SAM
Description: Hello SAM
Resources:
HelloFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello/ # local path ตอน dev
Handler: app.handler
Runtime: nodejs20.x
Events:
Api:
Type: Api
Properties:
Path: /hello
Method: get- Transform: AWS::Serverless-2016-10-31 = ค่าคงที่ ต้องจำเป๊ะ (วันที่ 2016-10-31)
- SAM ใช้ engine ของ CloudFormation ทั้งหมด: stack, change set, rollback
- ผสม raw CloudFormation resource กับ SAM resource ในไฟล์เดียวได้
- ผลลัพธ์สุดท้ายคือ CloudFormation stack เสมอ
02SAM Resource Types ที่ต้องรู้
SAM มี resource type เฉพาะที่ขึ้นต้นด้วย AWS::Serverless:: ซึ่งย่อ resource หลายตัวให้เหลือสั้น แต่ละตัว map ไปยัง service ที่ต่างกัน
03Globals Section & Policy Templates
Globals — ลดการเขียนซ้ำ
Globals section ใช้กำหนดค่า default ที่ resource หลายตัวใช้ร่วมกัน รองรับ Function, Api, HttpApi, SimpleTable เช่นตั้ง Runtime/MemorySize/Timeout ของทุก Function ครั้งเดียว แล้ว resource แต่ละตัวยัง override ได้
Globals:
Function:
Runtime: nodejs20.x
Timeout: 30
MemorySize: 256
Environment:
Variables:
TABLE_NAME: !Ref MyTable
Api:
Cors: "'*'"Policy Templates — IAM แบบ least-privilege สำเร็จรูป
Policy Templates คือชุด IAM permission สำเร็จรูปที่ AWS scope ไว้แล้ว ใช้ใน property Policies ของ Function แค่ระบุชื่อ table/bucket ก็ได้สิทธิ์ที่จำเป็นแบบ least-privilege โดยไม่ต้องเขียน IAM policy เอง
MyFunction:
Type: AWS::Serverless::Function
Properties:
Handler: app.handler
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref MyTable
- S3ReadPolicy:
BucketName: my-bucket
- SQSSendMessagePolicy:
QueueName: !GetAtt MyQueue.QueueName- ตัวอย่าง template: DynamoDBCrudPolicy, DynamoDBReadPolicy, S3ReadPolicy, S3CrudPolicy, SQSSendMessagePolicy, SNSPublishMessagePolicy, LambdaInvokePolicy
- ลดความเสี่ยงให้สิทธิ์เกินจำเป็น (over-permissive)
- ยังใช้ raw IAM policy / managed policy ARN ผสมได้
04SAM CLI — Workflow หลัก
SAM CLI เป็นเครื่องมือ command-line สำหรับ init, build, package, deploy และ test ในเครื่อง ลำดับ workflow มาตรฐานที่ต้องจำคือ build -> package -> deploy
| คำสั่ง | หน้าที่ |
|---|---|
| sam init | สร้าง scaffold โปรเจกต์จาก starter template (เลือก runtime, package type Zip/Image) |
| sam build | คอมไพล์โค้ด + ติดตั้ง dependencies เป็น artifact ใน .aws-sam/ |
| sam package | zip artifact แล้วอัปขึ้น S3 (หรือ image ขึ้น ECR) + เขียน CodeUri ใหม่ชี้ S3 |
| sam deploy --guided | interactive wizard ถามค่า (stack/region/S3/capabilities) แล้วสร้าง/อัปเดต CloudFormation stack บันทึก samconfig.toml |
| sam logs --tail | ดึง CloudWatch Logs ของ Lambda แบบ real-time |
# เริ่มโปรเจกต์ใหม่
sam init
# build แล้ว deploy แบบ interactive ครั้งแรก
sam build
sam deploy --guided # ถาม stack name, region, S3 bucket, confirm changeset
# ครั้งต่อไป deploy ได้เลย (อ่านค่าเดิมจาก samconfig.toml)
sam deploy
# tail log
sam logs --stack-name my-stack --name MyFunction --tail05Local Testing & Packaging ขึ้น S3
SAM CLI ทดสอบ serverless app ในเครื่องได้ผ่าน Docker (จำลอง Lambda runtime) ทำให้ debug ก่อน deploy ได้เร็ว
| คำสั่ง | ใช้เมื่อไหร่ |
|---|---|
| sam local invoke | เรียก function เดียว 1 ครั้งด้วย event payload |
| sam local start-api | เปิด local HTTP server จำลอง API Gateway เรียกผ่าน curl/browser |
| sam local start-lambda | เปิด local endpoint จำลอง Lambda service ใช้กับ AWS SDK / integration test |
| sam local generate-event | สร้าง sample event payload (เช่น S3, SQS) สำหรับป้อนให้ invoke |
# จำลอง API Gateway บนเครื่อง (พอร์ต 3000)
sam local start-api
# เรียก function ครั้งเดียวด้วย event ที่ gen ขึ้น
sam local generate-event s3 put > event.json
sam local invoke MyFunction -e event.json
# เปิด local Lambda endpoint ให้ SDK เรียก
sam local start-lambdaPackaging ขึ้น S3
ตอน dev ในไฟล์ template CodeUri ชี้ local path เมื่อรัน sam package/deploy SAM จะ zip โค้ดอัปขึ้น S3 bucket แล้วเขียน packaged template ใหม่ให้ CodeUri เป็น S3 URI จากนั้น CloudFormation จึงดึง artifact จาก S3 ตอน deploy (กรณี container image จะอัปขึ้น ECR แทน)
06SAM + CodeDeploy: Gradual / Canary Deployment
SAM ผสานกับ CodeDeploy เพื่อทำ traffic shifting ของ Lambda แบบค่อยเป็นค่อยไป ลดความเสี่ยงเมื่อ deploy version ใหม่ มี 2 ส่วนสำคัญที่ต้องตั้งร่วมกัน
- AutoPublishAlias — สั่งให้ SAM publish Lambda version ใหม่ ทุกครั้งที่ deploy และชี้ alias ไปที่ version นั้น (จำเป็นต้องมีก่อน shift traffic ได้)
- DeploymentPreference — กำหนด รูปแบบ การ shift traffic (Type) และ Hooks สำหรับ validation
MyFunction:
Type: AWS::Serverless::Function
Properties:
Handler: app.handler
Runtime: nodejs20.x
AutoPublishAlias: live # จำเป็น! สร้าง version + alias
DeploymentPreference:
Type: Canary10Percent5Minutes
Alarms: # ถ้า alarm trigger -> rollback
- !Ref ErrorAlarm
Hooks:
PreTraffic: !Ref PreTrafficHookFn # validate ก่อน shift
PostTraffic: !Ref PostTrafficHookFn # validate หลัง shift| รูปแบบ | พฤติกรรม | ตัวอย่าง Type |
|---|---|---|
| Canary | ย้ายก้อนแรก รอ X นาที แล้วย้ายที่เหลือ 100% ทีเดียว | Canary10Percent5Minutes, Canary10Percent30Minutes |
| Linear | ย้ายเพิ่มเท่าๆ กันทุกช่วงเวลา | Linear10PercentEvery1Minute, Linear10PercentEvery10Minutes |
| AllAtOnce | ย้าย 100% ทันที (เสี่ยงสุด ไม่มี gradual) | AllAtOnce |
07SAM Accelerate & Serverless Application Repository (SAR)
SAM Accelerate (sam sync)
SAM Accelerate ลดเวลา inner dev loop ด้วยคำสั่ง sam sync --watch ตรวจจับการเปลี่ยนแปลงและอัปเฉพาะส่วนที่เปลี่ยน เช่นถ้าแก้แค่ โค้ด Lambda จะอัปตรงไป Lambda service โดย ข้าม full CloudFormation deployment ทำให้เห็นผลเร็วขึ้นมากระหว่างพัฒนา
# sync การเปลี่ยนแปลงขึ้น cloud อัตโนมัติระหว่างพัฒนา
sam sync --watch --stack-name dev-stack
# sync เฉพาะ resource โค้ด (ข้าม infra) ให้เร็วสุด
sam sync --code --watch --stack-name dev-stackServerless Application Repository (SAR)
SAR เป็น managed repository ให้ค้นหา/แชร์/นำเข้า serverless application ที่ packaged ด้วย SAM เพื่อ reuse ได้ทั้ง public และ private (จำกัดเฉพาะ AWS account หรือทั้ง AWS Organization) นำเข้ามาใน template ของเราผ่าน AWS::Serverless::Application โดยอ้าง ApplicationId จาก SAR
MyNestedApp:
Type: AWS::Serverless::Application
Properties:
Location:
ApplicationId: arn:aws:serverlessrepo:us-east-1:123456789012:applications/my-app
SemanticVersion: 1.0.0
Parameters:
TableName: my-table- แชร์ public ให้ทุกคน หรือ private เฉพาะ account/Organization
- นำเข้าเป็น nested application ใน stack ของเรา
- ป้องกันการเขียน infra ซ้ำ (reuse best-practice apps)
08SAM vs CDK & สรุปก่อนสอบ
ทั้ง SAM และ CDK สุดท้ายแปลงเป็น CloudFormation เหมือนกัน แต่ต่างที่วิธีเขียนและขอบเขต
| หัวข้อ | SAM | CDK |
|---|---|---|
| รูปแบบเขียน | YAML/JSON declarative | ภาษาโปรแกรม (TS/Python/Java/C#/Go) |
| ขอบเขต | เน้น serverless โดยเฉพาะ | infra ทั่วไป ทั้ง AWS |
| ผลลัพธ์ | Transform -> CloudFormation | synth -> CloudFormation |
| Local testing | มี sam local (Docker) | ใช้ร่วมกับ SAM CLI ได้ (cdk synth -> sam local) |
| เหมาะกับ | ทีมที่อยาก declarative สั้นๆ สำหรับ serverless | ทีม dev ที่อยากใช้ logic/loop/abstraction ของภาษาโปรแกรม |
- SAM = subset เฉพาะ serverless + ง่าย/สั้น/อ่านง่าย
- CDK = ทรงพลังกว่า ใช้ programming construct, loop, reuse component
- CDK สามารถใช้ SAM CLI ทดสอบ local ได้ (cdk synth แล้ว sam local invoke)
- ทั้งคู่ลงท้ายที่ CloudFormation stack
คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ AWS SAM — Serverless Application Model
23 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.ใน SAM template บรรทัด Transform ที่ถูกต้องคืออะไร?
2.resource type ใดของ SAM ที่ย่อการสร้าง DynamoDB table แบบง่ายให้?
3.ต้องการ deploy Lambda ใหม่แบบค่อยๆ ย้าย traffic 10% ทุก 10 นาที จนครบ ควรตั้ง DeploymentPreference Type ใด?
4.property ใดใน AWS::Serverless::Function ที่จำเป็นต้องเปิดเพื่อให้ CodeDeploy ทำ traffic shifting ได้?
5.คำสั่ง SAM CLI ใดที่ใช้รัน API Gateway + Lambda จำลองบนเครื่องเพื่อทดสอบ endpoint ผ่าน HTTP?
6.Globals section ใน SAM template ใช้ทำอะไร?
7.sam deploy --guided ทำหน้าที่อะไร?
8.กระบวนการ build/deploy ด้วย SAM CLI ลำดับขั้นที่ถูกต้องคือ?
9.เมื่อ sam package ทำงาน มันอัป artifact (โค้ด Lambda) ไปที่ไหน?
10.SAM Accelerate (sam sync) ออกแบบมาเพื่ออะไร?
11.Policy Templates ใน SAM (เช่น S3ReadPolicy, DynamoDBCrudPolicy) มีไว้เพื่ออะไร?
12.ความสัมพันธ์ระหว่าง SAM กับ CloudFormation ข้อใดถูกต้อง?
13.ต้องการดู log ของ Lambda ที่ deploy ด้วย SAM แบบ tail real-time จาก CLI ควรใช้คำสั่งใด?
14.Serverless Application Repository (SAR) คืออะไร?
15.ใน SAM template AWS::Serverless::HttpApi ต่างจาก AWS::Serverless::Api อย่างไร?
16.ก่อนเริ่ม traffic shifting ด้วย CodeDeploy ใน SAM สามารถรัน Lambda function เพื่อ validate version ใหม่ได้ผ่าน hook ใด?
17.ทีมต้องการ deploy Lambda เวอร์ชันใหม่โดยส่ง traffic ไปเวอร์ชันใหม่ทั้งหมดทันทีใน production ควรเลือก DeploymentPreference Type ใด (และมีกับดักอะไร)?
18.ข้อใดอธิบาย SAM vs CDK ได้ถูกต้องที่สุด?
19.ใน Events ของ AWS::Serverless::Function ถ้าต้องการ trigger จาก API Gateway ใช้ Type ใด?
20.sam init ทำหน้าที่อะไร?
21.ต้องการลด cold start และรับประกัน latency คงที่สำหรับ Lambda ที่ deploy ผ่าน SAM ควรกำหนด property ใด?
22.ใน SAM template ค่า CodeUri ของ AWS::Serverless::Function ในไฟล์ source ก่อน package ควรเป็นอะไร?
23.ต้องการแชร์ serverless application ให้ใช้ภายในองค์กรเท่านั้น (ไม่ public) ผ่าน SAR ทำได้อย่างไร?