今回は、AWSサービスの1つである「Lambda」について使い方や使う場面、メリットなどについてご紹介します。
AWS Lambdaとは?
AWS Lambda(以下、Lambdaのみ)は、AWSが提供するサーバーレスでプログラムを実行できる環境です。
AWSにはEC2(仮想サーバー)やECS(コンテナサービス)などのサーバーを使ったサービスがありますが、Lambdaはこれらと対極となるサーバーレスのサービスです。
サーバーレスはサーバーがないという意味なんだろうけど、具体的にはどんなメリットがあるの?
サーバーレスのメリットは色々あるけど、サーバーOSやアプリケーションサーバーなどのソフトウェアの準備やインスタンス起動などが不要になる点が挙げられるよ。
Lambdaを使えばそんな準備をすることなく、簡単にプログラムを実行することができちゃうよ。
LambdaとEC2を比較
AWSの代表的な仮想サーバーのサービスであるEC2とLambdaを比較してみます。
Lambda | EC2 | |
インフラ環境 | ほぼ設定不要 | オートスケール設定やインスタンス設定 |
サーバー設定 | ほぼ不要(メモリ程度) | OS、ストレージ、ネットワークを設定 |
運用・メンテナンス | 不要 | 実行環境の最適化や修正パッチなどの対応 |
課金対象 | 実行時間のみ課金 | インスタンス起動中は常に課金対象 |
並列処理 | デフォルトではアカウントにつき最大1000の同時実行 | サーバー内での並列分散処理だけでなく、オートスケールでのスケールアウト |
実行時間の上限 | 15分※ | 制限なし |
メモリの上限 | メモリ最大10GB※ | メモリ最大24TB※ |
ディスク上限 | 512MB | EBSでは最大16TB※ |
使用言語 | Java, Node.js, C#, Pythonなど | 特に制限なし |
※2021年8月時点での値です。
EC2と比較すると、Lambdaはサーバー構築で必要となるインフラやサーバーの設定だけでなく、運用やメンテナンスもほとんど不要なことが分かるね!
一方で、メモリ上限や並列処理数などが小さく、1つの関数につき最大で15分しか実行できないという制約があるので、EC2に比べると自由度は大きく下がるかな。また使えるプログラミング言語も限られるので、オンプレミスのサーバをAWS移植する場合にLambdaでサーバーレスに使用とすると、かなりハードルが高くなるよ。
次の章では、具体的にどんなケースでLambdaを使ったアーキテクチャが良いのかについてご紹介します。
どんな時にLambdaを使うのが良い?
Lambdaをよく使うユースケースについてまとめてみました。
- スマホアプリやWebページのバックエンド
- API GatewayをHTTPエンドポイントとし、HTTP経由でLambda関数を呼び出す
- 1つ1つの処理は小さいのでLambdaの方がコストが低く、運用負荷も小さい
- 負荷に応じて自動でリソース拡張(EC2のオートスケール用のような設定は不要)
- AppSyncからLambdaの呼び出しもできる
- ログ処理、データ処理
- 収集したログの分析や抽出をLambdaで行い、S3などへ保存
- ログを一度S3に溜めてからLambdaを実行するなど疎結合な構成も可能
- Kinesis Data StreamsやSQSと組み合わせて、Lambdaに流れるデータ量を調可
- ファイル処理
- S3に画像ファイルが置かれたことをトリガーとして、ファイルのリサイズしてサムネイル用画像を作成できる
- テキストの文字コード変換、ファイル圧縮などにも応用できる
- IoTデータ処理
- AWS IoTからアップロードされる大量データを、仕分けしてステータス別に他のLambda関数に処理させる
- IoTデータに対応するDB値の更新や、ログとしてS3に保存
個人的にはモバイルアプリの開発で、HTTPエンドポイント→API Gateway→Lambda関数で使う場合が多いです。ユーザーの状態値をDBから読み込んで応答したり、ユーザーから指定された状態値に変更するなどの小さい処理はLambdaで設計した方がトータルコストが小さくなります。
Lambdaの使い方
Lambdaは単独で実行することはできません。
Lambdaはトリガーと呼ばれる他のAWSサービスから呼び出されることで実行します。
例えばウェブアプリの例では、ユーザーがあるボタンをクリックすると、ブラウザはボタンに設定されたHTTPエンドポイントを呼び出します。すると、HTTPエンドポイントが設定されたAPI Gatewayが呼び出され、API Gatewayが設定されたLambdaを呼び出すという構図になります。
下の図のように、Lambdaの関数編集画面ではトリガーとアクセス先が表示されるよ。アクセス先は、Lambda関数にアクセス権があるサービスが表示されるよ。
Lambdaのコスト
Lambdaのコスト※は以下のようになっています。
リクエスト | リクエスト 100 万件あたり 0.20USD |
実行時間 | GB-秒あたり 0.0000166667USD |
※2021年8月現在の東京リージョンでの料金
リクエストはLambda関数が実行された回数のことだね。実行時間はLambdaに設定したメモリ量によってコストが変わるようになっているよ。Lambdaは関数の実行に対して課金されるので、EC2のように何もしていなくても料金がかかることはないよ。
実際の例でEC2とLambdaのコスト比較
例えば、トラフィックが1回のリクエストでの実行時間が平均1秒、月間1万リクエスト、必要なメモリサイズは4GBのワークロードでLambdaとEC2の1ヶ月のコストを比較してみます。
月間1万リクエスト | Lambda | EC2(t3.medium) |
リクエスト | 0.0020 $ | – |
実行時間 | 0.6827 $ | 52.8480 $ |
トータル | 0.6847 $ | 52.8480 $ |
結果として、Lambdaの方がコストは約1%と大幅に削減することができました。このようにトラフィックが小さいワークロードではLambdaのコストがかなり安いことがわかります。
一方で、上と同じ条件で月間リクエスト数を1000万とリクエストがかなり多い処理でコストを比較してみます。
月間1000万リクエスト | Lambda | EC2(t3.medium) |
リクエスト | 2.0000 $ | – |
実行時間 | 682.6680 $ | 52.8480 $ |
トータル | 684.6680 $ | 52.8480 $ |
結果として、Lambdaの方が約8倍も高額になりました。このようにトラフィックが大きいワークロードでは、Lambdaはあまり使うべきではないということがわかります。
まとめ
今回は、AWSサービスの1つである「Lambda」の使い方やメリットなどの概要についてご紹介しました。
個人的にはAWSの中で最もお世話になっているサービスなので、EC2やECSを使っている人もLambdaによるサーバーレスを検討してみてはいかがでしょうか?
コメント