AWS DVA-C02
Esc
↑↓เลื่อน↵เปิดescปิด28 ผลลัพธ์
22

AWS SAM — Serverless Application Model

Serverless Application Model

Developer Tools & IaC 10 นาที 23 คำถาม

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 ฯลฯ)

yaml
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 เสมอ
Tips สำหรับการสอบ
ถ้าข้อสอบถาม syntax ที่ทำให้ CloudFormation รู้ว่าเป็น SAM template ให้ตอบ Transform: AWS::Serverless-2016-10-31 เสมอ และจำว่า SAM = superset ของ CloudFormation ที่ย่อความ

02SAM Resource Types ที่ต้องรู้

SAM มี resource type เฉพาะที่ขึ้นต้นด้วย AWS::Serverless:: ซึ่งย่อ resource หลายตัวให้เหลือสั้น แต่ละตัว map ไปยัง service ที่ต่างกัน

AWS::Serverless::Function
สร้าง Lambda function + IAM execution role + (ถ้ามี Events) trigger ต่างๆ รองรับ Events หลาย Type: Api, HttpApi, S3, SNS, SQS, Schedule, DynamoDB, Kinesis ฯลฯ มี property สำคัญเช่น Runtime, Handler, MemorySize, Timeout, Policies, AutoPublishAlias, DeploymentPreference
AWS::Serverless::Api
สร้าง API Gateway REST API (v1) feature เยอะ เช่น API keys/usage plans, request validation, WAF เต็มรูปแบบ มักถูกสร้างให้อัตโนมัติเมื่อ Function มี Event Type: Api
AWS::Serverless::HttpApi
สร้าง API Gateway HTTP API (v2) ราคา ถูกกว่า และ latency ต่ำกว่า เหมาะ proxy ไป Lambda แบบง่ายๆ feature น้อยกว่า REST API
AWS::Serverless::SimpleTable
สร้าง DynamoDB table แบบ minimal (กำหนด primary key) เหมาะ use case ง่าย ถ้าต้องการ GSI/LSI/streams ขั้นสูงให้ใช้ AWS::DynamoDB::Table ตรงๆ
AWS::Serverless::StateMachine
สร้าง Step Functions state machine กำหนด definition + role + logging ได้
AWS::Serverless::Application
นำเข้า nested application จาก SAR หรือ template อื่น โดยอ้าง Location/ApplicationId
หมายเหตุ
Event Type ใน Function เป็นตัวกำหนด trigger เช่น Type: Schedule = EventBridge cron, Type: S3 = object event, Type: Api = REST API Gateway, Type: HttpApi = HTTP API v2

03Globals Section & Policy Templates

Globals — ลดการเขียนซ้ำ

Globals section ใช้กำหนดค่า default ที่ resource หลายตัวใช้ร่วมกัน รองรับ Function, Api, HttpApi, SimpleTable เช่นตั้ง Runtime/MemorySize/Timeout ของทุก Function ครั้งเดียว แล้ว resource แต่ละตัวยัง override ได้

yaml
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 เอง

yaml
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 ผสมได้
Tips สำหรับการสอบ
โจทย์ที่ถามว่า 'จะให้ Lambda เข้าถึง DynamoDB table แบบ least-privilege โดยเขียนน้อยที่สุด' คำตอบมักคือ Policy Templates (เช่น DynamoDBCrudPolicy) ไม่ใช่การแนบ managed policy แบบ FullAccess

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 packagezip artifact แล้วอัปขึ้น S3 (หรือ image ขึ้น ECR) + เขียน CodeUri ใหม่ชี้ S3
sam deploy --guidedinteractive wizard ถามค่า (stack/region/S3/capabilities) แล้วสร้าง/อัปเดต CloudFormation stack บันทึก samconfig.toml
sam logs --tailดึง CloudWatch Logs ของ Lambda แบบ real-time
bash
# เริ่มโปรเจกต์ใหม่
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 --tail
หมายเหตุ
sam deploy รุ่นใหม่รวมขั้น package ให้ในตัว (ใส่ --resolve-s3 ให้สร้าง/ใช้ managed bucket อัตโนมัติ) แต่ในเชิงแนวคิดข้อสอบ ลำดับยังเป็น build -> package -> deploy

05Local 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
bash
# จำลอง 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-lambda

Packaging ขึ้น 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 แทน)

กับดักข้อสอบ
sam local ใช้ Docker จำลอง runtime ไม่ได้ deploy จริง อย่าสับสน: start-api = จำลอง API Gateway เรียกผ่าน HTTP ส่วน start-lambda = จำลอง Lambda service endpoint ให้ SDK/integration test เรียก ไม่ใช่ตัวเดียวกัน

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
yaml
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
กับดักข้อสอบ
ถ้าลืม AutoPublishAlias แล้วใส่แต่ DeploymentPreference จะ shift traffic ไม่ได้ เพราะไม่มี alias ให้ CodeDeploy ทำงาน ข้อสอบชอบหลอกให้เลือก DeploymentPreference อย่างเดียว — ต้องมี ทั้งคู่
หมายเหตุ
Hooks: PreTraffic รันก่อนเริ่ม shift, PostTraffic รันหลัง shift ครบ ถ้า validation function fail หรือ CloudWatch Alarms trigger -> CodeDeploy rollback อัตโนมัติ

07SAM Accelerate & Serverless Application Repository (SAR)

SAM Accelerate (sam sync)

