本文介紹如何通過阿里雲Log ServiceSplunk Add-on將Log Service上的日誌投遞到Splunk。
架構
Splunk Add-on架構:
通過Splunk Data Input建立Log Service消費組,並從Log Service進行即時日誌消費。
將採集到的日誌通過Splunk私人協議(Private Protocol)或者HTTP Event Collector(HEC)投遞到Splunk indexer。
此Add-on僅用於採集資料,只需要在Splunk Heavy Forwarder上安裝,不需要在Indexer和Search Head上安裝。
機制
一個Data Input相當於一個消費者,對日誌進行消費。
一個消費組由多個消費者構成,同一個消費組下面的消費者共同消費一個Logstore中的資料,消費者之間不會重複消費資料。
一個Logstore下面會有多個Shard。
每個Shard只會分配到一個消費者。
一個消費者可以同時擁有多個Shard。
所建立的消費者名字是由消費組名、host名、進程名、event協議類型組合而成,保證同一消費組內的消費者不重名。
更多關於消費組的資訊,請參見通過消費組消費資料。
準備工作
擷取Log Service的AccessKey。
您可以通過阿里雲RAM擷取Log ServiceProject的AccessKey。更多資訊,請參見存取金鑰和通過存取金鑰訪問資料。
您可以通過許可權助手配置RAM許可權。更多資訊,請參見配置許可權助手。常用的RAM配置如下:
說明<Project name>為您的Log ServiceProject名稱,<Logstore name>為您的Log ServiceLogstore名稱,請根據實際情況替換,名字替換支援萬用字元*。
{ "Version": "1", "Statement": [ { "Action": [ "log:ListShards", "log:GetCursorOrData", "log:GetConsumerGroupCheckPoint", "log:UpdateConsumerGroup", "log:ConsumerGroupHeartBeat", "log:ConsumerGroupUpdateCheckPoint", "log:ListConsumerGroup", "log:CreateConsumerGroup" ], "Resource": [ "acs:log:*:*:project/<Project name>/logstore/<Logstore name>", "acs:log:*:*:project/<Project name>/logstore/<Logstore name>/*" ], "Effect": "Allow" } ] }
檢查Splunk版本及運行環境。
確保使用最新的Add-on版本。
作業系統:Linux、Mac OS、Windows。
Splunk版本:Splunk heavy forwarder 8.0及以上版本、Splunk indexer 7.0及以上版本。
配置Splunk HTTP Event Collector。更多資訊,請參見Configure HTTP Event Collector on Splunk Enterprise。
如果需要使用HEC來發送event,請確保HEC配置成功。如果選擇Splunk私人協議,則可以跳過該步驟。
說明目前建立Event Collector token時,不支援開啟indexer acknowledgment功能。
安裝Add-on
您可以登入Splunk web UI頁面,通過以下兩種方法安裝Splunk Add-on。
此Add-on僅用於採集資料,只需要在Splunk Heavy Forwarder上安裝,不需要在Indexer和Search Head上安裝。
方法一
單擊表徵圖。
在應用頁面,單擊瀏覽更多應用。
搜尋Alibaba Cloud Log Service Add-on for Splunk,單擊安裝。
安裝完成後,根據頁面提示重啟 Splunk服務。
方法二
單擊表徵圖。
在應用頁面,單擊從檔案安裝應用。
選擇目標.tgz檔案,單擊上傳。
您可以App Search Results上下載目標.tgz檔案。
單擊安裝。
安裝完成後,根據頁面提示重啟 Splunk服務。
配置Add-on
當Splunk運行在非阿里雲ECS上時,您可以使用阿里雲存取金鑰AccessKey ID和AccessKey Secret來訪問Log Service。具體操作如下:
在Splunk Web UI頁面中,單擊Alibaba Cloud Log Service Add-on for Splunk。
配置全域帳號。
選擇
,在Account頁簽中,配置Log Service的AccessKey資訊。說明此處配置的使用者名稱、密碼分別對應Log Service的AccessKey ID、AccessKey Secret。
配置Add-on的作業記錄層級。
選擇
,在Logging頁簽中,配置Add-on的作業記錄層級。建立Data Input。
單擊輸入,進入輸入頁面。
單擊Create New Input,建立新的Data Input。
表 1. Data input參數說明
參數
必選項 & 格式
描述
取值舉例
名字
是,String
全域唯一的Data Input名。
無
間隔
是,Integer
Splunk Data Input退出後的重啟時間,單位:s。
預設值:10s
索引
是,String
Splunk索引。
無
SLS AccessKey
是,String
阿里雲存取金鑰由AccessKey ID、AccessKey Secret組成。
說明此處配置的使用者名稱、密碼分別對應Log Service的AccessKey ID、AccessKey Secret。
全域帳號配置中配置的使用者名稱和密碼。
SLS endpoint
是,String
阿里雲Log Service入口。更多資訊,請參見服務入口。
cn-huhehaote.log.aliyuncs.com
https://cn-huhehaote.log.aliyuncs.com
SLS project
是,String
Log ServiceProject。更多資訊,請參見管理Project。
無
SLS logstore
是,String
Log ServiceLogstore。更多資訊,請參見管理Logstore。
無
SLS consumer group
是,String
Log Service消費組。擴容時,多個Data Input需要配置相同的消費組名稱。更多資訊,請參見通過消費組消費資料。
無
SLS cursor start time
是,String
消費起始時間。該參數只有消費組首次建立時有效。非首次建立日誌都是從上次的儲存點開始消費。
說明這裡的時間是日誌到達時間。
取值:begin、end、ISO格式的時間(例如2018-12-26 0:0:0+8:00)。
SLS heartbeat interval
是,Integer
SLS消費者與Server間的心跳間隔。單位:s。
預設值:60s
SLS data fetch interval
是,Integer
日誌拉取間隔,如果日誌頻率較低,建議不要設得太小。單位:s。
預設值:1s
Topic filter
否,String
Topic過濾字串,以;間隔區分多個過濾的Topic。如果日誌的topic被命中,則忽略該日誌,從而不能投遞到Splunk。
“TopicA;TopicB”意味著topic為TopicA、TopicB的日誌將被忽略。
Unfolded fields
否,JSON
Json格式的topic到欄位列表的映射關係。{"topicA": ["field_nameA1", "field_nameA2", ...], "topicB": ["field_nameB1", "field_nameB2", ...], ...}
{"actiontrail_audit_event": ["event"] } 表示topic為 actiontrail_audit_event的日誌,該日誌的event欄位將把字串展開為JSON格式。
Event source
否,String
Splunk event資料來源。
無
Event source type
否,String
Splunk event資料來源類型。
無
Event retry times
否,Integer
0表示無限重傳。
預設值:0次
Event protocol
是
Splunk event發送協議。如果選擇私人協議,後續參數可以忽略。
HTTP for HEC
HTTPS for HEC
Private protocol
HEC host
是,只有Event protocol選擇HEC時有效,String。
HEC host。更多資訊,請參見Set up and use HTTP Event Collector in Splunk Web。
無
HEC port
是,只有Event protocol選擇HEC時有效,Integer。
HEC連接埠。
無
HEC token
是,只有Event protocol選擇HEC時有效,String。
HEC token。更多資訊,請參見HEC token。
無
HEC timeout
是,只有Event protocol選擇HEC時有效,Integer。
HEC逾時時間,單位:s。
預設:120s
當Splunk運行在阿里雲ECS上時,可為ECS執行個體綁定RAM角色,並以此RAM角色來訪問Log Service。具體操作如下:
請確保Splunk運行在被授予RAM角色的阿里雲ECS執行個體上。
授予執行個體RAM角色。
此操作包括建立執行個體RAM角色、為RAM角色授予許可權和為執行個體授予RAM角色。具體操作,請參見配置ECS執行個體RAM角色。
其中,RAM角色的權限原則請參見準備工作中AccessKey的授權策略。
在Splunk Web UI頁面中,單擊Alibaba Cloud Log Service Add-on for Splunk。
配置全域帳號。
選擇步驟1中所建立的RAM角色名稱。
,在Account頁簽中,配置ECS執行個體的RAM角色資訊。即添加一個帳號,使用者名稱為ECS_RAM_ROLE,密碼為建立Data Input。
單擊輸入,進入輸入頁面。
單擊Create New Input,建立新的Data Input。
其中SLS AccessKey參數需配置為步驟3中所建立的全域帳號,其他參數說明請參見Data input參數說明。
開始工作
查詢資料
首先確保建立的Data Input是啟動狀態。然後您可以在Splunk web UI首頁單擊Search & Reporting,進入App: Search & Reporting頁面,查詢採集到的審計日誌。
內部日誌
使用
index="_internal" | search "SLS info"
查詢Log Service相關的資訊。使用
index="_internal" | search "error"
查詢運行時的錯誤資訊。
效能與安全
效能規格
Log ServiceSplunk Add-on效能及資料轉送的輸送量受到如下因素的影響:
服務入口:可以使用公網、傳統網路、VPC網路或者Global Acceleration服務入口。一般情況下,建議採用傳統網路或VPC網路的服務入口。更多資訊,請參見服務入口。
頻寬:包括Log Service與Splunk heavy forwarder間的頻寬、Splunk heavy forwarder與indexer之間的頻寬。
Splunk indexer處理能力:indexer的資料接收能力。
Shard數量:對於單個Log ServiceLogstore,配置的Shard數越多,資料轉送能力越強。您需要根據原始日誌的產生速率確認Shard數量。更多資訊,請參見管理Shard。
Splunk Data Input的配置數量:同一個Logstore,配置越多的Data Input(相同的消費組),輸送量越大。
說明消費者的並發受到Log ServiceLogstore Shard數量的影響。
Splunk heavy forwarder佔用的CPU core數和記憶體:一般情況下一個Splunk Data Input需要消耗1~2GB記憶體,佔用1個CPU core。
當上述條件滿足的情況下,一個Splunk Data Input可以提供1M/s~2M/s的日誌消費能力。實際使用時,您需要根據原始日誌的產生速率確認Shard數量。
例如,一個Logstore有10M/s的日誌生產能力,需要至少拆分出10個split,並且在Add-on中配置10個Data Input。如果是單機部署,需要具備10個空閑CPU core及12G的記憶體。
高可用性
消費組將檢測點(check-point)儲存在伺服器端,當一個消費者停止,另外一個消費者將自動接管並從斷點繼續消費。可以在不同機器上建立Splunk Data Input,這樣在一台機器停止或者損壞的情況下,其他機器上的Splunk Data Input建立的消費者可以自動接管並從斷點進行消費。理論上,為了備用,也可以在不同機器上啟動大於Shard數量的Splunk Data Input。
使用HTTPS
Log Service
如果服務入口(endpoint)配置為https://首碼,例如https://cn-beijing.log.aliyuncs.com,程式與Log Service的串連將自動使用HTTPS加密。
伺服器憑證*.aliyuncs.com是GlobalSign簽發,預設大多數Linux、Windows的機器會自動信任此認證。如果某些特殊情況,機器不信任此認證,請參見Install a trusted root CA or self-signed certificate。
Splunk
為了使用HTTPS的HEC能力,需要在Splunk HEC全域配置介面上開啟SSL功能。更多資訊,請參見Configure HTTP Event Collector on Splunk Enterprise。
AccessKey儲存保護
Log Service的AccessKey和Splunk的HEC token等關鍵資訊,都儲存在Splunk保密儲存中,不用擔心泄漏風險。
常見問題
配置錯誤
當建立或修改Data Input時,會有基本配置資訊檢查,配置參數說明請參見Data input參數說明。
Log Service配置錯誤,例如建立消費組失敗。
命令:
index="_internal" | search "error"
異常日誌:
aliyun.log.consumer.exceptions.ClientWorkerException: error occour when create consumer group, errorCode: LogStoreNotExist, errorMessage: logstore xxxx does not exist
ConsumerGroupQuotaExceed錯誤
在Log Service中,一個Logstore最多配置20個消費組。請在Log Service控制台查看消費組資訊,如果空閑數量不足,建議刪除不需要的消費組。如果超過20個消費組,系統會報ConsumerGroupQuotaExceed錯誤。
許可權錯誤
無許可權訪問阿里雲Log Service
命令:
index="_internal" | search "error"
異常日誌:
aliyun.log.consumer.exceptions.ClientWorkerException: error occour when create consumer group, errorCode: SignatureNotMatch, errorMessage: signature J70VwxYH0+W/AciA4BdkuWxK6W8= not match
ECS RAM鑒權失敗
命令:
index="_internal" | search "error"
異常日誌:
ECS RAM Role detected in user config, but failed to get ECS RAM credentials. Please check if ECS instance and RAM role 'ECS-Role' are configured appropriately.
其中,ECS-Role為您建立的RAM角色,將根據實際情況顯示。
可能原因:
確認Data Input中的SLS AccessKey參數是否已配置為具備RAM角色的全域帳號。
確認全域帳號是否正確配置了RAM角色,帳號必須為ECS_RAM_ROLE,密碼為RAM角色名稱。
確認ECS執行個體是否已綁定RAM角色。
確認RAM角色的可信實體類型是否為阿里雲服務,受信服務是否為雲端服務器。
確認綁定RAM角色的ECS執行個體是否為運行Splunk的機器。
無許可權訪問HEC
命令:
index="_internal" | search "error"
異常日誌:
ERROR HttpInputDataHandler - Failed processing http input, token name=n/a, channel=n/a, source_IP=127.0.0.1, reply=4, events_processed=0, http_input_body_size=369 WARNING pid=48412 tid=ThreadPoolExecutor-0_1 file=base_modinput.py:log_warning:302 | SLS info: Failed to write [{"event": "{\"__topic__\": \"topic_test0\", \"__source__\": \"127.0.0.1\", \"__tag__:__client_ip__\": \"10.10.10.10\", \"__tag__:__receive_time__\": \"1584945639\", \"content\": \"goroutine id [0, 1584945637]\", \"content2\": \"num[9], time[2020-03-23 14:40:37|1584945637]\"}", "index": "main", "source": "sls log", "sourcetype": "http of hec", "time": "1584945637"}] remote Splunk server (http://127.0.0.1:8088/services/collector) using hec. Exception: 403 Client Error: Forbidden for url: http://127.0.0.1:8088/services/collector, times: 3
可能原因
HEC沒有配置或啟動。
Data Input中的HEC基本資料配置錯誤。例如:如果使用HTTPS,需要開啟SSL配置。
檢查Event Collector token的indexer acknowledgment功能是否為關閉狀態。
消費時延
您可通過Log Service控制台查看消費組狀態。更多資訊,請參見步驟二:查看消費組狀態。
建議參見效能規格,採用擴充Shard數或者建立具有相同消費組的Data Input的方式解決消費時延問題。
網路抖動
命令:
index="_internal" | search "SLS info: Failed to write"
異常日誌:
WARNING pid=58837 tid=ThreadPoolExecutor-0_0 file=base_modinput.py:log_warning:302 | SLS info: Failed to write [{"event": "{\"__topic__\": \"topic_test0\", \"__source__\": \"127.0.0.1\", \"__tag__:__client_ip__\": \"10.10.10.10\", \"__tag__:__receive_time__\": \"1584951417\", \"content2\": \"num[999], time[2020-03-23 16:16:57|1584951417]\", \"content\": \"goroutine id [0, 1584951315]\"}", "index": "main", "source": "sls log", "sourcetype": "http of hec", "time": "1584951417"}] remote Splunk server (http://127.0.0.1:8088/services/collector) using hec. Exception: ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')), times: 3
正常情況下,event會自動重傳。但是如果問題持續存在,請聯絡網路系統管理員排查網路狀況。
修改消費起始時間
說明Data Input的消費起始時間參數,只有消費組首次建立時有效。非首次建立日誌都是從上次的儲存點開始消費。
在Splunk Web UI的輸入頁面,禁用目標Data Input。
登入Log Service控制台,在所消費的目標Logstore下的資料消費欄中,刪除對應的消費組。
在Splunk Web UI的輸入頁面,單擊目標Data Input右側的SLS cursor start time參數,並重新啟動Data Input。
,修改