AWS Lambda 爬蟲建置

簡介
時間
2016.08
目標
將原本AWS EC2上的爬蟲轉為使用AWS Lambda的服務(聽說省下很多開機器的錢~
流程
主要為三部分的 Lambda function,下方流程圖請把桶子看成路徑XD

- 第一部分
主要負責定時(每小時為單位)去檢查目標網站並爬取及清洗更新過的資料
- 第二部分
主要也為定時去合併,將合併過後的檔案存入備份的路徑下及第三部分所監聽的路徑下
- 第三部分
當監聽的路徑下有出現監聽的任務出現,就會採取動作。任務是將資料做tagging、情緒分數…,並且存入ES
實作
Lambda Function
Lambda function code
程式碼設置有分三種方法
- 直接code inline
- 打包後上傳
- 打包後傳至s3,並給予s3位置
其中,對於 python 打包的方式,必須將相依套件一起加入.zip檔內,import的根目錄為主程式的資料夾下
⚠️ 需要注意幾件事情
- lambda 同時存在的數量有著軟限制
- 當有用到編譯的程式,記得注意編譯的環境是否相同
Configuration
Lambda function handler and role
Handler預設為 lambda_function.lambda_handler
前面的lambda_function 是主程式.py檔的名稱
後面的lambda_handler 則是需要調用的主要方法 ( 會傳入兩個參數 event, context )

Advanced settings
- 需注意 Timeout要依照Function的用途設定,時間到Function會直接跳掉,錯誤訊息如下

Trigger Events

點擊 Add trigger 可以調整觸發 lambda function 的方法。

S3
由s3來觸發,我們可以選定觸發的bucket、event type、prefix和suffix來指定特定區域和檔案種類的觸發
Schedule
我們先在CW內建立好Rules,接著在此選定( 也可直接在 CW 內設定完成 ),此功能為排程。
此外,CW Schedule 還提供自定義的event傳入,非常好用。
Lambda Event
lambda function 可以接受觸發的event資訊。在這裡可以自訂義event所帶的資訊

- 範例一 ( s3 put )
我們以s3 put為範例,當物件被put到lambda function所偵測的路徑下,lambda function則會被啟動,以下是 S3 Put 的 template,如此可以針對觸發 event 物件的bucket和key做應用

- 範例二( 自定義event )
在Cloud Watch中,我們使用的Schedule排程,我們可以對驅動的lambda給予參數。
{"name": "Mary","age": 18,}
接著,在我們程式碼中就可以使用這個自定義的event
def lambda_handler(event, context): name = event['name'] age= event['age']
Lambda Context
在Context中,我們可以得到lambda運行的訊息。
def lambda_handler(event, context): get_rt = context.get_remaining_time_in_millis() log_gn = context.log_group_name log_sn = context.log_stream_name
所遇到的問題
- 須確保 RSS seeds 內的網站能否在一隻 lambda 中掃完
- AWS 與目標網站的 Server 時區是否相同 (避免上給予的時間錯誤)
- 目標網站的編碼檢測
- Log輸出的管理 (改天需要來研究一下)