AWS CloudWatch – Bài 17

Hello các bạn, hôm nay tụi mình sẽ tìm hiểu một dịch vụ cực kỳ quan trọng trong hệ sinh thái AWS – đó là Amazon CloudWatch. Về cơ bản thì CloudWatch giống như “camera giám sát” cho hệ thống của bạn. Nó giúp theo dõi hiệu năng, trạng thái hoạt động của các tài nguyên trên AWS như EC2, S3, RDS,… Nếu có chuyện gì xảy ra (như CPU tăng cao bất thường, ổ đĩa sắp đầy, hay ứng dụng bị lỗi), thì CloudWatch sẽ giúp bạn phát hiện và xử lý kịp thời.

Xem thêm:

Amazon S3 – Bài 16

Amazon Route 53 – Bài 15

Hướng dẫn cấu hình AWS RDS – Bài 13

1. CloudWatch Metrics – Các chỉ số theo dõi

1.1. Amazon CloudWatch Metrics là gì?

CloudWatch Metrics là các chỉ số dùng để theo dõi hiệu năng và hoạt động của tài nguyên AWS (ví dụ EC2, S3…).

Metrics (chỉ số) là những con số giúp bạn đo lường và giám sát hoạt động của tài nguyên. Ví dụ:

  • CPUUtilization (CPU sử dụng bao nhiêu %)
  • NetworkIn (dữ liệu nhận vào)
  • BucketSize (kích thước S3 bucket)

Nói đơn giản, nó giống như đo nhiệt độ, nhịp tim, huyết áp của hệ thống vậy.

1.2. Cấu trúc của Metrics

Namespace (Nơi chứa các metrics): Mỗi dịch vụ AWS có một không gian riêng để chứa metric, ví dụ: AWS/EC2, AWS/S3, AWS/ELB…

Dimensions: Đây là ngữ cảnh để hiểu chỉ số, dựa vào dimensisions, CloudWatch sẽ biết biết đo cái gì cụ thể. Hiểu đơn giản, dimensisions như nhãn dán lên metric để biết nó thuộc về tài nguyên nào (EC2 nào, bucket nào…). Một metric có thể có tối đa 30 dimensions.

Ví dụ:

  • CPUUtilization (chỉ số CPU sử dụng) thì phải biết là của máy EC2 nào, đúng không?
  • Vậy dimension ở đây là InstanceId – để xác định máy EC2 cụ thể..

1.3. Tần suất thu thập

  • Mặc định là 5 phút/lần
  • Nếu bật Detailed Monitoring thì có thể giảm xuống 1 phút/lần

1.4. Xuất Metrics ra ngoài CloudWatch

Metrics có thể được stream theo thời gian thực. Bạn có thể đẩy metric sang các hệ thống khác để phân tích sâu hơn như:

  • Amazon Kinesis Firehose → đẩy vào S3, Athena, Redshift, OpenSearch…
  • Bên thứ 3: Datadog, New Relic, Splunk,…

Xuất Metrics ra ngoài CloudWatch

1.5. Các thao tác cơ bản với CloudWatch Metrics

Vào CloudWatch Console → Metrics:

  • Chọn namespace
  • Chọn metric muốn xem
  • Tùy chỉnh thời gian xem (15 phút, 1 giờ, 1 ngày,…)
  • Có thể export ra CSV hoặc gửi link cho đồng nghiệp xem chung.

CloudWatch Metrics

2. CloudWatch Logs – Lưu trữ và phân tích log

2.1. CloudWatch Logs là gì?

CloudWatch Logs là dịch vụ của AWS dùng để thu thập, lưu trữ và phân tích log của các ứng dụng hoặc tài nguyên AWS.

2.2. Cấu trúc lưu trữ Logs

CloudWatch Logs tổ chức dữ liệu theo:

  • Log Groups: Là nhóm lưu trữ log chính (thường đại diện cho từng ứng dụng riêng biệt).
  • Log Streams: Là các dòng log cụ thể trong từng log group (ví dụ: logs từ các EC2 khác nhau, containers khác nhau).

Cho phép tùy chỉnh thời gian lưu trữ logs (Retention Policy):

  • Lưu trữ vô thời hạn (không xóa).
  • Hoặc đặt thời gian tự động xóa từ 1 ngày đến 10 năm.

2.3. Xuất logs ra bên ngoài

Có hai hình thức xuất logs:

Xuất logs dạng batch (không real-time):

  • Xuất logs ra Amazon S3.
  • API dùng: CreateExportTask.
  • Thời gian hoàn thành export lên tới 12 giờ.

Xuất logs dạng streaming (real-time hoặc gần real-time):

  • Sử dụng Subscription Filters để stream logs liên tục.
  • Có thể gửi logs trực tiếp vào các dịch vụ khác như:
    • Kinesis Data Streams (phân tích thời gian thực, Lambda, EC2, Firehose…).
    • Kinesis Data Firehose (stream vào S3, OpenSearch…).
    • AWS Lambda (tự định nghĩa xử lý logs, tích hợp với OpenSearch).
  • Có thể lọc logs khi stream (chỉ gửi logs theo điều kiện nhất định).

CloudWatch Logs Subscriptions

2.4. Aggregate logs từ nhiều account AWS

CloudWatch Logs cho phép tập trung logs từ nhiều tài khoản AWS vào một điểm chung để phân tích.

Các bước thực hiện cụ thể:

  1. Tài khoản gửi logs (sender) tạo Subscription Filter.
  2. Subscription filter gửi logs tới một Destination ở tài khoản nhận (recipient).
  3. Destination là đại diện của tài nguyên nhận logs (ví dụ: Kinesis Data Stream ở tài khoản recipient).
  4. Tài khoản nhận logs tạo Destination Access Policy, cho phép tài khoản sender gửi logs tới.
  5. Tài khoản nhận tạo IAM Role, cấp quyền ghi vào tài nguyên đích, và cho phép tài khoản sender assume role này.

CloudWatch Logs Aggregation Multi-Account & Multi Region

3. CloudWatch Agent – Gửi log và metric từ EC2

Mặc định, EC2 không gửi log hay metric lên CloudWatch, nên bạn cần cài đặt CloudWatch Agent.

Có 2 loại CloudWatch Agent:

Agent Gửi log Gửi metric Hỗ trợ cấu hình tập trung Ghi chú
CloudWatch Logs Agent không không Agent cũ, chỉ gửi log
CloudWatch Unified Agent Gửi cả log và metric chi tiết (RAM, swap, disk I/O, tiến trình,…).

Hỗ trợ máy chủ on-premises .

Cấu hình dễ dàng qua SSM Parameter Store.

4. CloudWatch Alarms

Amazon CloudWatch Alarms giúp giám sát hạ tầng bằng cách đặt ngưỡng trên các chỉ số để phát hiện sự cố và kích hoạt cảnh báo hoặc hành động tự động.

4.1. Cơ chế

CloudWatch Alarm sẽ:

  • Theo dõi một metric
  • So sánh với một ngưỡng
  • Khi vượt ngưỡng → gửi cảnh báo hoặc thực hiện hành động

CloudWatch Alarm hoạt động trên một metric cụ thể, và có thể thiết lập nhiều kiểu điều kiện như:

  • Giá trị trung bình (Average)
  • Giá trị tối đa (Maximum)
  • Phần trăm (Percentile)
  • Số lượng (SampleCount)

4.2. Trạng thái của Alarm:

  • OK: Bình thường
  • ALARM: Có sự cố (vượt ngưỡng)
  • INSUFFICIENT_DATA: Không đủ dữ liệu để đánh giá trạng thái hiện tại (ví dụ: metric chưa đủ số lượng hoặc chưa có cập nhật mới).

4.3. Chu kỳ đánh giá

Thời gian CloudWatch đánh giá metric được gọi là Period, có thể thiết lập từ 10 giây (với custom high-resolution metrics) đến 300 giây hoặc hơn cho các metric mặc định.

Một khi alarm chuyển sang trạng thái ALARM, ta có thể cấu hình thực hiện một hoặc nhiều hành động sau:

  • Quản lý EC2 instance: dừng (Stop), khởi động lại (Reboot), kết thúc (Terminate), hoặc khôi phục (Recover).
  • Tự động mở rộng (Auto Scaling): Scale in/out một nhóm EC2 tự động dựa vào tải thực tế.
  • Gửi thông báo qua SNS (Simple Notification Service): có thể đẩy tiếp tới Lambda, Email, hoặc các webhook khác.

5. CloudWatch Logs – Hand On

Mục tiêu:

Cấu hình để gửi log từ một máy EC2 lên dịch vụ Amazon CloudWatch Logs

Cách thực hiện:

  • Task 1: Tạo IAM Role gán cho EC2
  • Task 2: Tạo EC2 Instance
  • Task 3: Tạo Log Group & Log Stream
  • Task 4: Kết nối EC2 Instance và cài CloudWatch Agent
  • Task 5: Cấu hình CloudWatch Agent để gửi log
  • Task 6: Khởi động CloudWatch Agent

Task 1: Tạo IAM Role gán cho EC2

Truy cập IAM Console Chọn Roles > Create role

Tạo IAM Role gán cho EC2

Trusted entity: chọn AWS service → chọn EC2

Tạo IAM Role gán cho EC2

Nhấn Next

Trong phần Permissions, tìm và tick chọn: CloudWatchAgentServerPolicy

Tạo IAM Role gán cho EC2

Đặt tên: EC2CloudWatchLogsRole

Nhấn Next

Tạo IAM Role gán cho EC2

Task 2: Tạo EC2 Instance

Truy cập EC2 Console > Launch instance

Thiết lập Giá trị
Name CloudWatchLogEC2
AMI Amazon Linux 2 AMI
Instance type t2.micro
Key pair Chọn hoặc tạo mới
IAM instance profile Chọn EC2CloudWatchLogsRole
Network VPC mặc định
Subnet Tự động hoặc chọn
Security Group Cho phép SSH từ IP của bạn (port 22)

Lưu ý: Nhớ gán IAM instance profile

Task 3: Tạo Log Group & Log Stream

Truy cập CloudWatch Logs, chọn giống region EC2

Tại menu bên trái, chọn Log groups.

Tạo và quản lý CloudWatch Log Group và Log Stream

 

Tạo và quản lý CloudWatch Log Group và Log Stream

Standard: Dùng cho log thường xuyên truy cập. Hỗ trợ đầy đủ tính năng như: Live Tail (xem log real-time), Metric filter, Tạo cảnh báo (Alarms), Phân tích mẫu log (Log patterns), Bảo vệ dữ liệu (Data protection).

Infrequent Access: Dùng cho log ít khi cần xem (Logs Insights). Giúp tiết kiệm chi phí, vẫn có thể truy vấn khi cần để phân tích sự cố sau này.

Click vào demo-log-groups > Create log stream Tên: nhập MyLogStreamManual

Tạo Log Group & Log Stream

Task 4: Kết nối EC2 Instance và cài CloudWatch Agent

Cài đặt agent:

sudo yum install -y amazon-cloudwatch-agent

Task 5: Cấu hình CloudWatch để gửi log

sudo nano /opt/aws/amazon-cloudwatch-agent/bin/config.json

{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/messages",
            "log_group_name": "demo-log-groups",
            "log_stream_name": "MyLogStreamManual"
          }
        ]
      }
    }
  }
}

Task 6: Khởi động CloudWatch Agent

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json \
-s

//Kiem tra trang thai
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

//Tao log test

logger "Log test sau khi gán IAM role"

//Ghi log từ journalctl sang file /var/log/messages
sudo yum install -y rsyslog
sudo systemctl enable rsyslog
sudo systemctl start rsyslog


sudo tail -n 10 /var/log/messages

Kiểm tra kết quả:

Quay lại CloudWatch Log Groups

Chọn demo-log-groups→ MyLogStreamManual

CloudWatch Logs - Hand On

6. Giám sát CPU, RAM, Disk trên EC2 – Hand On

