AWS Lambdaのキホン

AWS Lambdaのキホン

この記事ではAWS Lambdaについて簡単に説明をしていきます。

が、その前に最近AWSを触り始めた方に声を大にして伝えますが、

こんな記事を読まずにBlack Belt Online Seminarを見ろ!

それくらい必要な情報が網羅的に説明されているので、基本はそれを見ることからです。

まあ、それはそれとして以下が本日のお品書きです。

  •  "サーバーレス"を信用しすぎるな
  • イベントトリガーによって変わる並列度
  • LambdaとEC2の使い分け

 

"サーバーレス"を信用しすぎるな

まず、Lambdaというサービスについてですが、AWSが提供するサーバーレスアーキテクチャサービスです。

要するに、サーバの管理やスケールアップやスケールアウトを意識しなくても、

AWSがやってくれるよーっていうサービスです。

しかし、

実際は裏側でサーバが動いていることを

意識しなければなりません。

例を出しましょう。

たとえば処理の途中で中間ファイルを作成する必要がありました。

しかしアプリはLambdaなので次の処理のときには別の関数になり、別のサーバが建つから中間ファイルを削除する必要はないと削除処理を実装しませんでした。

⇒ ディスク枯渇で大量のエラーが出ます

これは、Lambda関数が起動するたびに、裏側でVM(EC2)が用意され

プロセスが起動して実行されるのですが、

数分以内に再度Lambda関数が呼び出された場合、

同じVM(EC2)で処理がされます。

そのため、同じEC2で何度も中間ファイルが作成され、エラーが発生します。

これと似たようなことがRDSへのアクセスでも起こります。

Lambdaは複数呼び出された場合、その分だけプロセスが立ち上がります。

それらすべてがRDSに接続しにいくことによってコネクションプールが枯渇します。

f:id:ForRockMusic:20191022112718p:plain


サーバーレスだなんだといっても、裏側は常にサーバが立ち上がって

処理を行うことを意識しましょう。

AWSが言う"サーバーレス"とは、

「実行するサーバの準備や、OS、ミドルウェアの管理を私たちがやります」

という意味でしかありません。

Lambdaの特性を理解したアプリケーションの実装はユーザ側で

検討が必要なのです。

 

イベントトリガーによって変わる並列度

Lambdaにはイベントトリガーという機能が存在します。

例えばS3のデータが作成、更新されるたびにこのLambda関数が呼び出される、

ということを数クリックで設定できるのです。

 

しかし、このイベントトリガーの機能は複数の種類があります。

同期呼び出し、非同期呼び出しなどなどあるので、

自分が使うトリガーが何にあたるのかしっかり把握しましょう。

※エラー発生時の挙動も変わります。

 

ここではその詳細は割愛しますが、それぞれのトリガーでLambdaの同時実行数が

どのようにかわるのかを解説します。

 

1.無制限の並列実行

基本的にはこれが多いでしょう。S3やSQS、APIGatewayがこれにあたります。

1つのリクエスト(通知)に対して処理が実行されます。

これの注意点は2つです。

・パブリックIPが枯渇するほどの多量実行がないこと

・同時実行時のデータ不整合について検討すること

 

まずパブリックIPですが、先ほども言ったように裏側ではVM(EC2)が立ち上がります。

これらは、設定しなければパブリックなネットワークに立ち上がるため、

パブリックIPが割り当てられます。そこで数百、数千とVMが立ち上がると当然

パブリックIPが枯渇し、これ以上実行できないという事態が発生します。

次に、同時実行時のデータ不整合ですが、

これらはすべて重複して発生する可能性を考慮する必要があります。

要するに、一つのイベントに対して複数の関数が実行されるのです。

(APIGatewayはちがうかも。。)

そのため、データを取得後、削除する場合は、そのあと別の関数がデータを

見に行って存在しない、などの事態が発生することを考慮しておく

必要があります。

 

2.シャード数に応じた並列実行

これにあたるのは、Kinesis やDynamoDB Streamsです。

これらは、kinesisに投入されたレコードの数だけ関数が立ち上がるのではなく

シャード数の数だけVMが立ち上がり、1秒ごとにデータを取得して

処理を実行します。

kinesisの場合、1度で6MBまでのデータをリスト型で取得します。

kinesisについては、シャード数をコンソールで簡単に設定できます。

DynamoDB Streamsはパーティション数に基づいてLambdaが起動するのですが

ぶっちゃけ使ったことないのでよくわからん!!

f:id:ForRockMusic:20191022111752p:plain

https://aws.amazon.com/jp/blogs/news/how-to-perform-ordered-data-replication-between-applications-by-using-amazon-dynamodb-streams/

 

3.単一で動くイベント

Cloudwatchイベントによるスケジュール実行などがこれにあたります。

なので、定時バッチ処理を並列に動かしたいときは、

Cloudwatch ⇒ Lambda(シングル) ⇒ Lambda(並列実行)

など、一工夫加えてやる必要があります。

 

さいごに、いろいろと言いましたが、Lambdaサービス自体は非常に有用な

サービスで、最も使う機会が多いです。

特性を理解して使えば低コストですばやくアプリ開発ができるので

うまく付き合っていきましょう。