Lambda を使ってみた①

  • CloudWatch Logs
  • Lambda
  • 仕事で Lambda を触る機会があったので、どのような仕組みで Lambda が動いているのか、基本的なことを解説していきたいと思います。

    マネージドサービスって使うの難しそうだな、という印象を私は持っていましたが、決してそんなことはありません。

    実は使ってみると、Lambda は意外と使いやすく感じています。

    Lambda の利用シーン

    Lambda は以下のような使い方をすることが多いと思います。

    aws-lambda-01

    何かのトリガーを契機にプログラムで処理をしたい場合に Lambda を利用します。

    ここでいう何かのトリガーとは、スケジュールでもいいですし、APIコールでもいいですし、何かのAWSサービスが備えているイベント発生でも構いません。

    具体性がないと理解できませんので、今回は CloudWatch Logs のトリガーを参考に見ていきたいと思います。

    aws-lambda-02

    CloudWatch Logs から送信されてくる Event の中身を紐解く

    CloudWatch Logs のイベントは公式ページに記載されています。

    { "awslogs": { "data": "ewogICAgIm1lc3NhZ2VUeXBlIjogIkRBVEFfTUVTU0FHRSIsCiAgICAib3duZXIiOiAiMTIzNDU2Nzg5MDEyIiwKICAgICJsb2dHcm91cCI6I..." } }

    はい。暗号化されています。デコードすると、こんな感じのJSONデータであることが分かります。

    { "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "/aws/lambda/echo-nodejs", "logStream": "2019/03/13/[$LATEST]94fa867e5374431291a7fc14e2f56ae7", "subscriptionFilters": [ "LambdaStream_cloudwatchlogs-node" ], "logEvents": [ { "id": "34622316099697884706540976068822859012661220141643892546", "timestamp": 1552518348220, "message": "REPORT RequestId: 6234bffe-149a-b642-81ff-2e8e376d8aff\tDuration: 46.84 ms\tBilled Duration: 100 ms \tMemory Size: 192 MB\tMax Memory Used: 72 MB\t\n" } ] }

    見て分かる通り、ロググループ、ログストリーム、ログイベントID、タイムスタンプ、メッセージといった情報が記載されています。

    受け取った Event は Lambda でそうやって処理してるの?

    では、CloudWatch Logs から受け取った Event を Lambda ではどうやって処理しているのでしょうか。

    今回は、Python を使って説明します。

    handler / event / context

    プログラム言語を扱える方は理解しやすいと思いますが、Lambda は Event を二つの object で受け取ります。それが、event と context です。

    event の中身が上記で触れたデータそのものです。context の中身は Lambda の持つメタデータになります。

    詳しくは公式ページを参照ください。

    そして、handler とは関数の名称です。本当は何でも OK です。

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

    この形で event と context を受け取って、処理を記述していきます。

    今回の CloudWatch Logs から送信される Event がどんなものか見たいときは、Lambda の関数定義の画面にて、こう記述して『テスト』を実行してみてください。

    import json import base64 import gzip def lambda_handler(event, context): # Decode CloudWatchLogs Data by base64 decoded_data = base64.b64decode(event['awslogs']['data']) # ungzip data json_data = json.loads(gzip.decompress(decoded_data)) return json_data

    以下のような結果が得られます。

    aws-lambda-03

    最後は Lambda の中のプログラムで煮るやり焼くなり

    JSON形式でデータを取得できることが分かれば、あとは好きなように Python で処理させることが出来ます。

    S3 など他の AWS のサービスに CloudWatch Logs のデータを転送するのであれば、boto3 というライブラリが便利です。

    注意するポイント

    Lambda 実行時、設定されたロールを使用してプログラムを実行します。

    環境変数で API ACCESS KEY や API SECRET KEY を定義することも出来ますが、AWS のベストプラクティスに従うのであれば、Lambda 専用ロールを作成しておくことをお勧めします。

  • CloudWatch Logs
  • Lambda