0

🚀 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

image.png


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 →\rightarrow 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 →\rightarrow Build →\rightarrow 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí