Collect Metrics, Logs with the CloudWatch Agent via EC2 User Data

Collect Metrics, Logs with the CloudWatch Agent via EC2 User Data

avatar

TrungTin Tran

2024.08.03

Bài viết hôm nay CloudMentorPro sẽ hướng dẫn cách collect metrics, log bằng CloudWatch Agent thông qua EC2 user data script

Introduction

Amazon CloudWatch Agent là gì?

Amazon CloudWatch Agent là một công cụ được cung cấp bởi AWS (Amazon Web Services), cho phép bạn thu thập và gửi các dữ liệu hệ thống, log files, và metrics từ các server được quản lý bởi AWS (EC2 instances) hoặc các server on-premises tới Amazon CloudWatch để giám sát và phân tích.

Tại sao lại sử dụng CloudWatch Agent?

  • Giám sát metrics chi tiết: CloudWatch Agent cho phép thu thập dữ liệu metrics chi tiết như CPU, RAM, disk, network, process,.. từ hệ thống của bạn. Điều này giúp bạn có cái nhìn sâu sắc hơn về hoạt động của hệ thống.
  • Log monitoring: CloudWatch Agent cho phép thu thập và gửi các log files từ các ứng dụng và hệ thống lên CloudWatch Logs, giúp bạn theo dõi và phân tích log một cách hiệu quả.
  • Tự động hóa: Có thể kết hợp với CloudWatch Alarm để gửi cảnh báo khi có vấn đề xảy ra, giúp bạn kịp thời phát hiện và xử lý sự cố.
  • Đa nền tảng: CloudWatch Agent có thể cài đặt và hoạt động trên nhiều hệ điều hành khác nhau, bao gồm Windows, Linux, và cả các môi trường on-premises.
  • Tối ưu hóa chi phí: Bằng cách giám sát hiệu suất hệ thống và sử dụng tài nguyên, bạn có thể phát hiện ra các điểm bất thường hoặc lãng phí tài nguyên, từ đó đưa ra các quyết định tối ưu hóa chi phí.

Từ đó có thể thấy combo CloudWatch Agent kết hợp với CloudWatch không chỉ giúp bạn giám sát hệ thống một cách toàn diện, mà còn giúp tối ưu hóa hiệu suất, phát hiện và xử lý sự cố nhanh chóng, đảm bảo rằng dịch vụ của bạn luôn hoạt động ổn định và hiệu quả. Đây là công cụ không thể thiếu đối với bất kỳ admin nào đang tìm cách nâng cao khả năng quản lý và giám sát hệ thống của mình trên AWS.

Mục tiêu bài lab

Bài lab này giới thiệu cách tạo script user data để tự động cài đặt và cấu hình CloudWatch Agent trên EC2 (Linux) ngay khi khởi động, giúp tiết kiệm thời gian trong việc collect metrics và log lên CloudWatch.

Lab Details

  1. Duration: 15 phút
  2. AWS Region: us-east-1

Task Details

  1. Create Instance Profile (IAM role) cho EC2
  2. Create EC2 với user data script (cài đặt và cấu hình CloudWatch Agent)
  3. Verify kết quả
  4. Clean up

1. Create Instance Profile (IAM role) cho EC2

Trước tiên, chúng ta cần tạo Instance Profile cho EC2, phải có quyền tối thiểu là CloudWatchAgentServerPolicy để cho phép:

  • Cài đặt và cấu hình CloudWatch Agent
  • Gửi logs và metrics từ CloudWatch Agent đến CloudWatch

Tại Console IAM, thực hiện tạo Role như sau:

  • Use caseEC2
  • Permissions policies
    • CloudWatchAgentServerPolicy
  • Role nameEC2CloudWatchAgentRole

2. Create EC2 với user data script

Tiếp theo chúng ta sẽ tạo EC2 ở default VPC. Default thì Region nào cũng có default VPC, nếu bạn không xoá thì nó sẽ ở đó - không ảnh hưởng gì đến hệ thống cả. Nếu bạn nào vô tình xoá thì cũng có thể tạo lại được

Tại EC2 console, chọn Instance ở menu bên trái, click Launch Instances

Name: clw-agent-demo 

OS Images (AMI): Amazon Linux 2023

Instance type: t2.micro (loại này support free tier)

Key pair: chọn key pair đã có sẵn hoặc tạo mới

Network: Sử dụng default VPC, chọn default SG

Configue storage: để default

Mở Advanced details

IAM instance profile: gắn role EC2CloudWatchAgentRole vừa tạo ở step 1  

Kéo xuống User data: setting user data (lưu ý copy chính xác script bên dưới)

User data script sẽ thực hiện các việc sau:

  • Cài đặt CloudWatch Agent
  • Collect 2 metrics với namespace (CWAgent), Aggregation Dimension ( InstanceId )
    • Metric 1: mem_used_percent
    • Metric 2: disk_used_percent
  • Collect logs của CloudWatch Agent và đẩy vào CloudWatch Log group name: /aws/ec2/CLW-AGENT-LOGS-DEMO

User data script:

#!/bin/bash

set -e  # Exit immediately if a command exits with a non-zero status

# Variables
LOG_FILE_PATH="/var/log/amazon/ssm/amazon-ssm-agent.log"
CONFIG_FILE_PATH="/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json"
CONFIG_TEMP_FILE="/tmp/amazon-cloudwatch-agent.json"
CWAGENT_INSTALL_URL="https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm"
LOG_GROUP_NAME="/aws/ec2/CLW-AGENT-LOGS-DEMO"

# Function to log messages
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# Check for package manager and install CloudWatch Agent
if command -v dnf &> /dev/null; then
    log_message "Installing CloudWatch Agent using dnf"
    sudo dnf -y install amazon-cloudwatch-agent
elif command -v yum &> /dev/null; then
    log_message "Installing CloudWatch Agent using yum"
    yum install -y $CWAGENT_INSTALL_URL
else
    log_message "Neither dnf nor yum found. Exiting."
    exit 1
fi

# Check if CloudWatch Agent is installed
if ! command -v amazon-cloudwatch-agent-ctl &> /dev/null; then
    log_message "CloudWatch Agent installation failed. Exiting."
    exit 1
fi

# Create the CloudWatch Agent configuration file
log_message "Creating CloudWatch Agent configuration file"
tee $CONFIG_TEMP_FILE > /dev/null <<EOF
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "root"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "$LOG_FILE_PATH",
                        "log_group_name": "$LOG_GROUP_NAME",
                        "log_stream_name": "{instance_id}"
                    }
                ]
            }
        }
    },
    "metrics": {
        "namespace": "CWAgent",
        "aggregation_dimensions": [
            [
                "InstanceId"
            ]
        ],
        "append_dimensions": {
            "ImageId": "\${aws:ImageId}",
            "InstanceId": "\${aws:InstanceId}",
            "InstanceType": "\${aws:InstanceType}"
        },
        "metrics_collected": {
            "mem": {
                "measurement": [
                    "used_percent"
                ]
            },
            "disk": {
                "measurement": [
                    "used_percent"
                ]
            },
        }
    }
}
EOF

# Ensure the configuration directory exists
log_message "Ensuring configuration directory exists"
mkdir -p $(dirname $CONFIG_FILE_PATH)

# Move the configuration file to the correct location
log_message "Moving configuration file to $CONFIG_FILE_PATH"
mv $CONFIG_TEMP_FILE $CONFIG_FILE_PATH

# Configure the CloudWatch Agent
log_message "Configuring CloudWatch Agent"
amazon-cloudwatch-agent-ctl -a stop
amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:$CONFIG_FILE_PATH

# Enable and start the CloudWatch Agent
log_message "Enabling and starting CloudWatch Agent"
systemctl enable amazon-cloudwatch-agent
systemctl start amazon-cloudwatch-agent

# Verify the Agent is running
log_message "Verifying CloudWatch Agent status"
if systemctl is-active --quiet amazon-cloudwatch-agent; then
    log_message "CloudWatch Agent is running successfully"
else
    log_message "CloudWatch Agent failed to start"
    exit 1
fi

Click chọn Launch instance

Đợi một chút thì EC2 đã running và Status check đã passed hoàn toàn

3. Verify kết quả

3.1. Verify Log group

CloudWatch console > Log groups : /aws/ec2/CLW-AGENT-LOGS-DEMO đã được tạo thành công

Click chọn /aws/ec2/CLW-AGENT-LOGS-DEMO

Log streams đã được tạo thành công và group theo instance ID

Click chọn instance ID

CloudWatch Log đã collect thành công Log events từ CloudWatch Agent

3.2. Verify metrics

CloudWatch console > All metrics : Custom namespaces CWAgent đã được tạo thành công

Click chọn CWAgent

Aggregation Dimension InstanceIdđã được tạo thành công

Click InstanceId

Đã collect thành công 2 metrics:

  • mem_used_percent
  • disk_used_percent

Có thể tick chọn metrics để xem biểu đồ của các metrics theo thời gian

Tại đây chúng ta có thể tạo Alarm cho metrics để gửi cảnh báo khi có vấn đề xảy ra.

Tham khảo link dưới đây:

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Alarm-On-Metrics.html

4. Clean up

  • Xoá EC2
  • Xoá IAM Role
  • Xoá Log group

Challenge:

Tổng kết

Như vậy vừa rồi mọi người đã cùng CloudMentorPro tìm hiểu cách setup CloudWatch Agent bằng user data script để collect metrics và log sau đó gửi đến CloudWatch. Từ đó tối ưu hóa được quá trình cài đặt và config CloudWatch Agent một cách nhanh chóng, cũng như monitoring được metrics và log của hệ thống trên CloudWatch. Ngoài ra còn rất nhiều tính năng xịn xò khác mà CloudWatch cung cấp như Dashboard, Alarm, Logs Insights, X-Ray traces, ..vv không chỉ giúp bạn giám sát hệ thống một cách toàn diện, mà còn giúp tối ưu hóa hiệu suất, phát hiện và xử lý sự cố nhanh chóng, đảm bảo rằng dịch vụ của bạn luôn hoạt động ổn định và hiệu quả.

Lời cuối cùng CloudMentorPro cám ơn mọi người đã theo dõi bài blog này, hi vọng bài blog sẽ hữu ích cho mọi người. Nếu có chỗ nào chưa rõ cần trao đổi thêm hoặc các bạn muốn tụi mình viết thêm blog về chủ đề nào đó thì đừng ngần ngại hãy comment cho chúng mình biết nhé!

Hẹn gặp lại mọi người ở các bài blog tiếp theo nha !

Tài liệu Tham khảo: