AWS re:Invent 2014で発表された新サービスAWS Lambda。 先日Limited Previewの申請が通ったので早速Lambda使って何かできないかと思い、Webサイトの監視をLambdaを使って実現してみました。

5分間隔で指定したサイトを監視し、400、500系のレスポンスが帰ってきた場合は、SNSに異常状態である旨メッセージ通知をします。

LambdaはS3上のファイルの変更やKinesisに届いたメッセージ、DynamoDBへのデータの更新といったイベントに反応して任意のコードを実行できるプラットフォームです。Lambda自体に定時処理を行うような仕組みは用意されていないので、Lambda Function内部でS3にオブジェクトをPUTすることでLambda Functionの実行をループします。

処理は↓のステップで行います。

  1. site-監視時刻ミリ秒(例:site-1418090313922)といった命名規則のファイルを用意し、以下のように監視したいURL記載しておきます。

    Lambda Functionの作成が終わると、ダッシュボードでLambda Functionを選択して「Configure event source」を選択して、S3にファイルがPUTされた際にLambda Functionが実行されるよう対象のBucketの設定と、Lambda Functionを起動すめのInvocation Roleを作成/選択します。

    lambdaconfigure

    ここで設定するBucketはLambda Functionと同じリージョンのBucketである必要があります。

    実行状況

    あとは、監視サイトを定義したファイルを対象のBucketにアップロードするとLambda Functionが起動します。Lambda Functionの実行ログはCloudWatch Logsに送信されているので、CloudWatch Logsのコンソールで↓のように確認できます。
    lamdalogs
    またLambdaのダッシュボードでLambda Functionの実行状況が確認できます。
    lambdadashboard

    まとめ

    Lambdaを利用することで、実行プラットフォームのことを意識する必要なくプログラムを動作させることができるのは大きなメリットだと感じます。いかにEC2を使わずにスケーラブルなプラットフォームを構築するか考える上で、とても魅力的な要素です。

    個人的にはS3やKinesis、DynamoDBのトリガー以外にLambda自体が定期処理をサポートしてくれるといろいろ用途が広がって良いかと思います。Data Pipelineのスケジューラと組み合わせると、よりcronライクなトリガーになって面白いかも。(Data Pipelineのスケジュールの最小間隔は15分なのでそんなに細かい時間帯での設定はできませんが。)

    またJavaScript以外にRubyサポートも!