2015年10月9日金曜日

"Scheduled Event"でLambda(Python)を実行してログをKibanaで分析


今年のre:Inventで下記のようなLambdaのアップデートがありました。
【AWS発表】AWS Lambdaのアップデート
 – Python, VPC, 実行時間の増加, スケジュールなど
ということで

  • Pythonファンクション
    • 文字通りLambdaのロジックをPythonで記述・実行する
  • スケジュールされたファンクション
    • Cronのように指定した時間にLambdaを実行する

を試してみました。

更に、Lambdaのログを下記で紹介したようにKibanaで分析できるようにも
してみました。(指定した時間での実行状況が確認できます)
CloudTrailのログをKibanaで確認する(CloudWatch → Lambda → Elasticsearch)

絵にすると、こんな感じです。



Lambdaの作成


まずはファンクションの作成です。


blueprintと呼ばれるサンプルが用意されており、ちょうどlambda-canaryが
"Python & Cron"のサンプルだったので、今回は、こちらを利用しました。


イベントソースの設定ではタイプを「Scheduled Event」としています。
また5分ごとに実行するようにスケジュールを設定しています。


ラインタイムはPythonです。


コードはこんな感じです。
from datetime import datetime
from urllib2 import urlopen

SITE = 'https://www.amazon.com/'  # URL of the site to check
EXPECTED = 'Online Shopping'  # String expected to be on the page


def validate(res):
    '''Return False to trigger the canary

    Currently this simply checks whether the EXPECTED string is present.
    However, you could modify this to perform any number of arbitrary
    checks on the contents of SITE.
    '''
    return EXPECTED in res


def lambda_handler(event, context):
    print('Checking {} at {}...'.format(SITE, event['time']))
    try:
        if not validate(urlopen(SITE).read()):
            raise Exception('Validation failed')
    except:
        print('Check failed!')
        raise
    else:
        print('Check passed!')
        return event['time']
    finally:
        print('Check complete at {}'.format(str(datetime.now())))

IAMの設定も忘れずに。


今回は"Scheduled Event"が、すぐに適用(いきなり5分ごとに実行)されるようにしました。


以上でLambdaの作成は終了です。


CloudWatchの設定


Lambdaファンクションを作成すると"CloudWatch Logs"のロググループが
自動的に作成され、実際にログが出力されていることが確認できます。


このログをES(Elasticsearch Service)にストリーミングします。


あらかじめ"test"というドメインのESが作成済みで、それを指定しています。
IAMの設定もしています。


フォーマットは、もちろん"AWS Lambda"です。
フィルターパターンは、すべてのログが該当するように空欄にしています。


確認して完了すれば、ESへのストリーミングが始まります。


Kibanaの設定


まずはESの状態を確認します。


Kibanaの設定で、上記で確認した情報を設定します。


Discoverのタブを開くと


下記のように、ログが5分おきに出力されていることが確認できます。

0 コメント: