Ứng Dụng Todo Serverless Trên AWS Với Terraform và GitHub Actions
Giới thiệu
Khi bắt đầu dự án này, tôi không chỉ muốn xây dựng một ứng dụng todo đơn giản. Mục tiêu của tôi là tạo ra một sản phẩm không chỉ đẹp bên ngoài mà còn sẵn sàng cho sản xuất — điều này cho thấy những gì mà một kỹ sư DevOps thực sự làm.
Đó là cách mà Ứng Dụng Todo Serverless ra đời. Với một giao diện frontend nhẹ nhàng cho người dùng, nhưng đằng sau đó là một cấu hình AWS hoàn chỉnh: tính toán serverless, hạ tầng dưới dạng mã (Infrastructure as Code), và các pipeline CI/CD tự động.
🌱 Tại Sao Chọn Serverless?
Lựa chọn serverless là rõ ràng. Đối với các ứng dụng nhỏ (và thực sự, cho nhiều startup), serverless là lựa chọn tối ưu:
- Hoàn hảo cho các ứng dụng có lưu lượng truy cập không ổn định (như dự án phụ, MVP hoặc ứng dụng có mức sử dụng không đồng đều)
- Tự động mở rộng (và giảm xuống không)
- Chỉ trả tiền cho những gì bạn sử dụng (gần như không có chi phí khi không hoạt động)
- Độ khả dụng cao mặc định
Về cơ bản: nếu số lượng khách hàng của bạn không ổn định hoặc công việc của bạn không đều, serverless là lựa chọn tốt nhất.
🏗️ Kiến Trúc Ứng Dụng
Tôi đã thực hiện theo một cách tiếp cận ba tầng cổ điển — nhưng hoàn toàn serverless:
Frontend
- Ứng dụng React được lưu trữ trong S3
- CloudFront để phân phối nhanh chóng, toàn cầu
- OAC để không ai có thể truy cập S3 trực tiếp
Backend
- API Gateway để xử lý các yêu cầu
- Các hàm Lambda cho mỗi thao tác CRUD
- IAM với quyền hạn tối thiểu
Cơ Sở Dữ Liệu
- Bảng DynamoDB với
idlàm khóa băm - Tính phí theo yêu cầu — không lãng phí tài nguyên
Dưới đây là một phác thảo về cách tất cả hoạt động cùng nhau:
🔧 Hạ Tầng Dưới Dạng Mã Với Terraform
Thay vì nhấp chuột quanh bảng điều khiển AWS, mọi thứ được định nghĩa trong Terraform. Tôi đã chia nó thành các module:
frontend/→ Thiết lập S3 + CloudFrontbackend/→ API Gateway + Hàm Lambda + IAMdynamodb/→ Bảng key-value
Cách tiếp cận module này giúp dễ dàng thiết lập các môi trường phát triển, thử nghiệm và sản xuất. Chỉ cần thay đổi một tệp tfvars, và Terraform sẽ làm phần còn lại.
⚙️ Pipeline CI/CD
Hương vị DevOps thực sự đến từ đây. Tôi đã sử dụng GitHub Actions để tự động hóa việc triển khai:
- Pipeline frontend → Xây dựng ứng dụng React, đẩy lên S3, làm mới CloudFront
- Pipeline backend → Đóng gói và triển khai các hàm Lambda
- Pipeline hạ tầng → Kế hoạch/áp dụng Terraform với phát hiện độ trôi
Các triển khai sản xuất luôn yêu cầu phê duyệt thủ công — tôi muốn nó cảm thấy thực tế, không liều lĩnh.
🔍 Giám Sát & Bảo Mật
Một vài điểm không thể thỏa hiệp mà tôi đã tích hợp:
- Thống kê và cảnh báo CloudWatch cho các lỗi và độ trễ
- Phát hiện độ trôi Terraform (để phát hiện những thay đổi không mong muốn từ bảng điều khiển)
- IAM với quyền hạn tối thiểu cho mỗi Lambda
- CloudFront buộc HTTPS và ẩn bucket S3
Không có gì phức tạp, chỉ là những điều cơ bản được thực hiện đúng.
💸 Chi Phí Thân Thiện Mặc Định
Vì nó là serverless:
- Lambda chỉ tính phí khi thực thi
- DynamoDB tự động mở rộng
- Bộ nhớ đệm CloudFront giảm thiểu các truy cập backend
Trong các khoảng thời gian không hoạt động, toàn bộ hệ thống gần như không tốn chi phí.
🛠️ Những Gì Tôi Đã Học
- Module Terraform là một cứu tinh cho tính tái sử dụng
- Pipeline riêng biệt giúp hạ tầng, backend và frontend độc lập
- Gỡ lỗi serverless khó khăn hơn so với các ứng dụng truyền thống (nhật ký là bạn đồng hành tốt nhất)
- Khởi động lạnh tồn tại, nhưng bộ nhớ đệm và thiết kế có thể giảm thiểu sự khó chịu
🚀 Tại Sao Dự Án Này Quan Trọng
Nhìn thoáng qua, đây chỉ là một ứng dụng todo. Nhưng bên trong, nó là một nghiên cứu trường hợp DevOps thực sự:
- Hạ tầng dưới dạng mã
- CI/CD tự động
- Thiết kế bảo mật, có thể mở rộng, tiết kiệm chi phí
- Thực hành sẵn sàng cho sản xuất như giám sát, phát hiện độ trôi và cấu hình nhiều môi trường
📂 Mã Nguồn & Repo
Bạn có thể xem toàn bộ triển khai tại đây:
👉 Ứng Dụng Todo Serverless trên GitHub
Suy Nghĩ Cuối Cùng
Tôi đã xây dựng dự án này để cho thấy rằng ngay cả điều gì đó đơn giản cũng có thể chứng minh kỹ năng DevOps nghiêm túc khi được thiết kế với tư duy đúng đắn.
📬 Liên Hệ
Nếu bạn muốn kết nối, hợp tác hoặc thảo luận về DevOps, hãy liên hệ với tôi:
- Website: hasan-ashab
- GitHub: github.com/HasanAshab
- LinkedIn: linkedin.com/in/hasan-ashab
Các Thực Tiễn Tốt Nhất
- Luôn sử dụng IAM với quyền hạn tối thiểu cho mọi dịch vụ.
- Theo dõi và ghi lại tất cả các hoạt động trong AWS để đảm bảo an toàn.
Các Cạm Bẫy Thường Gặp
- Không cấu hình đúng IAM có thể dẫn đến lỗ hổng bảo mật.
- Bỏ qua giám sát có thể khiến bạn không nhận ra vấn đề sớm.
Mẹo Hiệu Suất
- Sử dụng bộ nhớ đệm để giảm thiểu thời gian phản hồi của các hàm Lambda.
- Tối ưu hóa truy vấn DynamoDB để tiết kiệm chi phí và tăng tốc độ.
Khắc Phục Sự Cố
- Nếu hàm Lambda không hoạt động như mong đợi, kiểm tra nhật ký CloudWatch để tìm lỗi.
- Đảm bảo tất cả các IAM roles được cấu hình chính xác để tránh lỗi truy cập.
Câu Hỏi Thường Gặp
1. Ứng dụng này có thể mở rộng không?
Có, ứng dụng này được thiết kế để mở rộng tự động với lưu lượng truy cập.
2. Tôi có thể triển khai ứng dụng này ở đâu khác không?
Có, bạn có thể triển khai ứng dụng này trên bất kỳ nền tảng serverless nào hỗ trợ Terraform.
3. Tôi có thể học hỏi thêm ở đâu?
Bạn có thể tham khảo tài liệu chính thức của AWS và Terraform để tìm hiểu sâu hơn.