DevOps Example

Đề bài 15: Dịch vụ Chụp ảnh Website Tự động

  • Ý tưởng: Cung cấp một API nhận vào một URL và trả về một file ảnh PNG chụp lại màn hình của trang web đó.

  • Yêu cầu Hệ thống & Chức năng:

    • Thành phần chính: API Gateway, SQS, ECS Fargate, S3.
    • Luồng dữ liệu: API Gateway nhận URL Gửi message vào SQS Một ECS Fargate Service đọc từ SQS, sử dụng một container có cài đặt Puppeteer (headless browser) để chụp ảnh, sau đó lưu ảnh vào S3.
  • Tính năng: API để yêu cầu chụp ảnh và API để kiểm tra/lấy ảnh kết quả.

  • Yêu cầu Vận hành & Mở rộng:

    • ECS Service phải tự động mở rộng dựa trên số lượng yêu cầu trong SQS.
    • Task Definition phải được cấp đủ tài nguyên để chạy headless browser.
  • Giám sát thời gian trung bình để chụp một trang web.

  • Mai add config autoscale dựa vào số lượng yêu cầu trên SQS (nhớ set MAX) - Có vẻ autoscale đang hơi chậm

  • Add Monitoring xem thời gian trung bình chụp 1 trang web

Các Yêu cầu Chung (Áp dụng cho TẤT CẢ các đề bài) Bất kể bạn chọn đề bài nào, giải pháp của bạn phải đáp ứng tất cả các yêu cầu cốt lõi sau đây:

Infrastructure as Code (IaC):

Toàn bộ hạ tầng phải được định nghĩa 100% bằng code (Tự do lựa chọn giữa Terraform, Pulumi, hoặc AWS CDK).

Mã nguồn IaC phải được lưu trữ trong một kho chứa Git.

Bảo mật là trên hết (Security First):

Thiết kế VPC: Phải có public và private subnets. Các thành phần nhạy cảm (database, cache, worker) phải nằm trong private subnets.

Quyền tối thiểu (Least Privilege): Tất cả các IAM Roles (cho EC2, Lambda, ECS Task, EKS Pod) chỉ được cấp những quyền thực sự cần thiết để hoạt động.

Quản lý Bí mật: Nghiêm cấm hardcode bất kỳ thông tin nhạy cảm nào. Phải sử dụng AWS Secrets Manager hoặc Parameter Store.

CI/CD Toàn diện:

Thiết lập một pipeline GitHub Actions hoàn chỉnh.

Pipeline phải tự động build, test, quét lỗ hổng bảo mật (ví dụ: Trivy), và triển khai lên AWS.

Giám sát & Quan sát (Monitoring & Observability):

Phải thiết lập giám sát cho các chỉ số quan trọng của hệ thống (hạ tầng và ứng dụng).

Tập trung hóa log vào CloudWatch Logs hoặc một hệ thống tương đương.

Thiết lập ít nhất một cảnh báo (Alarm) quan trọng cho dịch vụ.

Tài liệu hóa:

Cung cấp một file README.md chuyên nghiệp, bao gồm:

Một sơ đồ kiến trúc hệ thống.

Giải thích các lựa chọn thiết kế quan trọng.

Hướng dẫn chi tiết cách triển khai dự án.

Services

  • VPC
  • API Gateway
  • SQS
  • ECS Fargate
  • S3
  • Route53
  • CloudFront để cache ảnh nếu cần

Prompt cho bên AI code Terraform: Must follow least privilege principle

Note dự án để dùng thêm Lambda function

