0
0
Lập trình
Admin Team
Admin Teamtechmely

🚀 CI/CD với Terraform và GitHub Actions trên AWS

Đăng vào 2 tuần trước

• 9 phút đọc

💡 Giới thiệu

Chào mừng bạn đến với thế giới pipelines và tự động hóa 🚀. Trong hướng dẫn này, chúng ta sẽ khám phá một dự án thú vị, nơi chúng ta triển khai một ứng dụng Node.js + Redis trên AWS bằng TerraformGitHub Actions để tích hợp liền mạch.

Hướng dẫn này được thiết kế cho người mới bắt đầu — vì vậy ngay cả khi bạn chỉ vừa bắt đầu với DevOps hoặc tự động hóa đám mây, bạn cũng sẽ có thể theo dõi từng bước.

Ứng dụng này rất đơn giản nhưng thực tiễn: một ứng dụng Đếm Yêu Cầu theo dõi số lần truy cập và lưu trữ dữ liệu trong Redis. Nhưng điều kỳ diệu thực sự không phải là ứng dụng — mà là cách chúng ta sẽ thiết lập Hạ Tầng như Mã (IaC) với Terraform, kết hợp nó với CI/CD GitHub Actions, và xem mọi thứ kết nối như thế nào.

Vậy hãy cùng nhau bắt tay vào thực hành nhé! 💡


🛠 Các yêu cầu trước khi bắt đầu

Trước khi bắt tay vào dự án, hãy đảm bảo hệ thống của bạn đã sẵn sàng với tất cả các yêu cầu cần thiết. Đây là những gì bạn cần:

  • Tài khoản AWS + Người dùng IAM với Quyền quản trị (chỉ để thử nghiệm, trong môi trường sản xuất luôn sử dụng PLOP). Vì chúng ta sẽ tạo hạ tầng trên AWS, bạn cần một người dùng IAM với quyền truy cập phù hợp và AWS CLI được cấu hình cục bộ.
    👉 Nếu bạn mới với điều này, đừng lo — tôi đã giải thích toàn bộ quy trình thiết lập (người dùng IAM, AWS CLI, và cài đặt Terraform) trong một trong những bài viết trước của tôi: Hướng Dẫn Triển Khai Ứng Dụng Ba Tầng trên AWS EKS Sử Dụng Terraform với Các Thực Hành Tốt Nhất.

  • Docker & Docker Compose: Ứng dụng của chúng ta chạy trong các container, vì vậy Docker và Docker Compose là điều bắt buộc. Bạn có thể cài đặt chúng dễ dàng từ tài liệu chính thức: Cài Đặt Docker.

✅ Khi tất cả được cấu hình, chúng ta đã sẵn sàng để bắt đầu xây dựng và tự động hóa dự án này!


🚀 Bắt đầu với dự án

Mã nguồn hoàn chỉnh cho dự án này có sẵn trên kho GitHub của tôi:
👉 nginx-node-redis

Để bắt đầu, hãy fork kho này về tài khoản GitHub của bạn và sau đó clone nó về máy tính cá nhân bằng các lệnh sau:

bash Copy
git clone https://github.com/<tên-người-dùng-của-bạn>/nginx-node-redis.git
cd nginx-node-redis/

Tại sao lại chọn kho này?
Dự án này ban đầu đến từ bộ sưu tập dockersamples chính thức của Docker. Nó là một ứng dụng Node.js + Redis đơn giản với NGINX làm bộ cân bằng tải phía trước. Mỗi khi bạn làm mới trang, bộ đếm sẽ tăng lên và bạn cũng sẽ thấy tên máy chủ (web1 hoặc web2) phục vụ yêu cầu của bạn.

Tôi đã lấy dự án cơ bản đó và nâng cấp nó để làm cho nó hấp dẫn và thân thiện với sản xuất hơn.

🔑 Các điểm nổi bật của dự án

  • web/server.js → Ứng dụng Node.js cơ bản kết nối với Redis trên cổng 6379 và trả về:

    • Số lần truy cập (tăng lên với mỗi lần làm mới)
    • Tên máy chủ (web1 hoặc web2) phục vụ yêu cầu
    • Chạy trên cổng 5000
    • Hiện đã được nâng cấp với một giao diện HTML đẹp thay vì văn bản đơn giản 🎨
  • nginx/nginx.conf → Cấu hình tùy chỉnh với:

    • Một bộ cân bằng tải upstream trỏ đến web1:5000web2:5000
    • Các quy tắc proxy pass để phân phối lưu lượng đều
    • Dockerfile thay thế cấu hình NGINX mặc định bằng cấu hình tùy chỉnh của chúng ta
  • docker-compose.yml → Kết hợp mọi thứ lại với nhau:

    • Container Redis (cơ sở dữ liệu)
    • Hai container Node.js (web1web2)
    • Container NGINX (đóng vai trò là proxy ngược và bộ cân bằng tải)

✅ Các cải tiến của tôi

  • ✨ Cải thiện UI trong web/server.js

  • 📦 Thêm cấu hình Terraform (terra-config/) để triển khai ứng dụng trên AWS

  • ⚡ Thêm workflow GitHub Actions (.github/workflows/main.yml) để tự động hóa CI/CD

Với những thay đổi này, dự án không chỉ là một demo — nó đã trở thành một hệ thống mini chất lượng sản xuất mà bạn có thể triển khai chỉ với một lần đẩy.


🐳 Kiểm tra cục bộ với Docker Compose

Trước khi triển khai ứng dụng này trên AWS bằng Terraform, hãy kiểm tra nó cục bộ để đảm bảo mọi thứ hoạt động như mong đợi.

Đi đến thư mục gốc của dự án và chạy lệnh sau:

bash Copy
docker-compose up --build

✅ Lệnh này sẽ:

  • Xây dựng các hình ảnh Docker cho Redis, máy chủ web Node.js, và NGINX
  • Khởi động tất cả các container theo thứ tự chính xác
  • Công khai ứng dụng thông qua NGINX trên cổng 80

Nếu mọi thứ được thiết lập đúng cách, bạn sẽ thấy nhật ký xác nhận rằng các container đang chạy. Điều quan trọng nhất là hãy tìm thông điệp này trong terminal của bạn:

Copy
The web server is listening on Port 5000.

Bây giờ, mở trình duyệt của bạn và truy cập 👉 http://localhost:80

🎉 Bạn sẽ thấy ứng dụng đang hoạt động!

  • Mỗi khi bạn làm mới trang, bộ đếm sẽ tăng lên +1
  • Tên máy chủ sẽ thay đổi giữa web1web2, cho thấy rằng việc cân bằng tải đang hoạt động hoàn hảo

Bước này xác nhận rằng Docker + NGINX + Redis setup là vững chắc trước khi chúng ta chuyển sang triển khai trên đám mây.


⚡ Tích hợp GitHub Actions và Terraform

Bây giờ ứng dụng của chúng ta đã hoạt động cục bộ, hãy tự động hóa việc triển khai với GitHub Actions + Terraform. Điều này sẽ cho phép chúng ta:

  • Tự động cấp phát hạ tầng trên AWS
  • Triển khai ứng dụng lên một EC2 instance
  • Thực hiện kiểm tra sức khỏe
  • Dọn dẹp tài nguyên sau khi kiểm tra (để tiết kiệm 💰 cho hóa đơn AWS)

🔑 Bước 1: Thêm Secrets AWS

  • Truy cập vào Dashboard GitHub của bạn → mở repo nginx-node-redis
  • Điều hướng đến Cài đặt > Secrets và Biến > Actions
  • Thêm các Repository Secrets sau (từ người dùng IAM mà bạn đã tạo trước đó):
    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY

🏗 Bước 2: Cấu hình Terraform

Trong tệp terra-config/main.tf:

  • Sử dụng default VPC
  • Lấy Ubuntu AMI mới nhất
  • Tạo một Security Group với cổng 22 (SSH)cổng 80 (HTTP) được mở
  • Cung cấp một EC2 instance t2.micro sử dụng SG và AMI đó
  • Bao gồm một user-data script cài đặt Docker, Docker Compose, và chạy ứng dụng của chúng ta

📌 Tóm lại: Terraform xử lý tất cả việc tạo hạ tầng và khởi động một EC2 instance chạy ứng dụng Đếm Yêu Cầu của chúng ta.

⚠️ Thay đổi Quan trọng:
Trong phần user_data của main.tf, hãy cập nhật URL kho GitHub để trỏ đến kho đã fork của bạn:

bash Copy
git clone https://github.com/<tên-người-dùng-github-của-bạn>/nginx-node-redis.git

⚙️ Bước 3: Workflow GitHub Actions

Pipeline .github/workflows/main.yml sẽ được kích hoạt khi có push hoặc pull requests. Dưới đây là những gì xảy ra từng bước:

  1. Checkout kho
  2. ⚙️ Thiết lập Terraform
  3. 📂 Chạy terraform init, terraform validate, terraform plan
  4. 🚀 Áp dụng hạ tầng với terraform apply
  5. Chờ 90 giây → cho phép user-data hoàn thành thiết lập Docker + ứng dụng
  6. 🌍 Lấy địa chỉ IP công khai của EC2 instance
  7. 🔎 Kiểm tra sức khỏe → đảm bảo ứng dụng đang hoạt động
  8. ⏱ Giữ ứng dụng chạy trong 5 phút
  9. 🧹 Tự động dọn dẹp với terraform destroy → đảm bảo không còn tài nguyên AWS không sử dụng nào

▶️ Bước 4: Kích hoạt Workflow

Sau khi bạn đã cập nhật URL kho của mình trong main.tf, hãy commit và push các thay đổi:

