媽耶~看看這精美的費用表,我也才架一個最低配的 VM 與 Map API 服務而已。
一個月要 $NT 1200 多,到底算便宜還是貴呢 ? 可是感覺我玩不起…,等抵免額用完,就把服務關一關吧~
為了盡量省錢,當然要確認是不是有人在偷用我服務,導致這麼貴(被害妄想症)。
因為我的服務皆是以 Docker 容器進行架設,監控的流程架構圖,如下:
使用者部署服務,服務透過 Docker 將運作訊息傳入到 ELK ,然後 ELK 設定相關警報並傳送資訊給 Slack,最後使用者可以在 Slack 上觀看相關訊息。
我的作業環境是 Ubuntu 與 Mac 皆有,Windows 沒有測試過。
ELK 介紹
首先,先介紹 ELK 部分,他其實是 Elasticsearch-Logstash-Kibana 的縮寫,是一個常用且基本的監控架構。透過 Logstash 收集訊息,然後交給 Elasticsearch 儲存訊息,最後由 Kibana 進行視覺化,提供給使用者進行操作。
架設 ELK
這邊我是使用了 Docker-elk,透過這個 GitHub 專案,使用 docker-compose 可以快速將整套 ELK 系統架設起來,站在巨人的肩膀上,方便且容易上手。
(這邊記得要自行安裝 Docker 與 Docker compose 唷~)
Step-1
下載 Docker-elk 專案
git clone https://github.com/deviantony/docker-elk.git
Step-2
進入到專案資料夾內,確認 port 都沒有被佔用
- 5000: Logstash TCP input
- 9200: Elasticsearch HTTP
- 9300: Elasticsearch TCP transport
- 5601: Kibana
這邊我看運作起來與專案作者的 docker compose 都還有 9600 與 5044 都有被佔用,但 README 只有寫其他四個 ports,所以也注意一下這兩個 ports 不要被佔用吧。
Step-3
將 docker compose 運行起來吧~
sudo docker-compose up -d
之後運行 docker ps
應該就可以看到容器在運作囉~
Step-4
設定 Kibana index pattern ,告訴 Elasticsearch 搜尋的索引名稱
這邊我們是使用 Logstash 所以將他加入到 index pattern 中,透過下面指令:
sudo curl -XPOST -D- 'http://localhost:5601/api/saved_objects/index-pattern' \
-H 'Content-Type: application/json' \
-H 'kbn-version: 7.2.1' \
-u elastic:<your generated elastic password> \
-d '{"attributes":{"title":"logstash-*","timeFieldName":"@timestamp"}}'
<your generated elastic password> 沒變更的話,預設是 changeme。
之後你可以在 Kibana Index patterns 看到設定的 Logstash 格式
Docker 介紹
Docker 應該就不用多做介紹了,若有興趣,網路上很多介紹文,這邊只說明如何將訊息傳送至 ELK。
Logging Driver
這是 Docker daemon 的基本日誌機制,通常如果沒有特別改為其他種日誌的話,每個 container 基本上都是採用此日誌作為默認設定。
當我每次要查看容器的服務狀況,都只能夠去 VM 上,然後使用 docker logs 查看容器內運作狀況,非常麻煩。
所以這邊我將容器內的 logs 資訊,傳送給 Logstash 進行訊息分析。
其實不會很難,只要在你想運行的容器加上這段即可:
sudo docker run \
--log-driver=syslog \
--log-opt syslog-address=tcp://<Your IP>:5000 \
--log-opt syslog-facility=daemon
假設我今天要加設的服務 port 為 3000,images 為 hello-web-service,範例如下:
sudo docker run \
--log-driver=syslog \
--log-opt syslog-address=tcp://<Your IP>:5000 \
--log-opt syslog-facility=daemon \
-p 3000:3000 -d hello-web-service
syslog → 系統日誌格式
其中 tcp://<Your IP>:5000
就是將訊息傳送到 Logstash 位置
簡單吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
可是你之後 docker logs 再去看該容器內容,就會無法顯示了。
現在你可以看到你的 Kibana 上面服務的運作資訊囉
如果帳號密碼沒改的話,預設如下:
帳號:elastic
密碼:changeme
好玩吧!
Slack 介紹
相信很多人都有用過 Slack 來作為團隊溝通的平台,所以我們這邊警報訊息傳送到這邊感覺相當適合。
Slack 設定
基本上也就是照著 Slack Action 的相關設置,這邊簡單說明步驟與要注意的地方。
Step 1
去建立一個 Slack ,並到 incoming-webhooks 去設定你要傳送的頻道。
然後你可以拿到他的 webhooksurl,之後就是重頭戲了
首先要將其 webhooks url 加入到 elasticsearch (這邊要注意,在 elasticsearch 7.x 版本以後,似乎不支援在 elasticsearch.yml 中設定 webhooks url 了)
所以這邊我們透過進入 Elasticsearch 的容器內去將 webhooks url 加入到 keysrote 內。
# step-1
sudo docker exec -it <elasticsearch containerID> /bin/bash# step-2
bin/elasticsearch-keystore add xpack.notification.slack.account.monitoring.secure_url
接下來就是第一個坑了,當你輸入完 step-2 指令,會跳出讓你輸入 webhooks url 的地方,如下:
但是當你複製貼上你的 webbooks url,他根本不會顯示出來,然後根本不知道有沒有貼上成功,也不能看裡面內容 (我去 keystore 裡面看也沒有,還是我搞錯方法查看),媽耶~
再來跳出容器後,到專案修改 elasticsearch.yml 內容。
# step-1
vim elasticsearch/config/elasticsearch.yml# step-2 貼上傳送到 slack 的默認格式
xpack.notification.slack:
account:
monitoring:
message_defaults:
from: x-pack
to: notifications
icon: http://example.com/images/watcher-icon.jpg
attachment:
fallback: "X-Pack Notification"
color: "#36a64f"
title: "X-Pack Notification"
title_link: "https://www.elastic.co/guide/en/x-pack/current/index.html"
text: "One of your watches generated this notification."
mrkdwn_in: "pretext, text"
最後重啟 elasticsearch 這一個容器,讓剛剛修改的設定載入。
sudo docker-compose restart elasticsearch
Step-2
這一步是設定警報的部分,首先到 Kibana 的頁面去進行操作。
到 Management 的 Watcher 去建立一個門檻警報 (Create threshold alert)
Name → 警報器名稱
Indices to query → 查詢的訊息指標
Run watch every → 多久檢查一次
上圖就是警報運作的條件,接下來我們選擇當條件成立,所執行的動作。
我們選擇將警報訊息傳送到 Slack 上面。
這邊要注意的是 Recipient 這邊要填寫的是 Slack 頻道的名稱唷!
(沒看到哪裡有寫,搞得我在猜那邊到底填什麼,媽耶~)
Message 則是你想傳送的訊息。
最後儲存完,整個監控流程就完成了。
成果
上面影片中,我使用這流程來監控我之前的小專案,影片中我將警報的 log 次數設為十次,並一直重新整理及搜尋專案網頁,最後可以看到一但超過次數,會自動傳訊息到 Slack 平台上。
是不是 So Fun So Fantastic 啊~
圖片來源
https://www.pinterest.com/pin/617204323913252675/