🧪 NT548 - Lab 02: Quản lý và triển khai hạ tầng AWS và ứng dụng microservices với Terraform, CloudFormation, GitHub Actions, AWS CodePipeline và Jenkins
- Họ tên: \Nguyễn Đặng Bình Minh - 22520871 \Trần Gia Bảo - 22520120
- Lớp: NT548 - Công nghệ DevOps và Ứng dụng
- Viết hạ tầng AWS với Terraform (Task 1) và CloudFormation (Task 2)
- Quản lý trạng thái Terraform bằng S3 + DynamoDB
- Kiểm tra tính hợp lệ Terraform bằng
Checkov
- Kiểm tra tính hợp lệ CloudFormation với
cfn-lint
vàtaskcat
- Tự động hoá kiểm tra & triển khai bằng GitHub Actions (Task 1) và CodePipeline (Task 2)
Lưu ý: Trước khi thực hiện bài lab. Hãy đảm bảo bạn đã AWS configure ACCESS_KEY_ID AND AWS_SECRET_ACCESS_KEY, REGION ĐỂ Có thể triển khai thành công mà không gặp lỗi. Và cung cấp setting Github Repo ACCESS_KEY_ID AND AWS_SECRET_ACCESS_KEY để có thể CI.
- Ở terraform bạn phải tiến hành đổi
ami-id
,key_pair
,IP address
,region
- Cloudformation cung cấp đúng
key_pair
,region
IAM
- Tạo S3 bucket + DynamoDB table dùng cho remote backend - Chạy
terraform init
,apply
fileterraform-bootstrap.tf
- File trạng thái
.tfstate
sẽ lưu ở S3 và khoá bởi DynamoDB sau khi GitHub Actions triển khai CI
CI sẽ chạy tự động khi push lên branch main
:
- Kiểm tra
terraform fmt
,validate
,checkov
,plan
- Triển khai
terraform apply
- Sau đó bạn có thể truy cập console của
AWS
để kiểm tra các tài nguyên đã tạo thành công và tiến hành kiểm thử ssh,...
- Push các file Task2 vào GitHub repo
- Build stage (CodeBuild):
- Chạy
buildspec.yml
- Cài
cfn-lint
,taskcat
- Kiểm tra cú pháp file
resource.yaml
- Kiểm tra khả năng triển khai qua
taskcat
- Sau khi
succeed
thì CodePipeline sẽ tiến hành tự động triển Cloudformation
- Chạy
- CodePipeline thực hiện:
- Dùng file
Task2/resource.yaml
- Deploy: Dùng CloudFormation để triển khai hạ tầng
- Sau đó có thể kiểm tra các tài nguyên được tạo ở CloudFormation Stack
- Dùng file
Ứng dụng microservice hoàn chỉnh được xây dựng với Spring Boot, tích hợp Jenkins CI/CD pipeline với SonarCloud, Snyk security scanning và triển khai lên Kubernetes.
Đây là ứng dụng Spring Boot đơn giản được thiết kế để demo quy trình CI/CD hoàn chỉnh từ phát triển code, build, test, scan bảo mật đến triển khai lên Kubernetes cluster.
- Backend: Spring Boot 2.7.0 với Java 11
- Build Tool: Maven 3.8.4
- Container: Docker với multi-stage build
- Orchestration: Kubernetes
- CI/CD: Jenkins Pipeline
- Code Quality: SonarCloud
- Security Scanning: Snyk
- Registry: Docker Hub
├── src/
│ └── main/java/com/example/demo/
│ ├── DemoApplication.java # Ứng dụng Spring Boot chính
│ └── controller/
│ └── HelloController.java # REST API controllers
├── k8s/
│ ├── deployment.yaml # Cấu hình Kubernetes deployment
│ └── service.yaml # Cấu hình Kubernetes service
├── Dockerfile # Cấu hình Docker build multi-stage
├── Jenkinsfile # Định nghĩa CI/CD pipeline hoàn chỉnh
├── pom.xml # Dependencies Maven project
└── README.md # Tài liệu dự án
- Java 11 hoặc cao hơn
- Maven 3.9.10
- Docker Desktop
- Git
- IDE (IntelliJ IDEA, VS Code, etc.)
- Jenkins server với các plugins cần thiết:
- Maven Integration Plugin
- Docker Pipeline Plugin
- SonarQube Scanner Plugin
- Snyk Security Plugin
- Kubernetes CLI Plugin
- Tài khoản SonarCloud và thiết lập project
- Tài khoản Snyk cho quét bảo mật
- Tài khoản Docker Hub cho image registry
- Quyền truy cập Kubernetes cluster
Task 3 tập trung vào việc sử dụng Jenkins để tự động hoá toàn bộ quy trình build, test và deploy ứng dụng microservice lên Kubernetes cluster.
# Dashboard → Manage Jenkins → Credentials → Global → Add Credentials
Kind: Username with password
Username: <docker-hub-username>
Password: <docker-hub-password>
ID: docker-hub-credentials
Description: Docker Hub Registry Access
Kind: Snyk API token
Secret: <snyk-api-token>
ID: snyk-token
Description: Snyk Security Scanner
Kind: Secret text
Secret: <sonarcloud-api-token>
ID: SONAR_TOKEN
Description: SONARQUBECLOUD TOKEN
# Dashboard → Manage Jenkins → Global Tool Configuration
# Maven:
Name: Maven
Version: 3.9.10 (Install automatically)
# JDK:
Name: JDK11
Version: OpenJDK 11 (Install automatically)
# SonarQube Scanner
Name: SonarQube Scanner
Version: SonarQube Scanner 7.10.0.4889 (Install automatically)
# Snyk
Name: Snyk
Version: latest (Install automatically)
# Dashboard → Manage Jenkins → System Configure
# SonarCloud
Name: SonarCloud
Server URL: https://sonarcloud.io
Server authentication token: SONARQUBECLOUD TOKEN
# Jenkins Dashboard → New Item
Item name: demo-microservice-pipeline
Type: Pipeline
Click "OK"
# General:
☑ GitHub project
Project url: https://github.com/<your-repo>/Task3
# Build Triggers:
☑ GitHub hook trigger for GITScm polling
# Pipeline:
Definition: Pipeline script from SCM
SCM: Git
Repository URL: https://github.com/<your-repo>/Task3.git
Branch Specifier: */main
Script Path: Jenkinsfile
# GitHub Repository → Settings → Webhooks → Add webhook
Payload URL: http://<jenkins-server-ip>:8080/github-webhook/
Content type: application/x-www-form-urlencoded
SSL verification: Disable (nếu dùng HTTP)
Events: ☑ Just the push event
Active: ☑
# Có 3 cách trigger:
# 1. Manual trigger
Jenkins Dashboard → demo-microservice-cicd → Build Now
# 2. Git push (tự động) - RECOMMENDED
git add .
git commit -m "Deploy microservice with Jenkins CI/CD"
git push origin main
# → Jenkins sẽ tự động detect và chạy pipeline
# 3. Webhook test
GitHub → Repository → Settings → Webhooks → Recent Deliveries → Redeliver
# 1. Jenkins Classic Dashboard
Dashboard → demo-microservice-pipeline → Build History
→ Click build number để xem console output
# 2. Stage View
Build → Pipeline Steps → Click từng stage để xem details
graph TB
A[📥 Git Push] --> B[🔔 Webhook Trigger]
B --> C[📋 Checkout Code]
C --> D[🔨 Maven Build]
D --> E[🧪 Run Tests]
E --> F[📊 SonarCloud Scan]
F --> G[⏳ Quality Gate Check]
G --> H[🐳 Build Docker Image]
H --> I[📤 Push to Registry]
I --> J[🔒 Security Scan]
J --> K[☸️ Deploy to Kubernetes]
K --> L[✅ Health Check]
G -->|❌ Fail| M[🚫 Stop Pipeline]
K -->|❌ Fail| N[🔄 Auto Rollback]
L --> O[📧 Success Notification]
# Sau khi pipeline complete:
# 1. Kiểm tra Jenkins artifacts
Dashboard → Build → Workspace → target/
→ demo-microservice-1.0.0.jar
→ Test reports
→ Coverage reports
# 2. Verify Kubernetes deployment
kubectl get pods -l app=demo-microservice -n jenkins
kubectl get svc demo-microservice-service -n jenkins
# 3. Test application
export NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}')
curl http://$NODE_IP:32003/
curl http://$NODE_IP:32003/health
# 4. Check reports
SonarCloud Dashboard: https://sonarcloud.io
Snyk Dashboard: https://app.snyk.io
Docker Hub: https://hub.docker.com/r/<username>/demo-app
Method | Endpoint | Mô tả | Định dạng Response |
---|---|---|---|
GET | / |
Endpoint chính của ứng dụng | JSON với message, version, và timestamp |
GET | /health |
Trạng thái health của ứng dụng | JSON với status và thông tin service |
GET /
{
"message": "Hello from Microservice! New message here hihi!",
"version": "1.0.0",
"timestamp": "1640995200000"
}
GET /health
{
"status": "UP",
"service": "demo-microservice"
}
Jenkins pipeline bao gồm các giai đoạn tự động hoá sau:
- Lấy source code từ GitHub repository
- Xác minh thiết lập workspace và tính khả dụng của file
- Thực thi Maven clean compile
- Kiểm tra build artifacts và dependencies
- Chạy bộ unit test toàn diện với Maven
- Tạo báo cáo test chi tiết
- Publish kết quả JUnit test để theo dõi
- Thực hiện phân tích static code cho các chỉ số chất lượng
- Đánh giá technical debt và độ bao phủ code
- Tạo báo cáo chất lượng toàn diện
- Chờ đánh giá SonarCloud quality gate
- Tự động fail pipeline nếu tiêu chuẩn chất lượng không đạt
- Đảm bảo chất lượng code trước khi tiến hành triển khai
- Build Docker image tối ưu sử dụng phương pháp multi-stage
- Gắn tag image với build number và latest tag
- Push images lên Docker Hub registry
- Thực hiện quét lỗ hổng Snyk trên dependencies
- Xác định các rủi ro bảo mật tiềm ẩn và lỗ hổng
- Tạo báo cáo đánh giá bảo mật
- Cập nhật Kubernetes deployment với phiên bản image mới
- Áp dụng các file cấu hình đã cập nhật
- Theo dõi trạng thái rollout và thực hiện health checks
- Triển khai rollback tự động khi triển khai thất bại
-
Vào EC2 > Instances:
- EC2 Public có thể SSH được (qua IP public)
- EC2 Private không có IP public, chỉ SSH từ EC2 Public
-
Vào VPC > Route Tables & Subnets:
- Subnet private route qua NAT Gateway
- Subnet public gắn với IGW
-
Vào CloudFormation > Stacks:
- Tên stack:
NT548-Lab2
- Trạng thái:
CREATE_COMPLETE
- Tên stack:
-
Kiểm tra tương tự phần trên với EC2/VPC
- Jenkins Dashboard: Kiểm tra trạng thái build và thực thi pipeline
- SonarCloud: Xem các metrics chất lượng code và báo cáo coverage
- Snyk Dashboard: Kiểm tra các lỗ hổng bảo mật
- Docker Hub: Xác minh image được push thành công
- Kubernetes Cluster:
kubectl get pods -l app=demo-microservice kubectl get svc demo-microservice-service curl http://<node-ip>:32003/health
- EC2 và NAT Gateway có thể phát sinh chi phí
- Sau khi chạy xong, hãy xoá CloudFormation stack và tài nguyên Terraform
-
Task 1:
- Dùng Terraform module hoá các thành phần hạ tầng
- Quản lý backend bằng S3 + DynamoDB
- CI/CD bằng GitHub Actions
-
Task 2:
- Viết template CloudFormation thuần YAML
- Kiểm tra template bằng
taskcat
- Quản lý backend bằng S3
- Tích hợp CI/CD với AWS CodePipeline
-
Task 3:
- Spring Boot microservice với CI/CD toàn diện
- Jenkins Pipeline với nhiều quality gates
- Docker containerization và Kubernetes deployment
- Quét bảo mật và phân tích chất lượng code
- Triển khai tự động với khả năng rollback