Log Monitoring with ELK Stack
ELK Stack + Beats (FileBeat) แบบใช้ User/Password
เนื่องจากเป็นความเจ็บช้ำจากการหาวิธีใช้ ELK Stack เพื่อทำ Monitoring System เป็นการส่วนตัว จะขอ Skip ข้ามว่าทำไมถึงเลือก ELK Stack ไปเลยนะครับ เชื่อว่าคนที่เข้ามาอ่านบทความนี้ ล้วนแต่ศึกษาและอยากจะใช้เจ้าตัว ELK Stack กันอยู่แล้ว
บทความนี้เป็นกึ่งการจดบันทึกความเข้าใจ หาก อ่าน/ย่อย ยากเกินไปขออภัยไว้ล่วงหน้าครับ
ELK Stack
Stack ที่ใช้ทั้งหมดในการทำ Monitoring System (version 8.5)
- Elastic
- Kibana
- Logstash
- Bests (Filebeat)
Setup Docker Compose
ผมเลือกที่จะใช้ Docker compose เพื่อจัดการ service ต่าง ๆ แทนการ install ลงในเครื่อง server เพราะมันจัดการได้ง่ายกว่า
ตัวอย่าง code สามารถดูได้ในนี้ ELK Stack + Beats (Filebeat) [8.5]
Setup Elastic
หลังจากที่ Service ทั้งสามตัวขึ้นมาแล้ว (อาจมี Down ไปบ้าง) สิ่งที่เราต้องทำก่อนเลยคือ Setup User ของระบบทั้งหมด ซึ่งสามารถ Setup ได้ผ่าน Elastic
โดยเราสามารถ exec เข้า container ของ elastic เพื่อเข้าไปใช้คำสั่ง
bin/elasticsearch-setup-passwords interactive
หลังจากที่เรา Setup Password ของ Built-in User เสร็จแล้ว เราจะนำรหัสที่เราตั้ง ไปอัพเดทในไฟล์ kibana.yml เพื่อให้ kibana สามารถติดต่อกับ elastic ได้ โดยใช้ User kibana_system
ถ้าอยากรู้ว่าหน้าตา Elastic เป็นอย่างไร เข้าไปได้เลยที่ 0.0.0.0:5601
User/Password ที่ใช้สำหรับเข้าสู่ Elastic คือ elastic (เป็น superuser) ในการเข้าไปตั้งค่าระบบต่าง ๆ
เมื่อเข้ามาแล้วเราจะเป็นต้องสร้าง Role/User เพิ่มสำหรับให้ Logstash ใช้เชื่อมต่อเข้ามายัง Elasticโดยสามารถ Setup ตามรูปได้เลย ถ้าอยากอ่านเพิ่มว่าแต่ละ Privileges คืออะไร กดตรง Securities Privileges
indices เป็น * เพราะอยากให้ส่งมาได้ทุก index (กรณีใช้ Logstash กับจักรวาลเดียว)
เมื่อสร้าง Role เสร็จแล้วเราก็จะไปสร้าง User ที่มี Role ที่เราเพิ่งสร้างไป (ตั้งตามสะดวก) เสร็จแล้วเราจะนำ User นี้ ไปใช้กับ logstash.yml เพื่อตั้งว่าการ output ออกจาก Logstash -> Elastic จะเข้าผ่าน User/Password อะไร
Filebeat
เมื่อเราทำฝั่ง ELK เสร็จแล้ว ขั้นตอนต่อไปจะเป็นการขนส่ง Log เข้าไปยัง Logstash
โดย Beats ก็จะมีให้เราใช้ตามประเภทของข้อมูลที่เราต้องการจะนำส่ง โดยถ้าเป็น Log file/ Container Log ธรรมดา ก็จะใช้ Filebeat
ตัวอย่าง Compose และ Config file ดูได้ ที่เดิม ในกรณีที่เราต้องการอ่าน Log File (type filestream) ให้เรา Mount Log File เพิ่มใน Compose ด้วย
Log File
ถ้าเราต้องการนำ Log File เข้าไปใน ELK ให้เราใช้ Input ประเภท filesteam ตัวอย่างสามารถดูได้ใน gist หรือใน document ไม่มีอะไรซับซ้อน เพียงแต่เราต้อง Mount เข้ามาด้วย
Container Log
ถ้าเราอยากจะนำ Log ของ Docker เข้าไปใน ELK จะต้องไปใช้ autodiscover ที่ provider type เป็น docker ด้วยเหตุผลว่า filebeat จะสามารถดึงข้อมูล metadata ของ docker ออกมาได้ เช่น container_name, container_id เป็นต้น
โดยที่สำคัญคือเราต้อง Mount docker.sock และ docker log file เข้าไป เพื่อให้ Filebeat สามารถ Access เข้าถึง Docker Log ของเราได้ (ตัวอย่างอยู่ใน gist)
ที่เรา Mount ทั้ง /var/run เพื่อเวลาที่ Container restart เราไม่ต้อง Restart Filebeat Service
ถ้าเราอยากทดสอบ Filebeat เพียงตัวเดียวก่อน สามารถใช้ output.console.pretty: true เพื่อเปลี่ยน output เป็น console (จะอยู่ใน Docker Log) แทนได้ ซึ่งจะต้องปิด output ตัวอื่นออกก่อน ไม่สามารถ output ออกหลายทางได้
ถ้าเราทำทั้งหมดนี้ถูกต้อง และเราตั้ง index ถูก เราจะสามารถเข้าไปสร้าง Data View ใน Discovery ของ Kibana ผ่าน index ที่เราตั้งได้