Mục tiêu:

  • Cài đặt CloudWatch Agent trên EC2 để thu thập thông tin về CPU, RAM, Disk.
  • Hiển thị và giám sát metric (CPU, RAM, Disk) trên CloudWatch.
  • Tạo Alarm cảnh báo khi vượt ngưỡng qua Email.

Cách thực hiện:

  • Task 1: Gán IAM Role với quyền CloudWatchAgentServerPolicy (Đã làm ở phần trước)
  • Task 2: Cài đặt CloudWatch Agent: sudo yum install -y amazon-cloudwatch-agent
  • Task 3: Cấu hình CloudWatch Agent để gửi metric
  • Task 4: Khởi động CloudWatch Agent
  • Task 5: Tạo dashboard metric trên CloudWatch
  • Task 6: Tạo CloudWatch Alarm (cảnh báo)

Task 1, Task 2: Xem ở phần CloudWatch Logs – Hand on (Task 1, Task 4)

Task 3: Cấu hình CloudWatch Agent để gửi metric

sudo tee /opt/aws/amazon-cloudwatch-agent/bin/config.json > /dev/null <<EOF
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root",
    "region": "ap-southeast-1"
  },
  "metrics": {
    "append_dimensions": {
      "InstanceId": "\${aws:InstanceId}"
    },
    "metrics_collected": {
      "mem": {
        "measurement": ["mem_used_percent"],
        "metrics_collection_interval": 60
      },
      "disk": {
        "measurement": ["disk_used_percent"],
        "metrics_collection_interval": 60,
        "resources": ["*"]
      }
    }
  }
}
EOF

Task 4: Khởi động CloudWatch Agent

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
    -a fetch-config -m ec2 \
    -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

//Kiem tra trang thai 

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

Kiểm tra metric trên CloudWatch

Task 5: Tạo dashboard metric trên CloudWatch

Bạn có thể tạo một dashboard theo thời gian thực hiển thị CPU, RAM, Disk bằng cách:

  • Vào CloudWatch > Dashboards
  • Chọn Create dashboard
  • Thêm widget kiểu Line hoặc Number
  • Gắn các metric sau:
    • CWAgent > InstanceId > mem_used_percent
    • CWAgent > InstanceId > disk_used_percent (xvda1)
    • EC2 > Per-Instance Metrics > CPUUtilization

Cloud Watch

Tạo dashboard metric trên CloudWatch

Tạo dashboard metric trên CloudWatch

Tạo dashboard metric trên CloudWatchTạo dashboard metric trên CloudWatch

Task 6: Tạo CloudWatch Alarm (cảnh báo)

Bước 1: 

  • Chọn Alarms > All alarms
  • Nhấn Create alarm

Tạo CloudWatch Alarm (cảnh báo)

Bước 2:

  • Nhấn Select metric
  • Chọn tab Browse
  • Điều hướng: CWAgent > InstanceId 
  • Tick chọn metric cpu_usage_idle
  • Nhấn Select metric

Tạo CloudWatch Alarm (cảnh báo)

Bước 3: Đặt điều kiện cảnh báo

  • Threshold type: Static
  • Whenever cpu_total_active is… → Greater than 80

Tạo CloudWatch Alarm (cảnh báo)

Bước 4: Hành động cảnh báo

  • Nhấn Create new topic
  • Đặt tên: HighCPUAlertTopic
  • Nhập email nhận cảnh báo
  • AWS sẽ gửi email xác nhận → nhớ xác nhận

Tạo CloudWatch Alarm (cảnh báo)

Bước 6: Đặt tên Alarm và tạo

  • Alarm name: HighCPUUsageAlarm
  • Nhấn Create alarm

Tạo CloudWatch Alarm (cảnh báo)

Cảm ơn bạn đã tham khảo AWS Certified Solutions Architect Associate – SAA-C03 trên ttnguyen.net

Xem thêm:

Amazon CloudFront – Bài 18

Amazon SQS – Bài 19

Amazon Simple Notification Service (AWS SNS) – Bài 20

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em