Todo

  • Dựng VPC - subnets (public/private) (nếu cần NAT Gateway) ✅ 2025-09-14

  • IAM Roles ✅ 2025-09-27

  • Code Nodejs cài puppeteer + Logic lấy message SQS, mở trang, upload ảnh lên S3 ✅ 2025-09-05

    • Push image lên ECR ✅ 2025-09-06
    • Các ENV như bucket name, dynamodb table, sqs name nên có prefix cho môi trường ở trước ✅ 2025-09-21
    • Please migrate your code to use AWS SDK for JavaScript (v3). ✅ 2025-09-21
  • Tạo task definition ✅ 2025-09-27

  • Tạo ECS Service để chạy task này ✅ 2025-09-27

  • Kết nối với SQS Event Source Mapping ✅ 2025-09-27

  • API Gateway + Lambda (2 jobs) ✅ 2025-09-27

  • AutoScaling config ✅ 2025-09-27

  • CloudWatch dashboard ✅ 2025-09-27

  • CI/CD - Github Action Build container nếu code change, push ECR, Deploy ECS ✅ 2025-09-27

    • Config OIDC cho Github Action, không cần setting secret key, id ✅ 2025-09-27
  • Build giao diện cho trang web nếu cần ✅ 2025-09-27

  • WAF - Rate limiting để tránh bị spam ✅ 2025-09-27

  • Estimate cost/ Cost management / Slack monitoring ✅ 2025-09-27

  • Monitoring if there is any spamming ✅ 2025-09-27

  • Hiện tại chưa trả về được link ảnh S3 (do phải đợi/ delay) ✅ 2025-09-27

  • Xóa phần NAT Gateway khi tạo VPC, vì không dùng đến mà tốn tiền quá =)) ✅ 2025-09-27

  • Cứ code như terraform bình thường đã, rồi sau này sử dụng “source” sau

  • Sửa lại auto-scale rule cho ECS dựa vào SQS messages count ✅ 2025-09-27

    • Phần này đang thấy cái alarm tên hơi cùi =)) chắc phải đặt lại chứ không để tự động nữa ✅ 2025-09-27
  • Sau này nhờ AI check lại toàn bộ project, xem có vấn đề gì cần cải tiến không? ✅ 2025-09-27

  • Tạo 1 màn hình web realtime access to DynamoDB, sau đó lấy job, status, … để tracking? ✅ 2025-09-27

  • Build kịch bản tấn công và phòng tránh ✅ 2025-09-27

  • Dò lại 1 lượt các code, xem có vấn đề gì không ✅ 2025-09-27

  • Check xem bên phần screenshot service sao mà fail CI ✅ 2025-09-27

  • Kiểm tra các chỗ đang fix cứng code ✅ 2025-09-27

  • Trong source code có chỗ backend đang dùng kms key, nếu chạy trên máy khác không biết có chạy được không? ✅ 2025-09-27

  • Hiện tại đang dùng terraform version 5.x. Muốn up lên 6.x, và đồng bộ giữa các folders cơ. ✅ 2025-09-27

  • Đưa KMS sang thành file quản lý riêng được không? ✅ 2025-09-27

  • Viết thêm đoạn Pull Container về và up lên ECR cá nhân của mọi người ✅ 2025-09-27

Chiều nay

  • Deploy lên ECS
  • Tạo API Gateway (public) để thông luồng
  • Add domain để người dùng có thể xem link được ảnh S3??

Thứ tự đúng nên là:


  | Component        | Status     | Progress |
  |------------------|------------|----------|
  | VPC & Networking | ✅ Complete | 100%     |
  | S3 Storage       | ✅ Complete | 100%     |
  | DynamoDB         | ✅ Complete | 100%     |
  | IAM Foundation   | ⚠️ Partial  | 60%       |
  | Lambda Functions | ❌ Missing  | 0%       |
  | API Gateway      | ❌ Missing  | 0%       |
  | SQS Queues       | ❌ Missing  | 0%       |
  | Monitoring       | ❌ Missing  | 0%       |
  1. S3 backed
  2. IAM
  3. SQS
  4. Lambda code
  5. API Gateway

  • ECS

    • Build + push image lên ECR
      • Tài khoản terraform phải tạo ECR repository trước, tài khoản deploy không cần quyền tạo này
  • Tạo 1 Role mới,

    • Create ECS Task Execution Role, and attach policy: AmazonECSTaskExecutionRolePolicy Cho ECS
    • Create ECS Task Role (for application permissions) -
  • Tài khoản devops

    • Tạo
      • ECR repository
      • ECS Cluster
        • Có quyền createCluster
      • SQS queue
      • DynamoDB
      • S3 bucket
    • Permission
      • Phải có quyền để tạo IAM role hco ECS execute task
  • Tài khoản CI/CD

    • Push image to ECR?
      • ecr:InitiateLayerUpload
  • Tài khoản developer

Từ TK admin, tạo tk devops và cấp quyền cho nó trước đã.

Thực tế

  • Tạo profile để deploy - screenshot-service-prd
  • Create S3-backed-bucket Store terraform state
  • Create VPC (without NAT Gateway)
  • Create S3 bucket
  • Create DynamoDB table

Questions

  • Ví dụ như các file config role for IAM (vd cần call vào ))

Steps

1. Các AWS Services cần thiết

Thành phần chính:

  • API Gateway: nhận request từ client, cung cấp endpoint RESTful/HTTP.
  • SQS (Amazon Simple Queue Service): lưu trữ request cần xử lý, đảm bảo decoupling.
  • ECS Fargate: chạy container headless browser (Puppeteer/Playwright) để chụp ảnh.
  • S3: lưu trữ file ảnh kết quả (PNG).

Thành phần bổ sung cho vận hành:

  • CloudWatch:
    • Metrics: giám sát số message trong SQS, thời gian xử lý task ECS.
    • Logs: ghi log từ container Puppeteer.
  • Application Auto Scaling: tự động scale số lượng ECS Task dựa vào số message trong SQS.
  • DynamoDB (hoặc RDS nhẹ): lưu metadata về job (URL, status, link ảnh).
  • IAM: cấp quyền cho ECS task đọc message SQS, ghi file vào S3.
  • Secrets Manager / Parameter Store: lưu thông tin cấu hình nhạy cảm (API keys, token).
  • CloudFront (tuỳ chọn): CDN để phân phối ảnh nhanh hơn từ S3.
  • Route 53: custom domain cho API.

