使用AWS Lambda 製作一個氣溫資料爬蟲

AWS Lambda 玩了一個禮拜稍微摸熟特性之後, 就想找個小題目來做. 由於以前對於寫網路爬蟲有些經驗, 所以決定改用 Lambda來試試,資料是取材於中央氣象局的即時氣溫資料.

範例程式下載

github傳送門

程式說明

  • my_crawler_tw_temperature_downloader.py : 下載氣溫資料, 並將原始資料暫存於S3
  • my_crawler_tw_temperature_parser.py : 解析資料後,將結果存放於 DynamoDB
  • my_crawler_tw_temperature_process_data.py : 定期將DynamoDB的資料撈出來成為JSON檔案, 也就是上面曲線圖讀進來的資料

  • 前端繪圖Lib是 Flot

事件驅動來源

  • my_crawler_tw_temperature_downloader.py : 每10分鐘執行一次
  • my_crawler_tw_temperature_parser.py : S3產生Event 呼叫本程式(因為上面downloader將網頁存檔到S3)
  • my_crawler_tw_temperature_process_data.py : 每1分鐘執行一次

準備

  • S3:
  • 開一個新的bucket 準備放置許多抓下來的網頁.
  • 輸出的JSON網頁也會放於此, 由於 AJAX跨網域讀資料有些限制, 所以你要對Bucket的CORS做設定,允許其他網域來取資料.

  • DynamoDB 先建好以下Table …

more ...


AWS Lambda - 從傳入的 S3 Event 裡取得資訊

我們寫 Lambda Function的時候, 要實作 handler . 當事件驅動了這個 function 的時候, 相關資訊會經由 event 這個參數傳進來.

def handler_name(event, context): 
    ....
    return some_value  

接下來就探討一下, 我們會從 event 裡看到什麼樣的資訊.

準備動作

AWS Lambda 小練習: 氣溫資料爬蟲 為例, 我希望每當爬蟲把網頁抓回來丟上S3之後, S3的trigger 就能自動呼叫另一隻 Parser 用途的Lambda Function, . 所以至少我得知道來源是哪個檔案才能進行下一步.

以下是新增 trigger步驟:

對著你寫好的 parser lambda function, 新增一個由 S3 發動的 trigger. 這邊順便加了一些條件. 這邊只接受物件上傳 Put Event (其他的event …

more ...

定期觸發 AWS Lambda Function

AWS Lambda 是事件驅動的設計, 通常官方DEMO喜歡拿AWS S3做為例子, 當你上傳圖片之後, 就會產生Event , 就能驅動 Lambda 瞬間做出一張縮圖(請參考影片)

不過有時候,我們就是需要排程工作 ,例如:

  • log 檔案清理、搬移
  • 定期跑報表
  • 指定某個特定時間開EC2機器 (例如耶誕特賣起跑前的某個時間點,新增1000台EC2)

所以我們需要一個類似 cron 的服務, 定期的產生事件來啟動程式, 假如不用開一台EC2來跑那就更好了.

CloudWatch Events

AWS CloudWatch Events 提供了這樣的服務, 設定好 cron 之後, 將 target 指到你的 lambda function 便告完成.

ps: 這個服務似乎是完全免費, 在帳單上沒有看到這個項目.

--

注意事項

  • 時間精度沒那麼準: 以每分鐘觸發一次的情況來說, 一定會延遲幾秒~十幾秒.

  • cron …

more ...