lambda関数の構造と設計
eventの情報
イベントから渡される任意のJSONデータである。ただ、lambda関数の引数に渡されるときパース済みであり、JSONではなく、pythonのオブジェクトに変換されている。
例){x:10,y:20} → event["x"]=10,event["y"]=20として取得できる。
contextの情報
実行環境の情報が含まれる。例えば、メモリ容量やlambdaが配置されているパスなど。。。
def myfunc_handler(event,context):
# 処理
return 戻り値
ランタイム設定
ハンドラは呼び出すべき「ファイル名.関数名」を指定する設定値である。この設定が実際のものと合致していないと呼び出しが失敗する。
CloudWatch Logs
lambdaを実行すると、CloudWatch Logsにも記録される。print()で出力してデバッグ確認することもできる。
lambdaの実行環境とイベント
- lambda関数はlinuxベースの隔離された実行環境で実行され、実行後に破棄されるステートレスな環境である。
- lambda関数の呼び出しはプッシュモデルとストリームベースの2種類に大別される。
- プシュモデル・・・イベントが発生したときに呼び出される方式。
- ストリームベース・・・流れるデータをlambda関数が監視して処理する方式。
- 非同期呼び出しで実行されるlambda関数は、2回以上実行される可能性がある。それを考慮し、何度呼び出されても同じ動作をするように実装する必要がある。
- lambdaを呼び出すきっかけとして動作するのがイベントソースであり、S3やSESなど、さまざまなAWSリソースをイベントソースとして指定できる。
メモリとタイムアウト
lambda関数はAWSによて提供されたランタイム環境で動作するので、開発者があらかじめ準備する必要はない。ただ、開発者が決める必要があるものが3つある。
- メモリ
- タイムアウト
- IAMロール
※これらの値は「設定」タブの「一般設定」で確認できる。変更する場合は、編集ボタンを押下する。
lambdaランタイムの環境
- AWS lambda contextオブジェクト
- ランタイム環境変数
lambdaランタイム環境の再利用
- lambdaはイベントのたびにlambdaランタイム環境を用意するのではなく、一度作成した実行環境をしばらく破棄せずにとっておき、次に実行された時に再利用することで2回目以降の実行を高速化している。
- プログラミングの注意点
- 前に実行したデータが残っている。
例えば/tmpにテキストファイルを前の実行で書き込んでいた場合、2回目の実行で既に存在しているとエラーになる可能性がある。 - イベントハンドラ以外に都度実行するコードがある。
イベントハンドラの外のグローバルな場所に書いてあるコードは、プログラムがロードされた初回しか実行されない。
- 前に実行したデータが残っている。
同時実行とプロビジョニング
- イベントの数だけ同時実行される。
lambda関数は同時実行されても問題ないように並列処理に注意してプログラミングする必要がある。 - 同時実行数
1リージョンあたり1000の同時実行制約がある。 - 同時実行数の予約
lambda関数ごとに同時実行数の予約ができる。例えばlambda関数Aを100個予約しておけば、その他関数は900個実行可能となる。 - プロビジョニング
あらかじ未指定した個数のlambdaランタイム環境を用意しておく機能のこと。即時呼び出しが可能となる。ただし、lambda関数を実行していない間も課金される。
イベントモデル
- プッシュモデルには同期呼び出しと非同期呼び出しがある。
- 非同期呼び出しではイベントを一旦キューにため、それからlambdaが呼び出される。キューからは複数取り出され、lambdaは並列に実行される。
- lambdaの呼び出しに失敗したときは2回再試行される。再試行回数は変更可能。
- 全ての試行に失敗した場合は、そのイベントは消失する。しかし、通知を受けたい場合はDLQ(dead letter queue)という仕組みを使う。DLQを構成しておけばそのイベントをSQSのキューやSNSトピックとして通知できたりする。
- lambdaは例外も失敗と見なすため、失敗することが明らかなパターンは例外を発生させるのでなく、エラーを起こすようにすべき。例外だと2度、3度試行される恐れがある。
- キューから呼び出されるイベントの実行順序は保証されない。
- lambdaは正常終了した場合も、タイミングによっては2回以上呼び出される可能性がある。そのため、何度実行しても同じ結果となるように実装する必要がある。
イベント引数
lambdaのイベント引数はイベントソースに依存する任意のデータであるため、データ構造は各イベントソースのリファレンスを参照する必要がある。イベントの引数はeventをjsonでdumpsし、中身を見ることができる。
定期実行されるlambda関数の作成
- cloudWatchイベントから呼び出されることを想定した関数は設計図から作成できる。
- 設計書lambda-canaryを選択する。
- スケジュール式(cron式、rate式)
バージョニングとエイリアス
- lambdaにはバージョン管理したりエイリアスをつけたりする機能がある。
- 関数を登録すると関数ARN(Amazon Resource Name)と呼ばれる唯一無二の名前が定められる。イベントに対して呼び出す関数を結びつける場合、このARNを使うのが基本になる。
- 開発版、ステージング版、本番環境版にするという時には新しいバージョン発行という操作を行う。そうするとバージョンごとのARNが確認できるようになる。
- 関数ARNを直接指定するのではなく、エイリアス名を作ってそのエイリアスと結びつけていれば開発環境と本番環境を簡単に結びつけることができる。