bash Copy
git status
git add terra-config/main.tf
git commit -m "Cập nhật URL kho GitHub"
git push origin main

Lần push này sẽ kích hoạt workflow GitHub Actions, tự động triển khai ứng dụng của bạn lên AWS.


🚀 Kiểm tra triển khai trên AWS

Khi mọi thứ đã được thiết lập, đã đến lúc quan sát phép màu xảy ra ✨.

  • Đi đến Dashboard Repo GitHub của bạn
  • Nhấp vào Actions
  • Tìm commit gần đây của bạn — ví dụ:
    Copy
    "Cập nhật URL kho GitHub"
  • Mở chạy workflow → bạn sẽ thấy công việc terraform thực hiện từng bước.

🟢 Chờ cho đến khi workflow đến “Giữ Ứng Dụng Chạy”. Tại thời điểm này, Terraform đã tạo ra EC2 instance của bạn, cài đặt Docker & Docker Compose, và khởi động ứng dụng.

👉 Nhấp vào URL Công Khai hiển thị trong nhật ký, và… Viola! 🎉
Ứng dụng Đếm Yêu Cầu của bạn bây giờ đã hoạt động trên một EC2 instance AWS 🚀.

  • Bạn có thể tương tác với ứng dụng trong 5 phút
  • Mỗi lần làm mới sẽ tăng bộ đếm
  • Các yêu cầu được phân phối giữa web1web2 thông qua bộ cân bằng tải Nginx

⏳ Sau 5 phút, GitHub Actions sẽ tự động thực hiện terraform destroy để dọn dẹp tài nguyên và tránh hóa đơn AWS không cần thiết 💸.


🔄 Tình Huống Thực Tế: Cập Nhật Ứng Dụng Của Bạn Ngay Lập Tức

Bây giờ ứng dụng của chúng ta đã hoạt động, hãy mô phỏng một thay đổi sản xuất thực tế.
Hãy tưởng tượng quản lý của bạn nói:

"Này, bạn có thể cập nhật tiêu đề từ Chào mừng đến với Đếm Yêu Cầu thành Chào mừng đến với Đếm Yêu Cầu Tuyệt Vời Của Tôi không?"

Dưới đây là cách đơn giản để thực hiện với GitHub Actions + Terraform:

  • Mở tệp web/server.js trong dự án của bạn
  • Tìm thẻ HTML <h1> và cập nhật nó:
    html Copy
    <h1>Chào mừng đến với Đếm Yêu Cầu Tuyệt Vời Của Tôi</h1>
  • Đẩy các thay đổi lên kho của bạn:
    bash Copy

git status
git add web/server.js
git commit -m "Đã thay đổi tiêu đề"
git push origin main

Copy
🎉 Đó là tất cả! GitHub Actions sẽ nhận diện các thay đổi, kích hoạt workflow, và trong **5 phút** tiêu đề đã được cập nhật sẽ **trực tiếp trên EC2 instance**.

⚡ Đây chính là **sức mạnh của các pipeline CI/CD** — không cần SSH vào máy chủ, không cần triển khai bằng tay. Chỉ cần đẩy mã của bạn và để **Terraform + GitHub Actions** xử lý phần còn lại 🚀.

---

## 🏁 Kết luận
Trong bài viết này, chúng ta đã biến một **ứng dụng đếm yêu cầu Node.js + Redis** đơn giản thành một ứng dụng được nâng cấp với **Nginx, Docker, Terraform, và GitHub Actions**.

Những gì bắt đầu như một demo cục bộ đã nhanh chóng chuyển thành một **pipeline CI/CD tự động sẵn sàng cho đám mây**:
* 🚀 **Docker + Docker Compose** xử lý kiểm tra cục bộ và đóng gói container
* ⚡ **Terraform** cấp phát hạ tầng AWS một cách liền mạch
* 🔄 **GitHub Actions** tự động hóa việc triển khai và dọn dẹp, mang lại cho chúng ta một quy trình làm việc sạch sẽ và tiết kiệm chi phí
* 🎯 Và quan trọng nhất — chúng ta đã thấy cách dễ dàng để thực hiện các thay đổi thời gian thực chỉ với một `git push`.

Dự án này chứng minh rằng **hạ tầng như mã + tự động hóa** có thể tiết kiệm hàng giờ làm việc lặp đi lặp lại cho các nhà phát triển và làm cho quy trình làm việc sẵn sàng cho sản xuất đáng tin cậy hơn.

Cảm ơn bạn đã theo dõi — tôi hy vọng điều này sẽ truyền cảm hứng cho bạn xây dựng các **pipeline Terraform + GitHub Actions** của riêng mình!

📬 **Hãy kết nối**:
* 🌐 Website: praveshsudha.com
* 💼 LinkedIn: Pravesh Sudha
* 🐦 Twitter/X: @praveshstwt
* 📺 YouTube: Pravesh Sudha
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào