
แนะนำ AWS Serverless Application Model (AWS 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 ได้โดยง่ายครับ
เนื่องจากเราจะเจาะลึกฟังก์ชันของ AWS CloudFormation ด้วย หากท่านใดยังไม่คุ้นเคยเรื่อง AWS CloudFormation สามารถอ่านบทความเกี่ยวกับ AWS CloudFormation ได้ตามลิงค์ข้างล่างนี้ครับ
ข้อดีของการใช้ 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
- ติดตั้งโปรแกรมที่จำเป็น (SAM Cli ต้องใช้ python)
$ sudo su - #ไปที่ root
$ apt update
$ apt install -y python3 python3-pip unzip curl
- ดาวน์โหลดและติดตั้ง 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
- ตรวจสอบเวอร์ชัน SAM Cli เพื่อดูว่าติดตั้งเรียบร้อย
$ sam --version
# แสดงเวอร์ชัน เช่น SAM CLI, version 1.141.0
ทดลองทำภาคปฏิบัติ
ภาคปฏิบัตินี้อ้างอิงมาจาก Tutorial: Deploy a Hello World application with AWS SAM ซึ่งเราจะสร้างแอปพลิเคชันรูปแบบคล้ายภาพด้านล่างครับ
ที่พอเราเรียก Method:GET แล้วแอปพลิดคชั่นจะส่งกลับข้อความ "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. กันในตัวอย่าง
- เช็คเวอร์ชัน python
$ python --version
#python3.12
- ใช้ vi เพื่อแก้ไขไฟล์
$ vi template.yaml
พอเข้ามาแล้วให้กด i เพื่อแก้ไขไฟล์ ใช้ลูกศรคีย์บอร์ดเลื่อนลงมาที่ runtime และแก้ไขให้เวอร์ชันตรงกับเวอร์ชันของเครื่อง local
เสร็จแล้วให้กด 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
2. เพิ่ม IAM Role ใน EC2:
- กดเข้าไปใน Instance ---> แล้วคลิก Actions ที่มุมขวาบน
จากนั้นเลือก Security -> Modify IAM role
แล้วเลือก 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 ส่วนนี้
แล้วลองส่ง 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 นี้
โดยถ้าคลิกเข้าไปดูข้างใน จะเห็น resources หน้าตาประมาณอย่างนี้ครับ
CloudFormation stack ถูกสร้างเสร็จเรียบร้อยตามภาพด้านบน เมื่อเราจะลบ เราสามารถคลิกปุ่ม Delete ที่ปุ่มขวาบน หรือสามารถพิมพ์ command ดังต่อไปนี้เพื่อลบ stack ที่ไม่ต้องการได้เช่นกัน
$ aws cloudformation delete-stack --stack-name sam-app
เมื่อ stack มีข้อความขึ้นอย่างนี้แสดงว่ากำลังลบอยู่ จนข้อความกลายเป็น DELETE_COMPLETE คือลบเสร็จสมบูรณ์
สุดท้ายนี้
จบไปแล้วนะครับกับบทความ แนะนำ AWS Serverless Application Model (AWS SAM) ปี 2025 หวังว่าผู้อ่านจะได้ประโยชน์ไปไม่มากก็น้อยนะครับ แล้วพบเจอกันใหม่บทความหน้าครับ สวัสดีครับ