如今是雲的時代,許多公司都把自己的IT架構部署在基礎架構雲(IaaS)上。著名的IaaS提供商有亞馬遜,微軟(Azure),IBM等,國內也有諸如阿里雲等。這裏亞馬遜毫無疑問是該市場的領軍者。
AWS提供了非常多的服務,領先了競爭對手一大截。並且AWS提供非常豐富的API,其API基於Rest,所以很容易被不同的語言的平臺來調用。
在如今的大數據時代,利用數據在做決策是大數據的核心價值,AWS提供了許多服務來獲取其運行數據cloudtrail和cloudwatch是經常被用到的兩個。CloudTrail是對AWS的所有API調用的日誌,CloudWatch是監控AWS服務的性能數據。(新出的Config服務可用於監控AWS的資源變化)
今天我們來看看如何使用Python(Boto AWS的開源Python SDK)來自動配置ClouTrail的服務並獲取日誌內容。
我們先來看看CloudTrail的概念和相關的配置。
-
S3 Bucket
在打開CloudTrail的服務時,需要指定一個相關的S3的Bucket,S3是亞馬遜提供的存儲服務,你可以把它當作一個基於雲的文件系統。CloudTrail的API調用日誌,會以壓縮文件的形式,存儲在你指定的Bucket裏。
-
SNS是亞馬遜提供的通知服務,該服務使用的是訂閱/發佈(Subsrcibe/Publish)的模式。在創建CloudTrail的時候,可以關聯一個SNS的Topic(可選),這樣做的好處是當有API調用時,可以第一時間得到通知。可以使用不同的客戶端來訂閱SNS的通知,例如Email,Mobile的Notification Service,SQS等
-
SQS是亞馬遜提供的隊列服務,在本文中,我們使用SQS訂閱SNS的的內容,這樣我們的Python程序就可以從SQS的隊列中獲取相應的通知。
配置CloudTrail
首先我們需要創建SNS,並指定相應的策略。代碼如下:
CloudTrail是和區域(Region)相關的,不同的Region有不同的CloudTrail服務,所以,在創建對應的SNS時,需要保證使用同一個Region。
這裏要注意的是我們創建了新的policy來使得CloudTrail擁有向我們創建的SNS發佈消息(Action=“SNS:Publish”)的權限。我們的做法是從缺省的策略中拷貝了一份,修改了相應的Action和Sid(隨便取一個不重複的名字),Principal部分是一個缺省的account的列表,這裏是硬編碼,AWS有可能會修改該列表的值,但在當前環境下,該值是固定的。最後移除Condition的值。把新創建的Policy片段添加到原來的Policy中就好了。
然後我們需要創建一個SQS的隊列,並訂閱我們創建的SNS的Topic。這一步相對比較簡單。
然後,我們需要創建一個S3的Bucket用來存儲CloudTrail產生的日誌文件。同樣的,需要指定響應的策略以保證CloudTrail能夠有權限寫入對應的日誌文件。
這裏我們使用一個缺省的Policy文件,替換掉響應的字段就好了。
最後,我們創建CloudTrail的服務:
好了,現在CloudTrail已經配置好了,並且關聯的SNS也被我們創建的SQS隊列訂閱,下面我們就可以抓取日誌了
獲取日誌數據
每當有一個API調用,CloudTrail都會把響應的日誌文件寫入到S3我們創建的Bucket中,同時在我們在創建的SNS的topic中發佈一條消息,因爲我們使用SQS的隊列訂閱了該消息,所以我們可以通過讀取SQS消息的方式來獲得日誌數據。
首先連接到SQS的隊列,並從中讀取消息
然後我們從消息中獲得響應的日誌文件在S3中的地址,並利用該地址從S3中獲得對應的日誌文件
logjson就是對應的日記內容的JSON格式。這裏有一個例子
你可以使用以上代碼來監控所有的cloudtrail的日誌,拿到的JSON格式的日誌可以放在你的數據庫(Mongo不錯)中,然後利用你的BI工具做分析。
注意你也可以不創建SNS和SQS,直接掃描bucket的內容,這樣做的好處是配置更簡單,缺點是實時性比較差,掃面Bucket需要額外的計算,並且需要在本地保存文件掃描的狀態,code會更加複雜。
利用CloudTrail的日誌,你可以做很多事情,比如看看有沒有非法的登陸,各個服務的使用頻率,總之,當你有了足夠多的數據,你就可以從中發現足夠的價值。