2. Luồng hoạt động

  1. Client gọi API /screenshot (qua API Gateway) với body: { "url": "https://example.com" }.
  2. Lambda nhẹ (hoặc direct integration) push message vào SQS với JobID + URL.
  3. ECS Fargate Service poll SQS → nhận message → chạy container Puppeteer → chụp ảnh → upload lên S3.
  4. ECS ghi trạng thái vào DynamoDB:
    • JobID, status (pending, processing, done), s3_path.
  5. Client có thể query API /status/{JobID} để kiểm tra trạng thái + lấy link ảnh.

3. Các bước triển khai chi tiết

Bước 1: Chuẩn bị môi trường

  • Tạo VPC riêng, subnets (public/private), NAT Gateway (nếu cần).
  • Định nghĩa IAM Role cho ECS Task:
    • Quyền sqs:ReceiveMessage, sqs:DeleteMessage.
    • Quyền s3:PutObject, s3:GetObject.
    • Quyền ghi log vào CloudWatch.

Bước 2: Xây dựng container chụp ảnh

  • Dockerfile với Node.js + Puppeteer (headless Chrome).
  • Code chính:
    • Nhận message từ SQS.
    • Dùng Puppeteer mở trang → page.screenshot().
    • Upload lên S3.
    • Update DynamoDB.
  • Push image lên ECR.

Bước 3: ECS Fargate Service

  • Tạo Task Definition (đủ CPU/RAM: tối thiểu 0.5 vCPU, 1GB RAM, khuyến nghị 1 vCPU, 2GB RAM cho Puppeteer).
  • Tạo ECS Service chạy task này.
  • Kết nối với SQS Event Source Mapping (polling).

Bước 4: API Layer

  • API Gateway + Lambda nhỏ để:
    • /screenshot: generate JobID, push message vào SQS, insert record vào DynamoDB.
    • /status/{JobID}: đọc DynamoDB → trả về status + link S3 (signed URL).

Bước 5: Scaling

  • Application Auto Scaling:
    • Metric: ApproximateNumberOfMessagesVisible (SQS).
    • Rule: nếu >10 messages → scale up ECS Tasks, nếu <2 → scale down.

Bước 6: Giám sát & Logging

  • CloudWatch Dashboard:
    • Số message trong SQS.
    • ECS CPU/Memory usage.
    • Thời gian xử lý trung bình (log metric filter từ ECS log).
  • X-Ray (tùy chọn): trace API request → SQS → ECS.

Bước 7: CI/CD

  • CodePipeline / GitHub Actions:
    • Build container → push ECR.
    • Deploy ECS Service (CloudFormation/Terraform).
    • API Gateway config deploy tự động.

4. Tổng kết Kiến trúc

  • Ingestion: API Gateway → Lambda → SQS.
  • Processing: ECS Fargate (Puppeteer) → S3 + DynamoDB.
  • Query: API Gateway → Lambda → DynamoDB (+ S3 presigned URL).
  • Ops: CloudWatch, Auto Scaling, IAM, Secrets Manager.

Yêu cầu chung

Các Yêu cầu Chung (Áp dụng cho TẤT CẢ các đề bài) Bất kể bạn chọn đề bài nào, giải pháp của bạn phải đáp ứng tất cả các yêu cầu cốt lõi sau đây:

Infrastructure as Code (IaC):

Toàn bộ hạ tầng phải được định nghĩa 100% bằng code (Tự do lựa chọn giữa Terraform, Pulumi, hoặc AWS CDK).

Mã nguồn IaC phải được lưu trữ trong một kho chứa Git.

Bảo mật là trên hết (Security First):

Thiết kế VPC: Phải có public và private subnets. Các thành phần nhạy cảm (database, cache, worker) phải nằm trong private subnets.

Quyền tối thiểu (Least Privilege): Tất cả các IAM Roles (cho EC2, Lambda, ECS Task, EKS Pod) chỉ được cấp những quyền thực sự cần thiết để hoạt động.

Quản lý Bí mật: Nghiêm cấm hardcode bất kỳ thông tin nhạy cảm nào. Phải sử dụng AWS Secrets Manager hoặc Parameter Store.

CI/CD Toàn diện:

Thiết lập một pipeline GitHub Actions hoàn chỉnh.

Pipeline phải tự động build, test, quét lỗ hổng bảo mật (ví dụ: Trivy), và triển khai lên AWS.

Giám sát & Quan sát (Monitoring & Observability):

Phải thiết lập giám sát cho các chỉ số quan trọng của hệ thống (hạ tầng và ứng dụng). GG Tập trung hóa log vào CloudWatch Logs hoặc một hệ thống tương đương.

Thiết lập ít nhất một cảnh báo (Alarm) quan trọng cho dịch vụ.

Tài liệu hóa:

Cung cấp một file README.md chuyên nghiệp, bao gồm:

Một sơ đồ kiến trúc hệ thống.

Giải thích các lựa chọn thiết kế quan trọng.

Hướng dẫn chi tiết cách triển khai dự án.