🚀 Chapter 2 — Automation: Thiết lập CD với CodeDeploy
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
Developer
│
git push
│
▼
┌─────────┐
│ GitHub │
└────┬────┘
│
▼
┌─────────────┐
│ CodeBuild │
│ │
│ Test │
│ Docker Build│
└──────┬──────┘
│
▼
┌─────────────┐
│ CodeDeploy │
└──────┬──────┘
│
▼
┌─────────┐
│ EC2 │
│ │
│ Docker │
│ Compose │
└─────────┘
2. 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.
3. 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)
4. 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.
5. Gắn Role vào EC2
EC2
↓
Instances
↓
Chọn EC2
↓
Actions
↓
Security
↓
Modify IAM role
Chọn:
chapter2-codedeploy-ec2-role
Save.
6. 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
7. 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.
8. 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
9. 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
└── ...
10. Commit lên GitHub
git add appspec.yml buildspec.yml scripts/deploy.sh
git commit -m "add CodeDeploy deployment"
git push
11. Tạo CodeDeploy Application
AWS Console:
CodeDeploy
↓
Applications
↓
Create application
Application name:
todo-list-app
Compute platform:
EC2/On-premises
Create.
12. 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
13. 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.
14. Deployment settings
Chọn:
CodeDeployDefault.AllAtOnce
Với chỉ 1 EC2, AllAtOnce là đơn giản nhất.
15. Create deployment group
Nhấn:
Create deployment group
Bây giờ có:
todo-list-app
└── todo-list-production
16. 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
17. 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
18. 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.
19. 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
20. Kiểm tra deployment
AWS:
CodeDeploy
↓
Deployments
Status:
Succeeded
Nếu thành công:
Succeeded
21. Kiểm tra EC2
SSH:
ssh -i ~/Downloads/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.
22. 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
↓
Docker Compose
Có thể dùng CodePipeline để nối 3 thành phần này:
GitHub
↓
CodePipeline
↓
CodeBuild
↓
S3
↓
CodeDeploy
↓
EC2
Đây là cách tôi khuyên dùng nếu mục tiêu của Chapter 2 là CI/CD hoàn chỉnh.
23. 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