Hướng dẫn triển khai API Serverless với SAM và tự động hóa bằng GitHub Actions
Tổng quan
Trong thời đại công nghệ hiện nay, serverless computing đang trở thành xu hướng phổ biến nhờ khả năng giảm chi phí vận hành và tăng tính linh hoạt. AWS Serverless Application Model (SAM) là một công cụ mạnh mẽ giúp các nhà phát triển dễ dàng xây dựng và triển khai ứng dụng serverless trên AWS. Trong bài viết này, chúng ta sẽ tìm hiểu cách triển khai một API serverless đơn giản bằng SAM và tự động hóa quy trình triển khai bằng GitHub Actions, sử dụng xác thực OpenID Connect (OIDC) để tăng cường bảo mật.
Bài viết này sẽ hướng dẫn bạn qua các bước cụ thể, từ việc khởi tạo ứng dụng SAM, triển khai thủ công, đến thiết lập tự động hóa với GitHub Actions. Hướng dẫn được viết với giọng văn thân thiện, dễ hiểu, phù hợp cho cả người mới bắt đầu và người đã có kinh nghiệm với AWS.
Giới thiệu Lab
- Trình độ AWS: Người mới bắt đầu / Trung cấp
- Thời gian hoàn thành: Khoảng 45 phút
- Vùng AWS: US East (N. Virginia) us-east-1
- Chi phí hoàn thành: Có thể sử dụng Free Tier
- Dịch vụ sử dụng: AWS SAM, AWS Lambda, API Gateway, S3, IAM, GitHub Actions
Giới thiệu về AWS SAM
AWS SAM (Serverless Application Model) là một framework mã nguồn mở giúp các nhà phát triển xây dựng và triển khai ứng dụng serverless trên AWS. SAM sử dụng AWS CloudFormation để định nghĩa cơ sở hạ tầng và tài nguyên như Lambda Functions, API Gateway, và DynamoDB. Một số đặc điểm nổi bật của SAM:
- Hỗ trợ nhiều ngôn ngữ lập trình: Node.js, Java, Python, .NET, và Go.
- Cung cấp môi trường kiểm thử và gỡ lỗi cục bộ, giúp nhà phát triển kiểm tra mã trước khi triển khai.
- Tích hợp với AWS CodePipeline để hỗ trợ CI/CD.
- Cung cấp giao diện dòng lệnh (CLI) và tích hợp với AWS Toolkit for Visual Studio Code.
- Miễn phí sử dụng.
Một số lệnh SAM CLI phổ biến:
sam init
: Khởi tạo một ứng dụng serverless mới.sam build
: Chuẩn bị ứng dụng serverless cho kiểm thử cục bộ hoặc triển khai lên AWS.sam deploy
: Triển khai ứng dụng serverless lên AWS Cloud.sam delete
: Xóa tài nguyên của ứng dụng serverless bằng cách xóa CloudFormation stack.
Điều kiện tiên quyết
Trước khi bắt đầu, bạn cần chuẩn bị:
- Một tài khoản AWS .
- Một tài khoản GitHub.
- Git được cài đặt trên máy tính .
Kiến trúc ứng dụng
Ứng dụng mẫu trong hướng dẫn này là một API "Hello World" đơn giản, bao gồm:
- Một AWS Lambda Function xử lý các yêu cầu HTTP.
- Một API Gateway để cung cấp endpoint cho API.
- Một bucket S3 để lưu trữ artifact triển khai. (sam sẽ tự động tạo)
- CloudFormation để quản lý cơ sở hạ tầng.
Tài nguyên | Mô tả |
---|
Lambda Function | Xử lý logic của API |
API Gateway | Cung cấp endpoint để truy cập API |
S3 Bucket | Lưu trữ artifact triển khai |
CloudFormation | Quản lý và triển khai cơ sở hạ tầng |
Chi tiết các bước
Bước 0: Cài đặt Sam CLI
Lưu ý: Hiện tại phiên bản 1.42 đang có lỗi khi chạy lệnh deploy. Mọi người cài đặt bản 1.42 trở về trước nhé. Vào trang https://github.com/aws/aws-sam-cli/releases để download và install theo hướng dẫn ở đây nhé
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html
Bước 1: Khởi tạo ứng dụng SAM
Để bắt đầu, chúng ta sử dụng lệnh sam init
để tạo một ứng dụng mẫu.

- Chọn 1 - AWS Quick Start Templates

- Chọn template "Hello World Example".

- Chọn runtime là python (ấn y).

- Không enable X-Ray tracing

- Chọn không enable CloudWatch Application Insights

- Enable Json format

- Đặt tên dự án, ví dụ:
soa-sam-app
. 
Sau khi chạy lệnh, thư mục dự án sẽ có cấu trúc như sau:
└── soa-sam-app
├── 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
template.yaml
: Định nghĩa cơ sở hạ tầng của ứng dụng (Lambda Function, API Gateway, v.v.).hello_world/app.py
: Chứa mã nguồn của Lambda Function.
Bước 2: Xây dựng ứng dụng
Tiếp theo, chúng ta xây dựng ứng dụng bằng lệnh sam build
để chuẩn bị các artifact cần thiết cho triển khai.

Lệnh này sẽ:
- Tạo thư mục
.aws-sam
chứa các artifact đã được xây dựng. 
Bước 3: Triển khai ứng dụng lên AWS
Để triển khai ứng dụng, sử dụng lệnh sam deploy --guided
.

Lệnh này sẽ:
- Hướng dẫn bạn cấu hình các tham số như tên stack (ví dụ:
sam-app
), vùng AWS (ví dụ: us-east-1
), và bucket S3 để lưu trữ artifact. - Tạo CloudFormation stack để triển khai Lambda Function và API Gateway.
- Cung cấp URL của API Gateway sau khi triển khai thành công.
Các steps:
- Nhập stack name : SOA-Stack-Serverless-Application
- Region: us-east-1
- Confirm change: Y
- Cho phép SAM tự động tạo Role: Y
- Disable rollback: y
- Allow no authen: Y
- Save argument to file: Y
- SAM configuration file [samconfig.toml] nhấn Enter
- SAM configuration environment [default]: nhấn Enter

- Deploy this changeset? [y/N]: y
- Sau khi deploy xong các bạn có thể vào Cloudformation và thấy rằng SAM đã tự động tạo một stack để deploy các resource liên quan . Chúng ta có thể hiểu ngay rằng chúng ta vẫn đang sử dụng cloudformation để deploy chẳng qua SAM đã lo hết những công việc tay chân cho chúng ta mà thôi

Sau khi triển khai, bạn có thể kiểm tra API bằng cách gửi yêu cầu HTTP đến endpoint được cung cấp.
- Kiểm tra lambda funtion mới được tạo

- API Gateway

- Vào Stage > Prd > Copy Invoke URL

- Vào trình duyệt và test:
https://{Invoke URL}/hello

- Sau khi chạy xong các bước trên các bạn sẽ có file
samconfig.toml
Bước 4: Thiết lập OIDC trong AWS
Để tự động hóa triển khai bằng GitHub Actions mà không cần lưu trữ thông tin xác thực AWS lâu dài, chúng ta sử dụng xác thực OIDC.
A PhongNX đã có một bài giải thích rất kỹ vì sao nên sử dụ OIDC mình sẽ để link ở đây và không giải thích lại:
Tham khảo thêm bài của a Phong : Integrating GitHub Actions with AWS Using OIDC authentication
a. Tạo Identity Provider
- Truy cập AWS Management Console, vào IAM > Identity providers > Add provider.
- Chọn OpenID Connect.
- Nhập Provider URL:
https://token.actions.githubusercontent.com
. - Nhập Audience:
sts.amazonaws.com
. - Nhấn Add provider để hoàn tất.
b. Tạo IAM Role
- Trong IAM Console, vào Roles > Create role.
- Chọn Web identity và chọn Identity Provider vừa tạo (
token.actions.githubusercontent.com
). - Gắn các policy cần thiết:
AWSLambdaFullAccess
AmazonS3FullAccess
CloudFormationFullAccess
- (Tùy chọn)
AmazonAPIGatewayAdministrator
để quản lý API Gateway.
- Đặt tên role, ví dụ:
SOA-GitHubActions-SAMDeploy
. - Chỉnh sửa trust relationship của role:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::YOUR_ACCOUNT_ID:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:YOUR_GITHUB_USERNAME/YOUR_REPO_NAME:ref:refs/heads/main"
}
}
}
]
}
Sample của mình :

- Thay
YOUR_ACCOUNT_ID
bằng ID tài khoản AWS của bạn. - Thay
YOUR_GITHUB_USERNAME
và YOUR_REPO_NAME
bằng tên người dùng và kho lưu trữ GitHub của bạn.
Bước 5: Cấu hình GitHub Actions
Để tự động hóa triển khai, chúng ta tạo một workflow GitHub Actions.
- Trong kho lưu trữ GitHub, tạo thư mục
.github/workflows
và file deploy.yml
:
name: Apiapp auto build
on:
push:
paths:
- 'hello_world/**'
permissions:
id-token: write
contents: read
repository-projects: write
jobs:
deploy-sam:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/setup-sam@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ${{ secrets.AWS_REGION }}
- name: SAM Build
run: sam build
- name: SAM Deploy
run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --stack-name SOA-Stack-Serverless-Application --capabilities CAPABILITY_IAM --region us-east-1
- Đẩy mã nguồn lên GitHub:
git add .
git commit -m "Initial commit - AWS SAM API setup"
git push -u origin main
- Setting Secrect :
- Vào link :
https://github.com/{GIT_USERNAME}/{PROJECTNAME}/settings/secrets/actions
Thêm 2 secrect như bên dưới - Thay
AWS_ROLE_ARN
bằng ARN của role được tạo trong step Bước 4: Thiết lập OIDC trong AWS . - Thay
AWS_REGION
bằng us-east-1
. 
Bước 6: Test workflow:
- Sửa api bằng cách sử nội dung message:

- Sau đó commit và push
- Confirm Workflow được trigger Action tab . Và đợi đến khi build thành công :

- Refresh browser và xác nhận change đã được phản ánh

Bước 7: Dọn dẹp tài nguyên
Để tránh phát sinh chi phí, hãy xóa các tài nguyên sau khi hoàn tất:
- Xóa CloudFormation stack:
- Chạy lệnh:
sam delete --stack-name SOA-Stack-Serverless-Application
- Hoặc vào AWS Console > CloudFormation > Chọn stack >
SOA-Stack-Serverless-Application
> Delete.
- Xóa S3 bucket:
- Vào AWS Console > S3 > Chọn bucket > Empty > Delete.
- Xóa IAM Role:
- Vào IAM Console > Roles > Chọn
SOA-GitHubActions-SAMDeploy
> Delete.
- Xóa Identity Provider:
- Vào IAM Console > Identity providers > Chọn
token.actions.githubusercontent.com
> Delete.
Resouce:
Kết luận
Bằng cách sử dụng AWS SAM và GitHub Actions với xác thực OIDC, bạn có thể triển khai và tự động hóa các ứng dụng serverless một cách an toàn và hiệu quả. Phương pháp này không chỉ giúp tiết kiệm thời gian mà còn tăng cường bảo mật bằng cách loại bỏ nhu cầu lưu trữ thông tin xác thực lâu dài. Hãy thử áp dụng và khám phá thêm các tính năng của SAM và GitHub Actions để xây dựng các ứng dụng serverless mạnh mẽ hơn!