Log Analytics (如何利用AWS服務進行Log分析)

- 作者 -
Sam Tu, Business Development Manager, AWS
David Hung, Solutions Architect, AWS

[Challenge/Scenario] 

日誌分析是常見的大數據使用案例,讓您為數位行銷、應用程式監控、詐欺偵測、廣告技術、遊戲和 IoT 等各式各樣的應用程式,分析取自網站、行動裝置、伺服器、感應器等等的日誌資料。在這個專案中,您將使用 Amazon Web Services 建立一個端到端的日誌分析解決方案,用來收集、擷取、處理及載入批次資料和串流資料,並將處理過的資料近乎即時地放入使用者現用的分析系統中供他們使用。這個解決方案高度可靠、經濟實惠、可自動擴展以因應不同的資料量,而且幾乎不需要 IT 管理。

  • 以 Cloud9 作為資料來源,在其環境中部署 Kinesis Agent,以收集資料並將資料持續傳送到 Amazon Kinesis Data Firehose。
  • 使用 Kinesis Data Firehose 建立端對端的資料交付串流。交付串流會將您的資料從代理器傳輸到目的地,包括 Amazon Kinesis Data Analytics、Amazon Elasticsearch Service 和 Amazon S3。
  • 在 Amazon Kinesis Data Analytics 中使用 SQL 查詢處理傳入的日誌資料
  • 從 Kinesis Data Analytics 載入已處理的資料到 Amazon Elasticsearch Service 以編製資料的索引。
  • 使用 Kibana 分析和視覺化已處理的資料

[SOP] 

步驟概覽 

步驟一
啟動 AWS Cloud9 執行個體並產生日誌資料
步驟二
建立  Amazon Kinesis Data Firehose Delivery Stream
步驟三
在 AWS Cloud9 上安裝 Kinesis Agent
步驟四
建立 Amazon Elasticsearch 叢集
步驟五
建立第二個 Amazon Kinesis Data Firehose Delivery Stream
步驟六
建立 Amazon Kinesis Data Analytics Application
步驟七
使用 Kibana 分析數據

步驟一、建立 EC2 執行個體並產生日誌資料

1.1
本教學部署區域為 us-east-1 (N. Virginia)
首先創建新的Cloud9 環境,只需輸入名稱,其他皆採用預設設定。
 
1.2
創建完成後,在Cloud9 介面按下 Open IDE 後,即可進入開發環境。


 
1.3 
 進入 IDE 後,在 terminal 貼上以下指令安裝必要工具
sudo yum update -y 
sudo yum install git -y
sudo pip install pytz
sudo pip install numpy
sudo pip install faker
sudo pip install tzlocal
git clone https://github.com/kiritbasu/Fake-Apache-Log-Generator.git
mkdir /tmp/logs
cp Fake-Apache-Log-Generator/apache-fake-log-gen.py /tmp/logs/ 
1.4
透過以下指令產生日誌資料,執行約 1-2 分鐘
cd /tmp/logs/
sudo python apache-fake-log-gen.py -n 0 -o LOG
1.5
透過以下指令即可找到剛產生的日誌檔
ls /tmp/logs

步驟二、建立 Amazon Kinesis Data Firehose Delivery Stream

2.1
開啟 Amazon Kinesis 操作介面,按下 Get Started,並選擇 Kinesis Data Firehose,然後點選 Create Delivery Stream 進入建立介面
2.2

在 Name and source 階段:
  • 在 Delivery stream name 選項,輸入 web-log-ingestion-stream 作為名稱
  • Choose a source 選項,選擇 Direct PUT or other sources 作為資料來源
  • 進入下一步
2.3
在 Process records screen 階段,保留所有預設設定,進入下一步

2.4
Choose a destination screen 階段:
  • Destination 選項,選擇 Amazon S3 作為目標位置
  • S3 bucket 選項,選擇 Create new 建立新的 S3 bucket 當作輸出目標.
  • 在 S3 建立介面, S3 bucket name 輸入自訂名稱,Region 選擇 us-east-1,最後點選 Create S3 Bucket,進入下一階段
2.5
Configure settings 階段,Permissions 選項中,選擇 Create or update IAM role,點選下一步,並於 Review 階段點選 Create Delivery Stream

步驟三、在 AWS Cloud9 上 安裝 Kinesis Agent

3.1
進入 AWS Cloud9 IDE,於 terminal 中輸入以下指令安裝 Kinesis Agent
sudo yum install –y aws-kinesis-agent

3.2
修改 Kinesis Agent 設定檔:

  • 在 terminal 中,透過 sudo vi /etc/aws-kinesis/agent.json 指令進入 /etc/aws-kinesis/agent.json,按下鍵盤上的 “a” 將文件修改為以下內容:
  • 修改完成後,按下鍵盤上的 esc 鍵,輸入 :wq 即可儲存並離開
  • 在 terminal 中,透過 sudo vi /etc/sysconfig/aws-kinesis-agent 指令進入環境設定,在AWS_ACCESS_KEY_ID 以及 AWS_SECRET_ACCESS_KEY 填入 IAM User 的金鑰,金鑰取得步驟可參考 IAM 官方文件
3.3
透過以下指令啟動 Kinesis Agent:
sudo service aws-kinesis-agent start
  • 啟動後可以透過 tail /var/log/aws-kinesis-agent/aws-kinesis-agent.log 觀察 Kinesis Agent 執行日誌

步驟四、建立 Amazon Elasticsearch 叢集

4.1
開啟 Amazon Elasitcsearch Service 操作介面,選擇 Create a new domain 建立新的 Amazon Elasticsearch 叢集
4.2
在 Choose deployment type 階段,Deployment type 選擇 Development and testing,其餘保持預設值,前往下一步
4.3
在 Configure domain 階段,Elasticsearch domain name 填入 web-log-summary 作為叢集名稱,其餘保持預設值,前往下一步
4.4
在 Configure access and security 階段:
  • Network configuration 選擇 Public access
  • Fine–grained access control,勾選 Enable fine-grained access control,選擇 Create master user,輸入自訂的帳號密碼

  •  在 Domain access policy 選擇 Custom access policy,並於 Enter Principal 填入您的IP,Select Action 選擇 Allow,完成後即可建立 Elasticsearch 叢集,建立過程大約耗時10分鐘。

步驟五、建立第二個 Amazon Kinesis Data Firehose Delivery Stream

5.1
開啟 Amazon Kinesis 操作介面,按下 Get Started,並選擇 Kinesis Data Firehose,然後點選 Create Delivery Stream 進入建立介面
5.2

Name and source 階段:
  • 在 Delivery stream name 選項,輸入 web-log-aggregated-data 作為名稱
  • Choose a source 選項,選擇 Direct PUT or other sources 作為資料來源
  • 進入下一步
5.3
在 Process records screen 階段,保留所有預設設定,進入下一步

5.4
Choose a destination screen 階段:
  • Destination 選項中,選擇 Amazon Elasticsearch Service作為目標位置
  • Elasticsearch domain 選項中,選擇步驟三建立的 Elasticsearch Domain
  • Index 填入 request_data
  • S3 backup 選擇 Failed records only,點選 create new 建立新的 S3 bucket
  • 其餘項目皆保持預測值,進入下一步
5.5
Configure settings 階段,Permissions 選項中,選擇 Create or update IAM role,點選下一步,並於 Review 階段點選 Create Delivery Stream,即可完成建立。

5.6 
delivery stream 新增 Elasticsearch 訪問權限: 
  • Details 頁面選擇剛剛建立的 delivery stream 之 IAM role
  • 在 IAM 設置畫面中點選 add inline policy
  • Create policy 頁面,搜尋 Elasticsearch 並選擇 All Elasticsearch Service actions
  • 在 Resource,勾選右方的 Any,完成後取名為 ElasticSearchAccess 即可完成

步驟六、建立 Amazon Kinesis Data Analytics Application 

6.1 
前往 Amazon Kinesis Analytics 操作介面,並點選 Create new application,取名為 web-log-aggregation-tutorial,使用預設值完成建立

6.2
選擇 Connect streaming data,在 Source 選擇 Kinesis Firehose delivery stream 並指定步驟二建立的 web-log-ingestion-stream

6.3
在下方找到 Schema 部分,選擇 Discover schema,等待數秒後,Amazon Kinesis Analytics 會自動偵測數據格式,並呈現以下畫面,點選 Save and continue 完成

6.4
進入 SQL editor,點選 Yes, start application,SQL editor 中,填入以下 SQL 程式碼:
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (datetime TIMESTAMP, status INTEGER, statusCount INTEGER); 

--Create pump to insert into output
CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM"

--Select all columns from source stream
SELECT STREAM ROWTIME as datetime, "response" as status, COUNT(*) AS statusCount
FROM "SOURCE_SQL_STREAM_001" GROUP BY "response", FLOOR(("SOURCE_SQL_STREAM_001".ROWTIME - TIMESTAMP '1970-01-01 00:00:00') minute / 1 TO MINUTE)
6.5
選擇 Save and run SQL,等待約一分鐘後,將會呈現查詢結果,此時點選 Destination,選擇 Connect to a destination,然後在Kinesis Firehose delivery stream 中找到並選取 web-log-aggregated-data

6.6
在 In-application stream 中,選擇 DESTINATION_SQL_STREAM,其餘保留預設值,完成建立

步驟七、使用 Kibana 分析數據

7.1 
首先前往 步驟四建立的 Elasticsearch 叢集,在 Overview 頁面中找到 Kibana 連結,輸入先前設定的帳號密碼,進入 Kibana 操作介面

7.2 
點選左下方的 Security 圖示,進入安全設定頁面,點選 Role Mapping → all_access  → add user 將步驟五建立 Kinesis Delivery Stream 之 IAM Role ARN 貼上,授與該 Delivery stream 連接 Elasticsearch 之權限


7.3
前往 Cloud9 頁面,執行以下程式碼發送日誌資料
sudo python /tmp/logs/apache-fake-log-gen.py -n 0 -o LOG
同時在另一個 terminal 中確認 Kinesis Agent 已經啟動
sudo service aws-kinesis-agent start
7.4
等待約 10 - 15 分鐘,產生足夠資料量並發送至 Elasticsearch 後,點選左方的 Dashboard,在  Define index pattern 中輸入 request_data,點選 Next stepCreate index pattern

7.5 
接著點選左方的 Visualize 圖示,進入資料視覺化介面,進行以下步驟:
  • 點選 Create new visualization
  • 選擇 Line cart ,在 Choose a search 選項中,選取 request_data*
  • 在 metrics 選項中,點選 Y-Axis 左方的箭頭展開選項,Aggregation 選擇 SumField 選擇 STATUSCOUNT
  • 在下方的 Bucket 中,選擇 X axisAggregation 選擇 TermsField 選擇 STATUS
  • 點選右上方的 箭頭 按鈕,即可看到視覺化的圖形




[FAQ]

Q1:
為何我無法成功透過 Amazon Kinesis Data Firehose 發送資料至 Elasticsearch 叢集?

A1:
首先透過 Kinesis Data Firehose 內建的 monitor 進行監控,觀察 DeliveryToElasticsearch.Success 項目,確認是否有資料成功發送,若發送失敗,可前往 CloudWatch log 檢視失敗原因,具體的錯誤排除流程可以參考 Amazon Kinesis Data Firehose 官方文件

Q2:
 如何增加 Cloud9 儲存空間?
A2:
增加 Cloud9 儲存空間的方法,請參考此官方文件 https://docs.aws.amazon.com/cloud9/latest/user-guide/move-environment.html

  • 免費註冊AWS帳號

    數百萬名客戶正使用 AWS 雲端解決方案建立提升彈性、可擴展性、安全性和可靠性的應用程式,歡迎探索各類免費方案在 AWS 上進行建置。

    免費註冊>>

  • 與我們聯絡

    遇到問題?不管是架構設計、架構優化、效能提升等等,都竭誠歡迎你/妳聯絡 AWS 的雲端業務!

    留下資料 >>

  • 與專人線上對談

    有任何新專案的想法,想要評估使用 AWS 服務,或目前在使用上需要原廠協助之處,都可以跟我們聊聊!

    開啓對話>>