0

🚀 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

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í