แนะนำ AWS Serverless Application Model (AWS SAM) ปี 2025

แนะนำ AWS Serverless Application Model (AWS SAM) ปี 2025

บทความนี้จะพาผู้อ่านทุกท่านไปทำความรู้จักกับ AWS Serverless Application Model (SAM) อัปเดตข้อมูลปี 2025 และแนะนำวิธีการใช้งานเบื้องต้นครับ

แนะนำ AWS Serverless Application Model (AWS SAM) ปี 2025

สวัสดีครับ กาญจน์ครับ ครั้งนี้จะเป็นครั้งแรกที่ผมได้แปลและเรียบเรียงบทความเชิงเทคนิคของ AWS ครับ ฝากเนื้อฝากตัวกับผู้อ่านทุกท่านด้วยครับ

บทความนี้ได้รับการแปลและเรียบเรียงจากบทความภาษาญี่ปุ่นโดยคุณ リサリサ จากแผนกคอนซัลติ้งที่สาขาญี่ปุ่นครับ โดยเนื้อหาจะมีการปรับสำนวน และเรียบเรียงใหม่ให้อ่านง่ายขึ้นครับ หากผู้อ่านท่านใดสนใจบทความต้นฉบับ สามารถคลิกเข้าไปอ่านตามลิงค์นี้ได้เลยครับ AWS再入門2022 AWS Serverless Application Model (AWS SAM)編

บทความฉบับดั้งเดิมเป็นการนำบรรดาสมาชิกที่ปกติเขียนเนื้อหา AWS ที่อัปเดตใหม่และลงลึก ได้กลับมาทวนพื้นฐานอีกครั้งผ่านการเขียนบทความครับ โดยเหมาะกับทั้งผู้อ่านที่เริ่มสนใจบริการของ AWS และผู้ที่เคยใช้งานอยู่แล้วเช่นกันครับ

ครั้งนี้หัวข้อจะเกี่ยวข้องกับ AWS Serverless Application Model (SAM) โดยนอกจากจะพูดถึงทฤษฎีคร่าวๆแล้ว เรายังมีภาคปฏิบัติให้ลองทำตามกันด้วย ถ้าท่านใดสนใจ สามารถทำตามไปด้วยกันได้นะครับ

AWS Serverless Application Model (AWS SAM) คืออะไร?

AWS Serverless Application Model (หรือ AWS SAM) เป็น Open Source Framework ที่เราสามารถใช้เพื่อสร้าง Serverless Application ได้โดยง่ายครับ

sam-getting-started-hello-world

เนื่องจากเราจะเจาะลึกฟังก์ชันของ AWS CloudFormation ด้วย หากท่านใดยังไม่คุ้นเคยเรื่อง AWS CloudFormation สามารถอ่านบทความเกี่ยวกับ AWS CloudFormation ได้ตามลิงค์ข้างล่างนี้ครับ

https://dev.classmethod.jp/articles/what-is-aws-cloudformation-2022-th/

ข้อดีของการใช้ AWS SAM

การใช้งาน AWS SAM เพื่อสร้าง Serverless Application มีข้อดีดังนี้ครับ

การกำหนดค่าการ Deploy แบบเดี่ยว

AWS SAM ช่วยให้จัดระเบียบ Component หรือ Resource ที่เกี่ยวข้องได้ง่ายขึ้น และสามารถดำเนินการบนสแต็กเดียวได้ เมื่อใช้ AWS SAM เราสามารถแชร์การตั้งค่าต่างๆ เช่น หน่วยความจำ (Memory) และ Timeout ระหว่าง resource ได้ และสามารถ deploy ตัว resource ที่มีความเกี่ยวข้องกันเป็นเอนทิตีเดียวกันได้ครับ

เป็นส่วนขยายของ AWS CloudFormation

