AWS Lambda
Serverless functions
01พื้นฐาน Lambda (Serverless Functions)
AWS Lambda คือบริการ serverless ที่รันโค้ดเป็นฟังก์ชันแบบ event-driven โดยไม่ต้องจัดการ server เอง เราเขียนแค่โค้ด Lambda จัดการ provisioning, scaling, patching และ availability ให้ทั้งหมด จุดเด่นคือ scale อัตโนมัติ (เพิ่ม instance ตาม load) และ จ่ายตามการใช้งานจริง (pay per use) ไม่มีค่าใช้จ่ายเมื่อไม่มี request
- Event-driven: ฟังก์ชันถูก trigger โดย event จากบริการอื่น เช่น S3, API Gateway, DynamoDB Streams
- Stateless: แต่ละ invocation เป็นอิสระ ห้ามพึ่ง state ค้างใน memory ระหว่าง invocation (ยกเว้น execution context reuse ที่ไม่การันตี)
- Short-lived: รันสูงสุด 15 นาที ต่อ invocation ไม่เหมาะกับงานยาว ๆ (งานยาวใช้ ECS/Fargate/Batch)
- Integrated: ผสานกับบริการ AWS เกือบทุกตัวเป็น trigger หรือ destination
02Runtimes, Container Images & Deployment Package
Lambda รองรับ managed runtimes หลายภาษา ได้แก่ Node.js, Python, Java, .NET (C#), Ruby, Go และยังรองรับ Custom Runtime ผ่าน Lambda Runtime API (เช่น Rust, PHP) โดย bootstrap เองได้ นอกจากนี้ยัง deploy เป็น Container Image ได้สูงสุด 10 GB (ต้อง implement Lambda Runtime API ใน image)
Deployment Package Limits ที่ต้องจำ
- 50 MB = ขนาด zip ที่ upload โดยตรง (direct upload)
- 250 MB = ขนาดหลัง unzip รวม layers (ไฟล์โค้ด + dependencies + layers)
- Container image สูงสุด 10 GB เก็บใน Amazon ECR
- ถ้าไฟล์เกิน 50 MB ต้อง upload ผ่าน Amazon S3 ก่อน
| รูปแบบ | Size Limit | ใช้เมื่อ |
|---|---|---|
| Zip direct upload | 50 MB | โค้ดเล็ก deploy ตรงผ่าน console/CLI |
| Zip via S3 | 250 MB (unzipped) | โค้ด + dependencies ขนาดกลาง |
| Container image (ECR) | 10 GB | dependency ใหญ่, ML model, ใช้ Docker workflow เดิม |
03Triggers & Invocation Types (Sync / Async / Event Source Mapping)
การ invoke Lambda แบ่งเป็น 3 รูปแบบ ซึ่งเป็นหัวข้อที่ออกสอบบ่อยมาก ต้องแยกให้ออกว่าแต่ละ trigger เป็นแบบไหน เพราะพฤติกรรม retry และ error handling ต่างกัน
04Event Source Mapping เจาะลึก (Streams vs Queues)
Event Source Mapping (ESM) มีพฤติกรรมต่างกันระหว่าง stream-based (Kinesis, DynamoDB Streams) กับ queue-based (SQS) ซึ่งเป็นจุดที่ข้อสอบชอบหลอก
| ประเด็น | Kinesis / DynamoDB Streams | SQS |
|---|---|---|
| การประมวลผล | อ่านตาม shard, ordered ภายใน shard | ไม่มีลำดับ (FIFO รักษาลำดับ per group) |
| Retry บน error | retry ทั้ง batch จนสำเร็จหรือ record หมดอายุ (blocked!) | record กลับเข้า queue หลัง visibility timeout |
| Concurrency | 1 Lambda ต่อ shard (เพิ่มด้วย parallelization factor สูงสุด 10) | scale ตาม batch / queue depth |
| Error handling | ใช้ on-failure destination, bisect batch, max retry/age | ใช้ DLQ ที่ตั้งบน SQS เอง (ไม่ใช่ Lambda DLQ) |
05Configuration: Memory, CPU, Timeout, /tmp, Env Vars
การตั้งค่า Lambda ที่ต้องจำตัวเลขให้แม่น เพราะออกสอบตรง ๆ บ่อย
- Memory: 128 MB ถึง 10,240 MB (10 GB) ปรับเป็น step ละ 1 MB
- CPU เพิ่มขึ้นตาม memory โดยอัตโนมัติ (proportional) — ที่ ~1,769 MB ได้ 1 vCPU เต็ม ถ้าฟังก์ชัน CPU-bound ให้ เพิ่ม memory เพื่อเพิ่ม CPU
- Timeout: default 3 วินาที, สูงสุด 900 วินาที (15 นาที)
- /tmp ephemeral storage: default 512 MB, ปรับได้สูงสุด 10,240 MB (10 GB) ข้อมูลใน /tmp อยู่แค่ชั่วคราว (อาจ reuse ข้าม invocation แต่ไม่การันตี)
- Environment variables ใช้ส่ง config เข้าฟังก์ชัน เข้ารหัสด้วย KMS ได้ (at rest เข้ารหัสด้วย default KMS key อยู่แล้ว; encrypt ฝั่ง client/CMK เพิ่มได้)
06IAM Execution Role, Resource-based Policy & Env Encryption
Lambda มี permission สองด้านที่ต้องแยกให้ออก: Execution Role (สิ่งที่ฟังก์ชันทำได้กับบริการอื่น) และ Resource-based Policy (ใครได้รับอนุญาตให้ invoke ฟังก์ชัน)
lambda:InvokeFunction ผ่าน principal ของบริการนั้น)# เพิ่ม permission ให้ API Gateway invoke Lambda (resource-based policy)
aws lambda add-permission \
--function-name my-function \
--statement-id apigw-invoke \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn "arn:aws:execute-api:us-east-1:123456789012:abcd1234/*/GET/items"dynamodb:GetRecords, sqs:ReceiveMessage) ไม่ใช่ resource-based policy ส่วน trigger แบบ push (S3/SNS/API GW) ใช้ resource-based policy07Concurrency: Reserved, Provisioned & Throttling
Concurrency = จำนวน execution ที่รันพร้อมกัน ณ ขณะหนึ่ง ต่อ region ทุกบัญชีมี default account concurrency limit = 1,000 (ขอเพิ่มได้ผ่าน support) ถ้าเกิน limit จะถูก throttle (error 429 TooManyRequestsException)
08Cold Start, SnapStart & Lambda Layers
Cold start เกิดเมื่อ Lambda สร้าง execution environment ใหม่: โหลดโค้ด + รัน init code (นอก handler) ทำให้ invocation แรกช้า การ invoke ถัด ๆ ที่ reuse environment เดิมเรียก warm start ซึ่งเร็วกว่ามาก
วิธีลด Cold Start
- Provisioned Concurrency — เตรียม environment warm ไว้ล่วงหน้า (ใช้ได้ทุก runtime, มีค่าใช้จ่าย)
- SnapStart — ถ่าย snapshot ของ environment ที่ init แล้วตอน publish version แล้ว resume จาก snapshot (ไม่มีค่าใช้จ่ายเพิ่มสำหรับ Java), ปัจจุบันรองรับ Java 11+, Python 3.12+, .NET 8+
- ลดขนาด dependencies / ย้าย init code ออกนอก hot path
- เลือก runtime ที่ init เร็ว
Lambda Layers
Lambda Layers ใช้แยก dependencies / libraries / custom runtime ออกจากโค้ดฟังก์ชัน เพื่อ reuse ข้ามหลายฟังก์ชัน และทำให้ deployment package เล็กลง ใช้ได้สูงสุด 5 layers ต่อฟังก์ชัน และนับรวมในลิมิต 250 MB unzipped
09Versions, Aliases, Destinations & DLQ
Versions = snapshot ของโค้ด+config ที่ immutable เมื่อ publish จะได้เลขเวอร์ชัน (1,2,3...) ส่วน $LATEST เป็น version ที่แก้ไขได้ (mutable) Aliases = pointer ชี้ไปยัง version (เช่น prod, dev) ช่วยทำ canary / weighted deployment ได้
# Canary deployment: alias prod ส่ง 90% ไป v1, 10% ไป v2
aws lambda update-alias \
--function-name my-function \
--name prod \
--function-version 1 \
--routing-config '{"AdditionalVersionWeights": {"2": 0.1}}'- Alias ชี้ไป $LATEST ไม่ได้ และ alias ไม่สามารถชี้ไปยัง alias อื่น (no alias chaining)
- Weighted alias ใช้กับ traffic shifting (canary/linear) มักใช้คู่ CodeDeploy เพื่อ shift อัตโนมัติพร้อม rollback ตาม CloudWatch Alarm
Destinations vs DLQ (async only)
| ประเด็น | Lambda Destinations | DLQ (Dead Letter Queue) |
|---|---|---|
| ใช้กับ | async invocation + event source mapping (stream) | async invocation (และ ESM ผ่าน destination) |
| ปลายทางได้ | SQS, SNS, Lambda, EventBridge | SQS, SNS เท่านั้น |
| บันทึก success ได้ไหม | ได้ (onSuccess + onFailure) | ไม่ได้ (failure เท่านั้น) |
| แนวทาง AWS | แนะนำให้ใช้ (ใหม่กว่า, ข้อมูลครบกว่า) | วิธีเดิม |
10Lambda in VPC, RDS Proxy, EFS & Lambda@Edge
โดย default Lambda รันใน VPC ที่ AWS จัดการ (เข้าถึง internet ได้ แต่เข้าถึง resource ใน private VPC ของเราไม่ได้) ถ้าต้องเข้าถึง RDS/ElastiCache/private resource ต้อง config ให้ Lambda รันใน VPC ของเรา (ระบุ subnet + security group) Lambda จะสร้าง ENI ใน subnet นั้น
11Pricing & สรุปตัวเลขที่ต้องจำ
Lambda คิดเงินจาก (1) จำนวน request และ (2) duration x memory (GB-seconds) ปัดขึ้นทีละ 1 ms มี free tier: 1 ล้าน request/เดือน และ 400,000 GB-seconds/เดือน — ฟังก์ชันที่จัดสรร memory มากจะคิดเงินต่อ ms แพงกว่า แต่ถ้ารันเสร็จเร็วลงอาจถูกลงรวม
- Memory: 128 MB – 10,240 MB (10 GB)
- Timeout: max 900 วินาที (15 นาที), default 3 วินาที
- /tmp ephemeral: 512 MB default – 10,240 MB max
- Deployment package: 50 MB (zip direct) / 250 MB (unzipped + layers) / 10 GB (container image)
- Layers: สูงสุด 5 ต่อฟังก์ชัน
- Concurrency: default 1,000 ต่อ region/account
- Async retry: 2 ครั้ง (รวม 3); event อยู่ในคิวสูงสุด ~6 ชั่วโมง
- Environment variables: รวมทุกตัวสูงสุด 4 KB
คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ AWS Lambda
25 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.บริษัทมีฟังก์ชัน Lambda ที่ทำงานหนักด้าน CPU (image processing) และทำงานช้า ทีมต้องการให้เร็วขึ้น วิธีใดเหมาะสมที่สุด?
2.ฟังก์ชัน Lambda ถูก trigger โดย Amazon S3 (asynchronous) บางครั้งประมวลผลล้มเหลว ทีมต้องการเก็บ event ที่ fail ไว้ตรวจสอบภายหลัง ควรตั้งค่าอะไร?
3.ระบบใช้ SQS standard queue เป็น event source mapping ของ Lambda ต้องการให้ message ที่ประมวลผลไม่สำเร็จหลายครั้งไปเก็บที่อื่น ควรทำอย่างไร?
4.ฟังก์ชัน Lambda เขียนด้วย Java มี cold start สูงเพราะ framework โหลดนาน ทีมต้องการลด latency โดยไม่เพิ่มค่าใช้จ่ายมาก ควรใช้อะไร?
5.ข้อใดถูกต้องเกี่ยวกับการใช้ SnapStart ร่วมกับฟีเจอร์อื่น?
6.deployment package ของ Lambda (zip) มีขนาด 120 MB ทีมพยายาม upload ผ่าน console โดยตรงแต่ล้มเหลว ควรทำอย่างไร?
7.ฟังก์ชัน Lambda ต้องเข้าถึง Amazon RDS ที่อยู่ใน private subnet ภายใน VPC แต่ปัจจุบันเชื่อมต่อไม่ได้ ควรทำอย่างไร?
8.หลังจากวาง Lambda ใน VPC แล้ว ฟังก์ชันไม่สามารถเรียก external API บน internet ได้ ควรแก้อย่างไร?
9.ทีมต้องการป้องกันไม่ให้ฟังก์ชัน Lambda หนึ่งใช้ concurrency จนกินโควต้าของฟังก์ชันอื่นทั้งบัญชี ควรตั้งค่าอะไร?
10.ระบบ web API ที่ใช้ Lambda ต้องการ latency ที่คงที่ ไม่มี cold start ในช่วง traffic peak ที่คาดการณ์ได้ ควรใช้อะไร?
11.ทีมต้องการ deploy เวอร์ชันใหม่ของ Lambda โดยค่อย ๆ ส่ง traffic ไปเวอร์ชันใหม่ 10% และที่เหลือไปเวอร์ชันเก่า เพื่อทดสอบก่อน rollout เต็ม ควรใช้อะไร?
12.ข้อใดอธิบาย Execution Role ของ Lambda ได้ถูกต้อง?
13.Lambda ประมวลผล record จาก Kinesis Data Stream แต่มี record เสีย (poison pill) ทำให้ batch fail ซ้ำ ๆ และ block การประมวลผล shard ทั้งหมด ควรแก้อย่างไร?
14.ทีมสงสัยว่าฟังก์ชัน Lambda มี bug ร้ายแรงและต้องการหยุดการ invoke ทันทีโดยไม่ลบฟังก์ชัน ควรทำอย่างไร?
15.ฟังก์ชัน Lambda จำนวนมาก scale พร้อมกันจนเปิด connection ไปยัง RDS มากเกินไป (connection exhaustion) ควรใช้บริการใด?
16.ข้อใดคือลิมิตที่ถูกต้องของ Lambda?
17.ทีมต้องการ share library code (เช่น utility, SDK เวอร์ชันเฉพาะ) ระหว่างหลายฟังก์ชัน Lambda เพื่อลดขนาด package และ reuse ควรใช้อะไร?
18.ฟังก์ชัน Lambda ถูก invoke แบบ asynchronous ผ่าน SNS และเกิด throttle ชั่วคราว ข้อใดเกิดขึ้น?
19.ฟังก์ชัน Lambda ต้องการ shared persistent file system ที่หลายฟังก์ชันเข้าถึงไฟล์ ML model ขนาดใหญ่ร่วมกันได้ ควรใช้อะไร?
20.ทีมต้องการ run โค้ดเพื่อปรับแต่ง HTTP header ของ request ที่ CloudFront edge ใกล้ผู้ใช้ทั่วโลก ควรใช้อะไร?
21.เมื่อ S3 ต้อง trigger Lambda function ระบบต้องมีการตั้งค่าด้าน permission อย่างไรจึงจะทำงานได้?
22.ทีมต้องการ deployment package ที่มี dependency ขนาดใหญ่มาก (เช่น ML libraries หลาย GB) ที่เกินลิมิต zip ปกติ ควรใช้รูปแบบ deploy ใด?
23.ข้อใดอธิบายความแตกต่างระหว่าง Lambda Destinations กับ DLQ ได้ถูกต้องที่สุด?
24.ฟังก์ชัน Lambda เก็บข้อมูล secret ใน environment variables ทีม security ต้องการให้มั่นใจว่าเข้ารหัสและควบคุมการเข้าถึง key ได้เอง ควรทำอย่างไร?
25.API Gateway เรียก Lambda แบบ synchronous และฟังก์ชันเกิด throttle เพราะ concurrency เต็ม ผู้ใช้จะได้รับอะไร และควรเข้าใจอย่างไร?