🚀 Chapter 2 — Automation: Phần C — Thiết lập CD với CodeDeploy (not check yet)
SSH = “Đăng nhập vào server và tự chạy lệnh.”
SSM = “AWS gửi lệnh đến server để chạy, không cần SSH.”
CodeDeploy = “AWS quản lý cả quá trình deployment: lấy artifact → đưa lên server → chạy appspec.yml → thực hiện các bước deploy.”
1. Kiến trúc

2. Thiết lập EC2
Step 1. Chuẩn bị EC2
SSH vào EC2:
ssh -i ./chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>
Kiểm tra project:
cd ./todo-list-app
docker compose ps
Đảm bảo app đang chạy như Chapter 1.
Step 2. Cài CodeDeploy Agent trên EC2
Kiểm tra:
sudo systemctl status codedeploy-agent
Nếu chưa có, cài:
sudo apt update
sudo apt install -y ruby-full wget
Download CodeDeploy Agent:
cd /tmp
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
Nếu EC2 của bạn ở Tokyo (ap-northeast-1) thì dùng command trên.
Cấp quyền:
chmod +x ./install
Cài:
sudo ./install auto
Kiểm tra:
sudo systemctl status codedeploy-agent
Kết quả cần là:
Active: active (running)
"CodeDeploy Agent là gì? Tại sao phải cài nó trên EC2?"
- Agent là một service chạy ngầm trên EC2.
- AWS CodeDeploy không trực tiếp SSH vào server của bạn; nó chỉ gửi tín hiệu thông báo cho Agent trên EC2 biết để Agent tự kéo code (artifact) từ S3/GitHub về và thực thi các script
Step 3. Tạo IAM Role cho EC2
AWS Console:
IAM
↓
Roles
↓
Create role
Chọn:
AWS service
↓
EC2
Tạm thời attach:
AmazonS3ReadOnlyAccess
Role:
chapter2-codedeploy-ec2-role
CodeDeploy Agent cần EC2 có quyền lấy deployment artifact từ S3.
Step 4. Gắn Role vào EC2
EC2
↓
Instances
↓
Chọn EC2
↓
Actions
↓
Security
↓
Modify IAM role
Chọn:
chapter2-codedeploy-ec2-role
Save.
3. Thiết lập CodeBuild lưu artifact
Step 1. Tạo CodeBuild artifact
CodeDeploy cần lấy artifact từ S3.
Trong CodeBuild project:
Edit
↓
Artifacts
Chọn:
Amazon S3
Ví dụ:
Bucket:
chapter2-todo-artifacts
Artifact name:
todo-list-app.zip
CodeBuild sẽ tạo:
GitHub
↓
CodeBuild
↓
todo-list-app.zip
↓
S3
Step 2. Cấp quyền cho CodeBuild upload S3
IAM Role của CodeBuild:
chapter2-codebuild-role
Cần quyền upload artifact vào S3.
Cho lab có thể attach:
AmazonS3FullAccess
Sau này nên giới hạn xuống đúng bucket:
s3:PutObject
s3:GetObject
4. Thiết lập CodeDeploy
Step 1. Tạo IAM Role cho CodeDeploy
Vào:
IAM
↓
Roles
↓
Create role
Chọn:
AWS service
↓
CodeDeploy
Use case:
CodeDeploy
Attach:
AWSCodeDeployRole
Tên:
chapter2-codedeploy-service-role
Step 2. Tạo file appspec.yml
Trong repository:
todo-list-app/
├── appspec.yml
├── buildspec.yml
├── compose.yaml
├── Dockerfile
└── ...
Tạo:
touch appspec.yml
Nội dung:
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/todo-list-app
hooks:
AfterInstall:
- location: scripts/deploy.sh
timeout: 300
runas: ubuntu
appspec.yml là file CodeDeploy sử dụng để biết deploy file nào vào đâu và chạy lifecycle script nào.
"File appspec.yml bắt buộc phải để ở đâu?"
- Phải đặt ở thư mục gốc (root) của repository/artifact.
- Nếu để sai vị trí, CodeDeploy Agent sẽ không đọc được và báo lỗi.
Step 3. Tạo deployment script
Tạo thư mục:
mkdir -p scripts
Tạo:
touch scripts/deploy.sh
Nội dung:
#!/bin/bash
set -e
cd /home/ubuntu/todo-list-app
docker compose build
docker compose up -d
Cấp quyền:
chmod +x scripts/deploy.sh
Step 4. Buildspec của CodeBuild
Ở Chapter 2, CodeBuild vẫn chịu trách nhiệm:
Test
↓
Docker Build
↓
Package source
↓
CodeDeploy
Ví dụ:
version: 0.2
phases:
build:
commands:
- echo "Running Docker build..."
- docker build -t todo-list-app .
artifacts:
files:
- '**/*'
Ở bước này không SSH vào EC2 nữa.
CodeBuild chỉ tạo artifact chứa source code:
todo-list-app
├── appspec.yml
├── scripts/
├── compose.yaml
├── Dockerfile
└── ...
Step 5. Commit lên GitHub
git add appspec.yml buildspec.yml scripts/deploy.sh
git commit -m "add CodeDeploy deployment"
git push
Step 6. Tạo CodeDeploy Application
AWS Console:
CodeDeploy
↓
Applications
↓
Create application
Application name:
todo-list-app
Compute platform:
EC2/On-premises
Create.
Step 7. Tạo Deployment Group
Trong application:
Create deployment group
Tên:
todo-list-production
Service role:
chapter2-codedeploy-service-role
Deployment type:
In-place
Environment:
Amazon EC2 instances
"Application và Deployment Group trong CodeDeploy khác nhau thế nào?"
Application: Thư mục chứa/định danh chung cho ứng dụng.
Deployment Group: Tập hợp cấu hình cụ thể cho từng môi trường (ví dụ: staging, production), quy định deploy vào máy chủ nào và theo chiến lược gì.
Step 8. Chọn EC2
Ở phần tag:
Key:
Name
Value:
chapter1-todo-app
Lưu ý: EC2 của bạn phải có tag tương ứng.
Ví dụ:
EC2
Name = chapter1-todo-app
CodeDeploy sẽ deploy vào EC2 có tag này.
Step 9. Deployment settings
Chọn:
CodeDeployDefault.AllAtOnce
Với chỉ 1 EC2, AllAtOnce là đơn giản nhất.
"Chiến lược Deployment AllAtOnce, OneAtATime, HalfAtATime nên chọn cái nào?"
- Với 1 server đơn lẻ (Dev/Lab): Dùng AllAtOnce.
- Với hệ thống Production có nhiều EC2 đứng sau Load Balancer: Chọn OneAtATime hoặc HalfAtATime để đảm bảo Zero Downtime (luôn có ít nhất vài server sống để phục vụ user trong lúc các server khác đang deploy).
Step 10. Create deployment group
Nhấn:
Create deployment group
Bây giờ có:
todo-list-app
└── todo-list-production
Step 11. Tạo Deployment thủ công lần đầu
AWS:
CodeDeploy
↓
Applications
↓
todo-list-app
↓
Create deployment
Deployment group:
todo-list-production
Revision type:
Amazon S3
Chọn:
chapter2-todo-artifacts
Artifact:
todo-list-app.zip
File type:
.zip
Create deployment.
Step 12. CodeDeploy bắt đầu deploy
Flow:
S3
↓
CodeDeploy
↓
EC2
↓
Download artifact
↓
appspec.yml
↓
AfterInstall
↓
scripts/deploy.sh
Script:
cd /home/ubuntu/todo-list-app
docker compose build
docker compose up -d
4. Kiểm tra
Step 1. Kiểm tra deployment
AWS:
CodeDeploy
↓
Deployments
Status:
Succeeded
Nếu thành công:
Succeeded
Step 2. Kiểm tra EC2
SSH:
ssh -i ./chapter1-key.pem ubuntu@<EC2_PUBLIC_IP>
cd ~/todo-list-app
Kiểm tra:
docker compose ps
Sau đó:
http://<EC2_PUBLIC_IP>
App phải chạy bình thường.
5. Thiết lập CodePipeline
"Mối quan hệ giữa CodeBuild, S3 và CodeDeploy là gì?"
- CodeBuild: Biên dịch code, chạy test, nén toàn bộ source + appspec.yml thành file .zip.
- S3: Nơi chứa tạm file .zip (Artifact) đó.
- CodeDeploy: Lấy file .zip từ S3 xuống EC2 và giải nén/chạy script triển khai.
Step 1. Kết nối CodeBuild → CodeDeploy
Bây giờ chúng ta hoàn thiện CI/CD.
Flow:
GitHub
↓
CodeBuild
↓
Test
↓
Docker Build
↓
S3 Artifact
↓
CodeDeploy
↓
EC2
Có thể dùng CodePipeline để nối 3 thành phần này:
GitHub
↓
CodePipeline
↓
CodeBuild
↓
S3
↓
CodeDeploy
↓
EC2
Step 2. Các bước thiết lập CodePipeline
1.Truy cập AWS CodePipeline:
- Tìm kiếm và chọn dịch vụ CodePipeline
- Nhấn nút Create pipeline.
2.Cấu hình Pipeline Settings:
- Bước 1: Choose pipeline options.
- Pipeline name: Nhập tên pipeline (ví dụ: todo-list-pipeline).
- Pipeline type: Chọn V2 (loại mặc định hiện tại).
- Service role: Chọn New service role để AWS tự tạo IAM Role cấp quyền cho Pipeline chạy.
- Nhấn Next.
3.Cấu hình Source Stage:
- Bước 2: Add source stage (GitHub).
- Source provider: Chọn GitHub (Version 2) (sử dụng AWS CodeStar Source Connections).
- Nhấn Connect to GitHub Làm theo hướng dẫn đăng nhập và chọn tài khoản GitHub của bạn để hoàn tất kết nối.
- Repository name: Chọn repository chứa dự án (ví dụ: todo-list-app).
- Branch name: Chọn branch muốn kích hoạt tự động (thường là main hoặc master).
- Output artifact format: Giữ nguyên mặc định (CodePipeline default).
- Nhấn Next.
4.Cấu hình Build Stage:
- Bước 3: Add build stage (CodeBuild).
- Build provider: Chọn AWS CodeBuild.
- Region: Chọn cùng Region với CodeBuild Project bạn đã tạo trong bài viết (ví dụ: Tokyo / ap-northeast-1).
- Project name: Chọn CodeBuild Project của bạn (ví dụ: todo-list-build).
- Build type: Chọn Single build.
- Nhấn Next.
5.Cấu hình Deploy Stage:
- Bước 4: Add deploy stage (CodeDeploy).
- Deploy provider: Chọn AWS CodeDeploy.
- Region: Chọn cùng Region với CodeDeploy Application.
- Application name: Chọn Application bạn đã tạo ở bước 11 của bài viết (ví dụ: todo-list-app).
- Deployment group: Chọn Deployment Group đã tạo ở bước 12 (ví dụ: todo-list-production).
- Nhấn Next.
6.Kiểm tra và Tạo Pipeline:
- Bước 5: Review.
- Kiểm tra lại toàn bộ thông tin cấu hình từ Stage Source Build Deploy.
- Nhấn Create pipeline.
6. Kết quả Chapter 2
Developer
↓
git push
↓
GitHub
↓
CodeBuild
↓
Test
↓
Docker Build
↓
S3 Artifact
↓
CodeDeploy
↓
EC2
↓
Docker Compose
↓
Application
Điểm khác biệt quan trọng
Với SSH:
CodeBuild
↓
SSH
↓
EC2
↓
chạy command trực tiếp
Với CodeDeploy:
CodeBuild
↓
Artifact
↓
CodeDeploy
↓
EC2
↓
CodeDeploy Agent
↓
appspec.yml
↓
deploy script
Vì vậy, nếu bạn muốn Chapter 2 thể hiện đúng bước tiến từ Manual Deployment → CI/CD, tôi đánh giá CodeBuild + CodeDeploy + EC2 phù hợp hơn SSH. Nó cũng tạo nền tốt để Chapter 3 nói về chuẩn hóa pipeline, Chapter 4 nói về ECR/artifact/security, rồi Chapter 5 chuyển sang EKS + GitOps.
All rights reserved