Collect application logs to AWS Cloudwatch Logs

Posted by MinhHungTrinh on 2021-04-25
Estimated Reading Time 9 Minutes
Words 1.5k In Total
Viewed Times

Khi triển khai 1 hệ thống thực ra có nhiều thành phần, và phân tán trên nhiều server. Nên việc tập trung logs lại là cực kỳ quan trọng. Nó giúp cho việc chúng ta debug, theo dõi ứng dụng hoạt động được tốt hơn.

Một ví dụ đơn giản như bạn có 1 web application sử dụng load balancer với với hơn chục con server (ec2) đằng sau. Bây giờ nếu bạn truy cập vào từng server để đọc logs thì thật vất vả. Hơn nữa hệ thống có thể autoscale server khiến server đó mất đi hoặc vì lý do nào đó (failover) xịt luôn server. Vậy nên bạn cần phải collect log, nó là rất cần thiết.

Có nhiều giải pháp cho việc này:

  • Với open source thì có nhiều, bạn có thể tham khảo ELK stack. Bạn sẽ tốn chi phí về triển khai, quản lý nhưng ngược lại tiết kiệm được chi phí duy trì, (tức là chỉ cần server, các soft quản lý liên quan là free do là open source). Tất nhiên, ELK còn cung cấp rất nhiều tính năng bổ sung. Nhưng bạn cũng phải tự đưa ra giải pháp để backup ELK này để bảm đảm tính bền vững của data. Nói chung ở case 1 này, trách nhiệm của Devops là nhiều khi phải tốn công xây dựng.
  • Một giải pháp nữa collect logs là sử dụng S3 để lưu trữ. Giải pháp này giúp tiết kiệm chi phí (build triển khai-không tốn nhiều công triển khai và duy trì- phí service cũng thấp) cũng như giúp việc lưu trữ logs bền bỉ, không lo bị mất. Nhưng nhược điểm là không có GUI để thao tác, đơn thuần chỉ là 1 cloud storage để lưu trữ logs file. Cần check log thì phải download về hoặc import tới ứng dụng khác.
  • Với AWS bạn có thể tham khảo Cloudwatch Logs nữa nhé. Và bài này mình sẽ nói về cloudwatch logs. Nói chung nó tận dụng được điểm mạnh về service là đảm bảo logs của bạn an toàn, dễ triển khai. Hơn nữa nó lại có GUI nữa. Nhưng tất nhiên bạn cũng phải bỏ chi phí collect logs trên Cloudwatch. Nói chung với hệ thống lớn thì chi phí Cloudwatch sẽ đắt hơn sử dụng opensource. Nhưng với hệ thống nhỏ và vừa thì chưa chắc. Nên bạn hãy cân nhắc nhé.

Chi tiết hơn về Cloudwatch Logs:

main
3 steps chính để cấu hình stream logs từ EC2 tới Cloudwatch Logs:

  • Tạo IAM role cho EC2 để có permission thao tác tới Cloudwatch Logs
  • Attach IAM role tới các EC2 instance cần collect logs
  • Install và configure CloudWatch agent

1. Tạo IAM Role

Để cho phép EC2 có thể thao tác với Cloudwatch, bạn cần tạo 1 IAM Role (mình khuyến khích sử dụng IAM Role thay cho IAM user để đảm bảo security nhé).

Truy cập Console => IAM => Roles => create

main

Lựa chọn service sử dụng role là EC2 nhé. Tiếp tục thì lựa chọn Permission cho Role:

Mình sẽ lựa chọn 1 default policy CloudWatchAgentServerPolicy . Các bạn có thể customize lại cũng được nhé, cho nó limit hơn.

main

Và tiếp tục là đánh tags, đặt tên và Click Review để tạo Role thôi.

2. Attach Role tới EC2

Việc attach tới 1 EC2 có thể làm như sau, truy cập EC2 trên console và thực hiện attach role mới tạo vào EC2.

main

và sau đó attach role.
main

Thực tế thì chúng ta thường cần collect log của cả 1 autoscale group chẳng hạn, thì mọi người hãy attach nó ở trong launch config hoặc launch template nhé.

3. Cài đặt và Cấu hình AWS Cloudwatch Agent

Chúng ta sẽ cài đặt trên EC2, với autoscale group thì các bạn nhớ tạo trên 1 ec2 rồi tạo AMI cho autoscale group đó nhé.
Yêu cầu đầu tiên là EC2 phải có aws-cli. Bạn có thể check với command aws version

Tiếp theo sẽ download cloudwatch agent. (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html) mọi người lựa chọn theo OS nhé. Ở đây mình sử dụng ubuntu:

1
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb

Cài đặt nhé:

1
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

OK vậy là đã có cloudwatch agent.

Tiếp theo sẽ tạo file config, cái mà quyết định bạn sẽ collect folder logs nào.
Config file đặt ở: /opt/aws/amazon-cloudwatch-agent/bin/config.json
Chúng ta thực hiện chỉnh sửa nội dung nhé sudo vim /opt/aws/amazon-cloudwatch-agent/bin/config.json . Ở đây mình sẽ thực hiện collect logs của apache chẳng hạn.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"agent": {
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/apache2/error.log",
"log_group_name": "apache-error-log",
"log_stream_name": "{instance_id}"
}
]
}
}
}
}

The most important part of the config file is file_path. This is the path to the log file on the server that you want to collect data from. /var/log/apache2/error.log is the default error log for Apache on Ubuntu. The log_group_name and log_stream_name options are just used for naming the Log Group and Log Streams respectively in CloudWatch. I’d recommend keeping {instance_id} for the log_stream_name as this helps identify which EC2 instance sent the log data.
Một vài thông tin quan trọng như sau. file_path là path tới file bạn bạn cần collect. log_group_namelog_stream_name chính là các namespace được hiển thị trên dịch vụ Cloudwatch Logs. Việc để log_stream_name là instance-id giúp chúng ta phân biệt được logs của server nào, không bị nhầm lẫn.

Cuối cùng để enable việc collect log, chúng ta cần start winzard

1
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

### Start Agent:

1
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

Sau khi thực hiện run command, agent được tích hợp vào systemd, vậy nên nó sẽ tự động start nếu bạn có reboot, stop-start.

View Logs

Truy cập dịch vụ Cloudwatch => Cloudwatch Logs. Bạn sẽ thấy thông tin như trên nhé.

main

main

main

Bạn có thể theo dõi logs của application. Bài viết này mình có lấy hình ảnh cũng như tham khảo nội dung các steps để tích hợp Cloudwatch từ https://www.rapidspike.com/blog/how-to-send-log-files-to-aws-cloudwatch-ubuntu/ . Do cũng lười build lại hệ thống. Mục đích cũng nhằm để note lại thôi. Cảm ơn mọi người đã theo dõi bài viết.


Đây là Blog cá nhân của MinhHungTrinh, nơi mình chia sẻ, lưu giữ kiến thức. Nếu các bạn có góp ý, thắc mắc thì vui lòng comment bên dưới cho mình biết nhé. Mình luôn là người lắng nghe và ham học hỏi. Các vấn đề đặc biệt hoặc tế nhị mọi người có thể gửi email tới minhhungtrinhvn@gmail.com. Cảm ơn Mọi Người đã đọc Blog của mình. Yolo!