🚀 Tự động hóa CI/CD trên AWS: Xây dựng, Triển khai, Lặp lại
Bạn có mệt mỏi khi phải triển khai ứng dụng của mình một cách thủ công mỗi khi bạn đẩy mã lên GitHub không? Hãy tưởng tượng rằng chỉ với vài cú nhấp chuột, bạn có thể tự động hóa toàn bộ quy trình — từ một lệnh commit trên GitHub cho đến ứng dụng của bạn chạy trực tiếp trên một EC2 instance.
Trong bài hướng dẫn này, tôi sẽ hướng dẫn bạn cách AWS Developer Tools — bao gồm CodeBuild, CodeDeploy, và CodePipeline — làm việc cùng nhau để tạo ra một quy trình triển khai liên tục. Không còn phải SSH vào EC2, không còn bước nào bị bỏ lỡ — chỉ cần commit, build, deploy, lặp lại.
🔧 Các yêu cầu trước khi bắt đầu
Trước khi bắt đầu với AWS, đây là những gì bạn cần:
- Hệ thống kiểm soát phiên bản: GitHub (bạn cũng có thể sử dụng CodeCommit, nhưng ở đây chúng ta sẽ sử dụng GitHub).
- Máy chủ tính toán: EC2 instance.
- Công cụ CI/CD: CodePipeline, CodeBuild, CodeDeploy.
- IAM Roles: Chúng ta sẽ tạo vai trò dịch vụ cho CodePipeline, CodeBuild và CodeDeploy, cũng như một profile cho EC2.
- Ứng dụng mẫu: Điều này có thể hoạt động với bất kỳ công nghệ nào — Node.js, Python, Java, hoặc thậm chí là một trang web tĩnh.
- 👉 Nếu bạn không có sẵn, hãy tự do fork repo GitHub của tôi và sử dụng nó làm ứng dụng mẫu của bạn.
- Liên kết đến repo GitHub của tôi: AWS-CI-CD-DEMO
Bước 1: Tạo một EC2 Instance
- Truy cập vào EC2 Console → Khởi chạy một instance mới.
- Chọn Amazon Linux 2 (đủ điều kiện miễn phí).
- Tạo/gán một nhóm bảo mật cho phép:
- Cổng 22 (SSH) → để bạn có thể kết nối đến nó.
- Cổng 3000 (hoặc bất kỳ cổng nào ứng dụng của bạn chạy trên đó) → để bạn có thể truy cập ứng dụng trong trình duyệt.
Khi Instance của bạn đã sẵn sàng, bạn có thể sử dụng ssh để kết nối đến Instance của mình hoặc cách dễ nhất là sử dụng EC2 Instance Connect.
Sau khi kết nối đến Console, chúng ta cần cài đặt node.js và Codedeploy agent.
👉 Nhưng chờ đã, CodeDeploy Agent là gì?
Hãy nghĩ về nó như một sứ giả sống bên trong EC2 instance của bạn. Khi AWS CodeDeploy thực hiện một đợt triển khai, agent là người:
- Lắng nghe các hướng dẫn từ dịch vụ CodeDeploy.
- Kéo các tệp ứng dụng (artifacts) từ S3 hoặc GitHub.
- Chạy các script mà bạn định nghĩa trong tệp appspec.yml (như cài đặt phụ thuộc, khởi động lại ứng dụng, v.v.).
Nếu không có agent, EC2 của bạn không biết rằng CodeDeploy tồn tại — vì vậy nó là một điều cần thiết.
Cài đặt Node.js và CodeDeploy Agent
bash
# Cập nhật các gói
sudo yum update -y
# Cài đặt Node.js và npm
sudo yum install -y nodejs npm
# Cài đặt CodeDeploy Agent
sudo yum install -y ruby wget
cd /home/ec2-user
wget https://aws-codedeploy-<your-region>.s3.<your-region>.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent start
Hãy chắc chắn thay thế {your-region} cho phù hợp với khu vực của bạn, trong trường hợp của tôi là ap-south-1.
✅ Xác minh CodeDeploy Agent
Bây giờ chúng ta đã cài đặt CodeDeploy agent, hãy chắc chắn rằng nó thực sự đang chạy.
Chạy lệnh sau:
bash
sudo systemctl status codedeploy-agent.service
Bước 2: Thiết lập Ứng dụng CodeDeploy
Bây giờ chúng ta đã tạo một EC2 instance và cũng thiết lập CodeDeploy agent trên EC2, hãy thiết lập Ứng dụng CodeDeploy.
Một Ứng dụng CodeDeploy = chỉ là một container đại diện cho ứng dụng của bạn trên AWS.
1️⃣ Tạo một Ứng dụng CodeDeploy
- Truy cập vào AWS CodeDeploy Console → Applications → Tạo ứng dụng.
- Đặt tên cho nó (ví dụ: cicd-demo-app).
- Chọn nền tảng tính toán → EC2/On-premises.
2️⃣ Tạo một Nhóm Triển khai:
Trong ứng dụng của bạn, nhấp vào Tạo nhóm triển khai.
- Đặt tên cho nó (ví dụ: cicd-app-deployment-grp).
Vai trò dịch vụ:
Bạn sẽ cần một vai trò dịch vụ cho CodeDeploy (một cái gì đó như CodeDeployServiceRole).
- Gán chính sách quản lý: AWSCodeDeployRole.
Điều này cho phép CodeDeploy giao tiếp với EC2 của bạn.
Tạo một Vai trò dịch vụ cho CodeDeploy:
- Truy cập vào IAM Console → Roles → Tạo vai trò.
- Đối với loại thực thể đáng tin cậy, chọn AWS service.
- Đối với trường hợp sử dụng, chọn CodeDeploy → CodeDeploy.
- Nhấn Next và gán chính sách quản lý:
- AWSCodeDeployRole (điều này cung cấp cho CodeDeploy các quyền cần thiết).
- Đặt tên cho vai trò (ví dụ: CodeDeployServiceRole).
- Nhấn Tạo vai trò.
Cấu hình môi trường:
- Chọn Amazon EC2 instances.
- Chọn EC2 của bạn bằng các Tag, trong trường hợp của tôi là server.
Cài đặt triển khai:
Chọn “Một lần” để đơn giản (triển khai an toàn).
Khi hoàn tất, CodeDeploy sẽ biết:
👉 “Ứng dụng này được triển khai đến EC2 này với những quy tắc này.”
Bước 3: Tạo một Dự án CodeBuild
Bây giờ chúng ta đã tạo và thiết lập CodeDeploy mà thực sự biết nơi để triển khai ứng dụng của chúng ta (EC2).
1️⃣ Truy cập vào CodeBuild Console
- Nhấp vào Tạo dự án build.
- Đặt tên cho nó (ví dụ: cicd-demo-build).
2️⃣ Cấu hình Nguồn
- Nhà cung cấp nguồn: GitHub (kết nối repo của bạn hoặc repo đã fork). Hoặc bạn có thể chọn tùy chọn repo công khai và dán liên kết repo GitHub của tôi.
3️⃣ Môi trường
- Hình ảnh môi trường: Hình ảnh được quản lý.
- Hệ điều hành: Amazon Linux 2.
- Runtime: Standard.
- Vai trò dịch vụ: Tạo một vai trò mới (CodeBuild sẽ tự động làm điều này).
4️⃣ Buildspec
Tệp buildspec.yml cho biết cách thức chính để CodeBuild hoạt động. Nó cho AWS biết chính xác cách để xây dựng ứng dụng của bạn — liệu đó có phải là cài đặt phụ thuộc, chạy thử nghiệm, hoặc đóng gói tệp.
Tôi đã đẩy tệp buildspec.yml riêng của mình vào repo GitHub, vì vậy CodeBuild sẽ tự động lấy nó trong giai đoạn build.
👉 Tóm lại, đây là nơi chúng ta định nghĩa:
- Cách cài đặt phụ thuộc
- Cách chạy các bước build/test
- Tệp nào nên được gói thành artifacts cho triển khai
✅ CodeBuild Hoàn tất Thành công!
Chúng ta đã thiết lập và hoàn thành dự án CodeBuild, và ứng dụng của chúng ta giờ đây có thể được xây dựng tự động bằng cách sử dụng các hướng dẫn mà chúng ta đã định nghĩa trong tệp buildspec.yml. (YAML xử lý việc cài đặt phụ thuộc, build, và tạo artifacts).
- Bước tiếp theo là tổ chức toàn bộ quy trình CI/CD — và đó chính xác là nơi AWS CodePipeline xuất hiện.
🚀 CodePipeline là gì?
AWS CodePipeline là một dịch vụ CI/CD hoàn toàn quản lý, tự động hóa quy trình phát hành phần mềm. Nó kết nối các giai đoạn khác nhau của quá trình phát hành — Nguồn → Build → Kiểm tra → Triển khai — thành một pipeline liên tục.
- Với CodePipeline, mỗi khi bạn đẩy mã vào kho lưu trữ của mình:
- Pipeline tự động phát hiện sự thay đổi (qua webhook hoặc polling).
- Nó kích hoạt CodeBuild để xây dựng và thử nghiệm ứng dụng.
- Khi các artifacts đã sẵn sàng, nó sẽ chuyển chúng cho CodeDeploy (hoặc một dịch vụ triển khai khác).
- Ứng dụng được triển khai đến môi trường mục tiêu (EC2, ECS, Lambda, v.v.).
1️⃣ Truy cập vào CodePipeline trong AWS Console
Mở AWS Management Console → Tìm kiếm CodePipeline → Nhấp vào Tạo pipeline và chọn Xây dựng một pipeline tùy chỉnh.
2️⃣ Cài đặt Pipeline
- Tên pipeline → cicd-demo-pipeline (bạn có thể đặt tên tùy ý).
- Vai trò dịch vụ → Chọn “Vai trò dịch vụ mới” (AWS sẽ tự động tạo một vai trò cho CodePipeline với các mối quan hệ tin cậy đúng).
- Để cài đặt nâng cao mặc định → Nhấn Next.
3️⃣ Thêm Giai đoạn Nguồn
Đây là nơi mã của chúng ta đến từ (GitHub trong trường hợp này).
- Nhà cung cấp nguồn → GitHub (v2).
- Kết nối với GitHub → Ủy quyền tài khoản GitHub của bạn với AWS.
- Kho lưu trữ → Chọn repo của bạn.
- Nhánh → main (hoặc bất kỳ nhánh nào bạn muốn triển khai).
- Phát hiện sự thay đổi → Để mặc định (CodePipeline sử dụng webhooks để phát hiện các commit mới).
- Nhấn Next.
4️⃣ Thêm Giai đoạn Build
- Bây giờ chúng ta kết nối dự án CodeBuild mà chúng ta đã tạo trước đó.
- Nhà cung cấp build → AWS CodeBuild.
- Tên dự án → Chọn dự án mà bạn vừa tạo.
- Nhấn Next.
5️⃣ Thêm Giai đoạn Triển khai
- Đây là nơi các artifacts đã được xây dựng được triển khai lên EC2 instance của bạn bằng CodeDeploy.
- Nhà cung cấp triển khai → AWS CodeDeploy.
- Tên ứng dụng → Chọn ứng dụng CodeDeploy mà bạn đã tạo.
- Nhóm triển khai → Chọn nhóm triển khai.
- Nhấn Next.
6️⃣ Xem lại & Tạo
- Kiểm tra mọi thứ → Nhấn Tạo pipeline.
- AWS sẽ ngay lập tức kích hoạt pipeline lần đầu tiên.
- Bạn sẽ thấy các giai đoạn: Nguồn → Build → Triển khai với các cập nhật trạng thái trực tiếp.
🚨 Có gì đó thất bại!!! Đừng hoảng sợ, điều này là bình thường. 😂
Điều này là bình thường nếu EC2 instance của bạn vẫn chưa có IAM Instance Profile đúng gán.
Tại sao điều này xảy ra?
Bởi vì agent CodeDeploy đang chạy bên trong EC2 cần quyền để giao tiếp với CodeDeploy và kéo artifacts từ S3. Nếu không có vai trò IAM gán, agent không có thông tin xác thực → vì vậy việc triển khai sẽ thất bại.
👉 Khắc phục: Truy cập vào EC2 instance của bạn → gán một vai trò IAM (Instance Profile) với các quyền như AmazonS3ReadOnlyAccess và AWSCodeDeployRole. Khi đã thêm, hãy chạy lại việc triển khai và nó sẽ thành công.
- Chúng ta đã gán AmazonS3ReadonlyAccess và AWSCodeDeployRole.
✅ Và đây rồi — Thành công! 🎉
Sau khi gán đúng IAM Instance Profile cho EC2 và chạy lại pipeline, mọi thứ hoạt động suôn sẻ.
- Giai đoạn Nguồn → đã lấy mã từ GitHub
- Giai đoạn Build → CodeBuild đã cài đặt các phụ thuộc và đóng gói ứng dụng
- Giai đoạn Triển khai → agent CodeDeploy đã kéo artifacts và triển khai nó lên EC2.
🌐 Truy cập Ứng dụng của Chúng Ta
Bây giờ mà pipeline của chúng ta đã triển khai thành công, hãy xác nhận mọi thứ đang hoạt động.
- Tôi đã mở địa chỉ IP công cộng của EC2 trong trình duyệt tại cổng 3000 — và boom, ứng dụng Node.js của chúng ta đã hoạt động! 🚀
- Phần tốt nhất? Tôi không cần phải SSH vào máy chủ hoặc sao chép tệp thủ công. Tất cả đều được tự động hóa qua CodePipeline → CodeBuild → CodeDeploy.
👉 Tiếp theo, hãy kiểm tra phép màu thực sự của CI/CD: chúng ta sẽ thực hiện một thay đổi nhỏ thủ công trên GitHub, đẩy mã lên, và xem pipeline tự động nhận diện và triển khai phiên bản 2 lên EC2.
Sau khi thực hiện một thay đổi nhỏ trong mã của tôi, tôi đã đẩy nó lên nhánh chính trên GitHub.
Chỉ trong vài giây, CodePipeline đã phát hiện cập nhật, tự động kích hoạt một lần chạy mới và bắt đầu thực hiện lại các giai đoạn — Nguồn → Build → Triển khai.
🌟 Phiên bản 2 đã được triển khai thành công
Sau khi pipeline hoàn tất chạy, tôi đã mở ứng dụng trong trình duyệt một lần nữa tại cổng 3000, và các thay đổi từ phiên bản 2 đã được áp dụng!
Điều này chứng tỏ rằng pipeline CI/CD của chúng ta hoàn toàn hoạt động: mỗi khi bạn đẩy một commit lên GitHub, CodePipeline phát hiện nó, CodeBuild đóng gói nó, và CodeDeploy triển khai nó — tất cả đều tự động. Không cần can thiệp thủ công, không bỏ lỡ bước nào.
✅ Kết luận / Những điều cần lưu ý
- Tự động hóa là sức mạnh: Khi đã được thiết lập, pipeline của bạn sẽ xử lý mỗi commit, mỗi build và mỗi triển khai.
- CodePipeline = nhạc trưởng: Nó kết nối Nguồn → Build → Triển khai một cách liền mạch.
- CodeBuild = nhà xây dựng: Đóng gói và chuẩn bị các artifacts ứng dụng của bạn.
- CodeDeploy = đại lý giao hàng: Đưa mã đến các instance EC2 và chạy các script vòng đời.
- IAM Roles rất quan trọng: Cả vai trò dịch vụ CodeDeploy và profile instance EC2 đều rất quan trọng cho quyền truy cập.