เนื่องจาก AWS SAM เป็นส่วนขยายของ AWS CloudFormation ทำให้เราสามารถใช้ประโยชน์ความสามารถในการ deploy ที่น่าเชื่อถือของ CloudFormation ได้ครับ เราสามารถกำหนด resource โดยใช้ AWS SAM ภายในเทมเพลตของ AWS CloudFormation ได้ นอกจากนี้ เรายังสามารถใช้ resource ทั้งหมด, built-in function, และฟีเจอร์เทมเพลตอื่นๆ ที่มีอยู่ใน AWS CloudFormation ได้อีกด้วย

Best Practice ที่มีมาให้

เราสามารถใช้ AWS SAM เพื่อกำหนดโครงสร้างพื้นฐาน (infrastructure) ตอนตั้งค่า และทำการ Deploy ได้ ซึ่งจะทำให้สามารถใช้และดำเนินการตาม best practice ต่างๆเช่นการรีวิวโค้ดได้

Debug และทดสอบแบบ local ได้

เมื่อติดตั้ง Docker เสร็จ เราสามารถ สร้าง, ทดสอบ และทำการ debug แอปพลิเคชั่น serverless (serverless application) ที่กำหนดใน AWS SAM templates แบบ local ได้

การประสานกันอย่างไร้รอยต่อของของเครื่องมือพัฒนาซอฟแวร์

AWS SAM สามารถใช้ร่วมกับชุดเครื่องมือของ AWS เพื่อสร้าง Serverless Application ได้ครับ โดยเราสามารถใช้ CodeBuild, CodeDeploy และ CodePipeline เพื่อสร้าง pipeline สำหรับการ deploy ตัว severless application ของเราได้ หรือเราสามารถใช้ AWS CodeStar เพื่อขึ้นโครงสร้างโปรเจกท์, สร้าง code repository และตั้งค่า CI/CD Pipeline นอกจากนี้ เราสามารถใช้ปลั๊กอินของ Jenkins เพื่อ deploy และ Stackery.io เพื่อสร้างแอปพลิเคชันสำหรับใช้งานจริงได้ครับ

วิธีการเริ่มต้นใช้งาน AWS SAM

ตั้งค่าสิทธิ์ IAM (IAM Permissions) และข้อมูลการยืนยันตัวตนใน AWS (AWS credentials)

เนื่องจาก AWS SAM เป็นเครื่องมือที่ใช้งานผ่าน CLI เราจึงจำเป็นต้องตั้งค่าข้อมูลการยืนยันตัวตน AWS (AWS credentials) ใน local environment สำหรับผู้ที่ตั้งค่าข้อมูลการยืนยันตัวตนเรียบร้อยแล้ว (สามารถใช้ AWS CLI ได้) สามารถข้ามขั้นตอนนี้ได้เลยครับ

สำหรับผู้ที่ยังไม่ได้ตั้งค่า กรุณาทำการตั้งค่าตามคู่มือการตั้งค่าข้อมูลการยืนยันตัวตน AWS หรือหากอยาก set up อย่างง่าย ก็สามารถสร้าง role และเพิ่ม permission สำหรับ cloudfront ได้ครับ ซึ่งผมจะพูดถึงในช่วงถัดไปของบทความครับ

ติดตั้ง Docker (ไม่บังคับ)

ถ้าเราติดตั้ง Docker จะสามารถทดสอบ Lambda ใน local environment ได้ครับ ในตัวอย่างนี้ไม่ได้ทำแบบติดตั้ง Docker แต่ถ้าผู้อ่านต้องการใช้ Docker สามารถดูวิธีการติดตั้งได้ที่ Installing Docker to use with the AWS SAM CLI

ติดตั้ง SAM CLI

ครั้งนี้ เราจะติดตั้ง Ubuntu Server 24.04 กันครับ (ซึ่งเป็นเวอร์ชันล่าสุดของ ณ วันที่เขียนบล็อก) ถ้าผู้อ่านใช้ Environment อื่น กรุณาดูวิธีการติดตั้งได้ทาง Install the AWS SAM CLI

  1. ติดตั้งโปรแกรมที่จำเป็น (SAM Cli ต้องใช้ python)
 $ sudo su - #ไปที่ root
 $ apt update
 $ apt install -y python3 python3-pip unzip curl
  1. ดาวน์โหลดและติดตั้ง SAM Cli
#ติดตั้ง wget สำหรับ download
$ apt install -y wget

# Download Sam CLI และ Unzip
$ wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
$ mkdir -p sam-installation
$ unzip aws-sam-cli-linux-x86_64.zip -d sam-installation

# ติดตั้ง Sam CLI
$ ./sam-installation/install
  1. ตรวจสอบเวอร์ชัน SAM Cli เพื่อดูว่าติดตั้งเรียบร้อย
$ sam --version

# แสดงเวอร์ชัน เช่น SAM CLI, version 1.141.0

ทดลองทำภาคปฏิบัติ

ภาคปฏิบัตินี้อ้างอิงมาจาก Tutorial: Deploy a Hello World application with AWS SAM ซึ่งเราจะสร้างแอปพลิเคชันรูปแบบคล้ายภาพด้านล่างครับ
ที่พอเราเรียก Method:GET แล้วแอปพลิดคชั่นจะส่งกลับข้อความ "hello world" กลับมา

sam-getting-started-hello-world

ดาวน์โหลดตัวอย่าง แอปพลิเคชั่น SAM

เราจะใช้คำสั่ง sam init เพื่อเริ่มใช้ (initialize) แอปพลิเคชัน serverless ครั้งนี้เราจะโคลนเทมเพลต ของ hello-world API

$ sam init

แล้วเราจะได้ตัวเลือกแบบ interactive โดยเราสามารเลือกได้โดยการใส่ตัวเลข ให้ผู้อ่านพิมพ์เลขตามตัวอย่างข้างล่างได้เลยครับ


Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
    1 - Hello World Example
    2 - Data processing
    3 - Hello World Example with Powertools for AWS Lambda
    4 - Multi-step workflow
    5 - Scheduled task
    6 - Standalone function
    7 - Serverless API
    8 - Infrastructure event management 
    9 - Lambda Response Streaming
   10 - GraphQLApi Hello World Example
   11 - Full Stack
   12 - Lambda EFS example
   13 - Serverless Connector Hello World Example
   14 - Multi-step workflow with Connectors
   15 - DynamoDB Example
   16 - Machine Learning
Template: 1

Use the most popular runtime and package type? (Python and zip) [y/N]: y

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: ENTER

Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER

Would you like to set Structured Logging in JSON format on your Lambda functions?  [y/N]: ENTER

Project name [sam-app]: ENTER

พอทำตามขั้นตอนข้างบนเสร็จ AWS CLI จะทำการดาวน์โหลดเทมเพลตเริ่มต้น และสร้างไดเรกทอรี่ของ application project ในเครื่อง local (ซึ่งกรณีของผมคือ ec2 ubuntu)

Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)

    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: python3.9
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    Configuration file: sam-app/samconfig.toml

    Next steps can be found in the README file at sam-app/README.md

Commands you can use next
=========================
[*] Create pipeline: cd sam-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-app && sam validate
[*] Test Function in the Cloud: cd sam-app && sam sync --stack-name {stack-name} --watch

เทมเพลต hello-world API จะถูกโคลนลงมา ไฟล์แบบนี้จะถูกสร้างขึ้นโดยอัตโนมัติ
เราสามารถใช้ command:tree เพื่อเช็คโครงสร้างไฟล์ได้ที่ถูกสร้างได้

ในกรณีไม่มี command: tree สามารถใช้ snap install tree เพื่อติดตั้งได้

$ cd sam-app

$ tree

├── README.md
├── __init__.py
├── events
│   └── event.json
├── hello_world
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── samconfig.toml
├── template.yaml
└── tests
    ├── __init__.py
    ├── integration
    │   ├── __init__.py
    │   └── test_api_gateway.py
    ├── requirements.txt
    └── unit
        ├── __init__.py
        └── test_handler.py

6 directories, 14 files
  • hello_world/app.py มีโค้ดของ Lambda อยู่
  • ไฟล์ hello_world/requirements.txt มี dependency library อยู่ และสามารถแก้ไข (resolve) ได้ด้วยคำสั่ง sam build
  • samconfig.toml เป็นไฟล์กำหนดค่า (Configuration) ที่เก็บ default parameter ไว้
  • ไฟล์ template.yaml เป็นเทมเพลตของ AWS SAM ที่มีโค้ด infrastructure ของ application ของเรา (เป็น syntax ขยายมาจาก CloudFormation เพื่อสร้าง resource)

สามารถอ่านเทมเพลตได้ใน template.yaml ด้วยคำสั่ง

less template.yaml

ข้างล่างคือตัวอย่างเทมเพลตที่ได้มา ซึ่งจะสร้าง Lambda และ API Gateway

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.13
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

การสร้างแอปพลิเคชัน

คำสั่ง sam build จะสร้าง dependency ทั้งหมดที่แอปพลิเคชันมีอยู่ลงในโฟลเดอร์ .aws-sam/build

$ sam build

ในครั้งนี้เนื่องจากใช้ Runtime เป็น Python จึงจะทำการ resolve ไฟล์ requirements.txt ให้

Starting Build use cache
Manifest file is changed (new hash: 3298f1304...d4d421) or dependency folder (.aws-sam/deps/4d3dfad6-a267-47a6-a6cd-e07d6fae318c) is missing for (HelloWorldFunction), downloading dependencies and copying/building source
Building codeuri: /Users/.../Demo/sam-tutorial1/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:CleanUp
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Running PythonPipBuilder:CopySource

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided

ภายใน .aws-sam จะมีไฟล์ถูกสร้างขึ้นมาเหมือนข้างล่างนี้

$ tree .aws-sam
.aws-sam
├── build
│   ├── HelloWorldFunction
│   │   ├── __init__.py
│   │   ├── app.py
│   │   ├── certifi
│   │   │   ├── __init__.py
│   │   │   ├── __main__.py
│   │   │   ├── cacert.pem
~略~
│   └── template.yaml
└── build.toml

Note: กรณี Python ใน template.yaml ใหม่เวอร์ชันไม่ตรงกับของในเครื่อง local จะไม่สามารถ build ได้ เราสามารถเลือกทำอย่างใดอย่างหนึ่ง ดังนี้ (ถ้าไม่มีปัญหา สามารถข้ามส่วนนี้ได้ครับ)

a. อัปเดต python3 ของเครื่องให้ตรงกับ version runtime ของ template.yaml
b. เปลี่ยน runtime ให้ตรงกับเวอร์ชัน python ของเครื่อง

โดยเราจะใช้วิธี b. กันในตัวอย่าง

  1. เช็คเวอร์ชัน python
$ python --version
#python3.12
  1. ใช้ vi เพื่อแก้ไขไฟล์
$ vi template.yaml

พอเข้ามาแล้วให้กด i เพื่อแก้ไขไฟล์ ใช้ลูกศรคีย์บอร์ดเลื่อนลงมาที่ runtime และแก้ไขให้เวอร์ชันตรงกับเวอร์ชันของเครื่อง local
template-python-fix

เสร็จแล้วให้กด esc แล้พิมพ์ :x หรือ :wq เพื่อเซฟและออกมาจากไฟล์ครับ
(กรณีเผลอทำพลาด และไม่อยากเซฟ สามารถกด esc และพิมพ์ :q! เพื่อออกโดยไม่เซฟ)

การ Deploy AWS ขึ้น Cloud

ก่อนจะ deploy เราต้องทำดังต่อไปนี้ก่อน: -

1. ใส่ permission ให้ ec2 ของเรา:

ไปที่ IAM ROLE: ไปที่ role แล้วคลิก Create Role

จากนั้นตั้งค่าตามนี้:
Step 1:

  • Trusted Entity type: AWS service
  • Use Case: ec2

Step 2:
Add Permissions: ให้เลือก CloudFormationFullAccess

จากนั้นให้ตั้งชื่อ ซึ่งของผมใช้ kanj-sam-test
cloudformation-fullacces

2. เพิ่ม IAM Role ใน EC2:

  • กดเข้าไปใน Instance ---> แล้วคลิก Actions ที่มุมขวาบน
    จากนั้นเลือก Security -> Modify IAM role
    แล้วเลือก IAM Role ที่เราสร้างมา

add-iam-role

2. deploy

$ sam deploy --guided

พอกด deploy จะมีตัวเลือกแบบ interactive ขึ้นมา ให้ทำตามข้างล่างได้เลยครับ
Note: พอคำถามถึง aws-region เราจะกรอก ap-southeast-1 ซึ่งเป็น region ของสิงคโปร์

Configuring SAM deploy
======================

    Looking for config file [samconfig.toml] :  Found
    Reading default arguments  :  Success

    Setting default arguments for 'sam deploy'
    =========================================
    Stack Name [sam-app]: ENTER
    AWS Region [us-west-2]: ap-southeast-1
    #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
    Confirm changes before deploy [Y/n]: n
    #SAM needs permission to be able to create roles to connect to the resources in your template
    Allow SAM CLI IAM role creation [Y/n]: ENTER
    #Preserves the state of previously provisioned resources when an operation fails
    Disable rollback [y/N]: ENTER
    HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
    Save arguments to configuration file [Y/n]: ENTER
    SAM configuration file [samconfig.toml]: ENTER
    SAM configuration environment [default]: ENTER

Note: กรณีได้ error ขึ้นมาแบบนี้ แสดงว่า AWS CLI หา region ไม่เจอ (แต่ถ้าปกติก็ข้ามมาข้างล่างได้เลย)

Error: No region information found. Please provide --region parameter or configure default region settings.

แก้ไขโดยการ deploy ใหม่โดยใส่ region ไปด้วย

$ sam deploy --region ap-southeast-1

↑กรณี deploy สำเร็จ ให้ copy path จาก Output ส่วนนี้
Output

แล้วลองส่ง GET Request โดยใช้ path ที่ได้มา

$ curl {Output Value} 

#ของผม path จะหน้าตาประมาณนี้
# curl https://4rnli4k925.execute-api.ap-southeast-1.amazonaws.com/Prod/hello/

ถ้าสำเร็จ จะมี message ตอบกลับมา

{"message": "hello world"}

การที่มี message ตอบกลับมาแสดงว่าทำการ Deploy สำเร็จ

และ CloudFormation stack ก็ถูกสร้างแล้ว โดยสามารถไปเช็คได้ที่ CloudFormation -> Stacks
และพิมพ์หา sam-app ในช่องเสิร์ช

Note: ให้หาใน Singapore Region เนื่องจากเราสร้างไว้ที่ region นี้

cloudformation-stack

โดยถ้าคลิกเข้าไปดูข้างใน จะเห็น resources หน้าตาประมาณอย่างนี้ครับ

sam-app

CloudFormation stack ถูกสร้างเสร็จเรียบร้อยตามภาพด้านบน เมื่อเราจะลบ เราสามารถคลิกปุ่ม Delete ที่ปุ่มขวาบน หรือสามารถพิมพ์ command ดังต่อไปนี้เพื่อลบ stack ที่ไม่ต้องการได้เช่นกัน

$ aws cloudformation delete-stack --stack-name sam-app

เมื่อ stack มีข้อความขึ้นอย่างนี้แสดงว่ากำลังลบอยู่ จนข้อความกลายเป็น DELETE_COMPLETE คือลบเสร็จสมบูรณ์
cloudformation-stack-delete

สุดท้ายนี้

จบไปแล้วนะครับกับบทความ แนะนำ AWS Serverless Application Model (AWS SAM) ปี 2025 หวังว่าผู้อ่านจะได้ประโยชน์ไปไม่มากก็น้อยนะครับ แล้วพบเจอกันใหม่บทความหน้าครับ สวัสดีครับ

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.