SAM Accelerate ลดเวลา inner dev loop ด้วยคำสั่ง sam sync --watch ตรวจจับการเปลี่ยนแปลงและอัปเฉพาะส่วนที่เปลี่ยน เช่นถ้าแก้แค่ โค้ด Lambda จะอัปตรงไป Lambda service โดย ข้าม full CloudFormation deployment ทำให้เห็นผลเร็วขึ้นมากระหว่างพัฒนา

bash
# sync การเปลี่ยนแปลงขึ้น cloud อัตโนมัติระหว่างพัฒนา
sam sync --watch --stack-name dev-stack

# sync เฉพาะ resource โค้ด (ข้าม infra) ให้เร็วสุด
sam sync --code --watch --stack-name dev-stack
กับดักข้อสอบ
sam sync --code เหมาะ dev/test เท่านั้น เพราะข้าม CloudFormation ทำให้ stack drift จากของจริง อย่าใช้กับ production deployment

Serverless Application Repository (SAR)

SAR เป็น managed repository ให้ค้นหา/แชร์/นำเข้า serverless application ที่ packaged ด้วย SAM เพื่อ reuse ได้ทั้ง public และ private (จำกัดเฉพาะ AWS account หรือทั้ง AWS Organization) นำเข้ามาใน template ของเราผ่าน AWS::Serverless::Application โดยอ้าง ApplicationId จาก SAR

yaml
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 เหมือนกัน แต่ต่างที่วิธีเขียนและขอบเขต

หัวข้อSAMCDK
รูปแบบเขียนYAML/JSON declarativeภาษาโปรแกรม (TS/Python/Java/C#/Go)
ขอบเขตเน้น serverless โดยเฉพาะinfra ทั่วไป ทั้ง AWS
ผลลัพธ์Transform -> CloudFormationsynth -> 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
Tips สำหรับการสอบ
จุดที่ออกบ่อย: (1) Transform: AWS::Serverless-2016-10-31 (2) AutoPublishAlias + DeploymentPreference ต้องคู่กันสำหรับ traffic shifting (3) Canary = ก้อนเดียวแล้วรอ vs Linear = เพิ่มเท่าๆ กัน (4) Policy Templates สำหรับ least-privilege (5) sam local start-api vs start-lambda (6) SAR สำหรับ reuse/แชร์ app

คำถามทบทวน

ทดสอบความเข้าใจหัวข้อ AWS SAM — Serverless Application Model

23 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย

ทำแล้ว 0/23คะแนน 0
  1. 1.ใน SAM template บรรทัด Transform ที่ถูกต้องคืออะไร?

  2. 2.resource type ใดของ SAM ที่ย่อการสร้าง DynamoDB table แบบง่ายให้?

  3. 3.ต้องการ deploy Lambda ใหม่แบบค่อยๆ ย้าย traffic 10% ทุก 10 นาที จนครบ ควรตั้ง DeploymentPreference Type ใด?

  4. 4.property ใดใน AWS::Serverless::Function ที่จำเป็นต้องเปิดเพื่อให้ CodeDeploy ทำ traffic shifting ได้?

  5. 5.คำสั่ง SAM CLI ใดที่ใช้รัน API Gateway + Lambda จำลองบนเครื่องเพื่อทดสอบ endpoint ผ่าน HTTP?

  6. 6.Globals section ใน SAM template ใช้ทำอะไร?

  7. 7.sam deploy --guided ทำหน้าที่อะไร?

  8. 8.กระบวนการ build/deploy ด้วย SAM CLI ลำดับขั้นที่ถูกต้องคือ?

  9. 9.เมื่อ sam package ทำงาน มันอัป artifact (โค้ด Lambda) ไปที่ไหน?

  10. 10.SAM Accelerate (sam sync) ออกแบบมาเพื่ออะไร?

  11. 11.Policy Templates ใน SAM (เช่น S3ReadPolicy, DynamoDBCrudPolicy) มีไว้เพื่ออะไร?

  12. 12.ความสัมพันธ์ระหว่าง SAM กับ CloudFormation ข้อใดถูกต้อง?

  13. 13.ต้องการดู log ของ Lambda ที่ deploy ด้วย SAM แบบ tail real-time จาก CLI ควรใช้คำสั่งใด?

  14. 14.Serverless Application Repository (SAR) คืออะไร?

  15. 15.ใน SAM template AWS::Serverless::HttpApi ต่างจาก AWS::Serverless::Api อย่างไร?

  16. 16.ก่อนเริ่ม traffic shifting ด้วย CodeDeploy ใน SAM สามารถรัน Lambda function เพื่อ validate version ใหม่ได้ผ่าน hook ใด?

  17. 17.ทีมต้องการ deploy Lambda เวอร์ชันใหม่โดยส่ง traffic ไปเวอร์ชันใหม่ทั้งหมดทันทีใน production ควรเลือก DeploymentPreference Type ใด (และมีกับดักอะไร)?

  18. 18.ข้อใดอธิบาย SAM vs CDK ได้ถูกต้องที่สุด?

  19. 19.ใน Events ของ AWS::Serverless::Function ถ้าต้องการ trigger จาก API Gateway ใช้ Type ใด?

  20. 20.sam init ทำหน้าที่อะไร?

  21. 21.ต้องการลด cold start และรับประกัน latency คงที่สำหรับ Lambda ที่ deploy ผ่าน SAM ควรกำหนด property ใด?

  22. 22.ใน SAM template ค่า CodeUri ของ AWS::Serverless::Function ในไฟล์ source ก่อน package ควรเป็นอะไร?

  23. 23.ต้องการแชร์ serverless application ให้ใช้ภายในองค์กรเท่านั้น (ไม่ public) ผ่าน SAR ทำได้อย่างไร?