サーバレス
とりあえずWikiによると
サーバーレス・コンピューティングとは、クラウド・プロバイダーがアプリケーションに必要なマシン・リソースの割り当てを動的に管理し、事前に購入されたことに基づく請求ではなく、各アプリケーション要求を満たすために使用される個々のリソース量に基づいた請求を行うようなクラウド・コンピューティングの実行モデルである。
ようはEC2みたいにインスタンスがずっと待ち構えてる訳じゃなくて、なんらかのトリガーでインスタンスが動いて処理が終わると停止する。料金は処理の開始から終了まで課金される。
Lambdaの場合はメモリ占有時間(処理にかかった時間×メモリの割り当て量)で請求される。メモリ割り当て量がそのままインスタンススペックになってるってどっかで聞いたので実質EC2のインスタンスを借りた形なんだろう。
LambdaはいわゆるFaaS(Function as a Service)ってやつ。
もちろんサーバーがない訳じゃなくて、サーバー(の意識)レスなコンピューティング。
いまのLambdaはNodejsだけじゃなくて、Pythonとかなんでも動くので(ほんとに何でも、カスタムRuntime作れば)、言語による縛りは特にない(SDKがあったりなかったりするので全くないわけじゃない)
イベントドリブンかつ特定のコンピューティングリソースを利用するわけではないので、瞬間的な負荷がかかるようなアプリケーションが得意。
逆にコールド状態から起動するまでに時間がかかるようなことがあるので、常に短いレスポンスタイムを要求するアプリケーションは苦手
Lambdaと周辺サービス
Lambdaを構成するものは3つ
- 起動するサービス
- Functionのコード
- 出力するサービス
起動するサービス
イベントドリブンなので必須
APIGateway
イメージはNginx URLのパス・メソッドとLambdaを紐付けする。 RestFulAPIはこれ
CloudWatchEvent
Cronのような時間で起動するような場合 または、他のサービス(EC2のLog)のアラームで動かす場合
S3
S3のPutEvent等で動かす。
SNS・SES
メール受信時とかのイベントで動かす場合
DynamoDB
データ投入時にストアドファンクション的に動かす場合など
ここらへんが今まで使ってきたもの、ほかにもいっぱい
Function
eventのJSONを受け取って処理する。基本JSONしか処理できない。 ランタイムはNodeならv8.10、v10.xから選べる
VPCを指定することで、リソースを指定することもできる
メモリサイズとTimeoutは適切に指定すると費用を抑えられる。 基本は処理時間をとにかく短くすること。
StateはDynamoDBやS3に持ち、Statelessにすること。 状態によって分岐するアプリケーションの場合stepFunctionの利用を検討すること。
複数のFunctionde利用される場合、Layerの利用を検討すること