AWS Lambdaってなに?なにができるの?
目次
サーバーレスの意義とAWS Lambda
近年、AWS(Amazon Web Services)や、GCP(Google Cloud Platform)といった、パブリッククラウドにおけるITシステムの設計の開発手法として、『サーバーレス』が非常に注目されています。サーバーレスとは、IaaSやPaaSなどのクラウドの利用の1形態で、FaaS(Function as a Service)とも呼ばれます。
クラウドサービス提供側(AWS等)が実際のサーバーを用意し、さらに管理を行うSaaS(Software as a Service)やFaaS(Function as a Service)が、『サーバーレス』に該当します。つまり、実際にはアプリケーションが稼働するサーバーが存在するものの、個々の利用ユーザ企業の管理者はクラウドにあるサーバの存在を意識せずに、アプリケーションやデータベースの利用ができるクラウド利用形態のことを『サーバーレス』といいます。
サーバーレスの意義とは?
サーバーレスの意義は、開発の高速化と、運用コストの低減にあります。まず、サーバーレスのサービスは数クリックで利用開始することが可能で、OSやミドルウェアのセットアップ等を行うことなく実施することができます。したがって、従来のアプリケーションよりも開発スピードが大幅に向上します。
また、AWS Lambdaなどのサーバーレスサービスは、そのサービスが稼働するサーバーの障害対応や交換といった運用保守作業は、すべてAWSやGCPなどのクラウド提供業者が行います。そのため、サーバーの運用に関する様々な業務を削減することができ、人的リソースをアプリケーション開発に集中させることができます。
AWS Lambdaとは?
AWS Lambdaとは、AWSが提供するFaaSのサービスです。クラウド上にプログラムを定義しておき、インターネットを通じて実行できるサービスです。つまり、利用者側はプログラムコードを用意して、Lambda側に設定するだけで、プログラムを実行することができます。
AWS Lambdaを活用できるスタイルズのサーバーレス開発サービスはこちら→
AWS Lambdaの詳細
ここでは、Lambdaの制約や機能について記載していきます。
Lambdaの制約は?
まず、Lambdaは起動時間と、同時実行数に制限があります。起動時間については、1つの実行につき15分までとなっています。このため、15分以上の時間がかかる処理を実行することができないため、処理時間が15分以上にならないよう処理を分割して並列化する処理設計が必要です。
また、Lambdaでは上限値は同一アカウントの同一リージョン(アジアパシフィック (東京)を前提)内で1,000までとなっていますが、上限に達するとそれ以上の関数の呼び出しは制限(これを、スロットリングと呼びます)されます。
スロットリングを回避するためにはいくつか方法があります。
その1つが「リトライ処理を組み込む」という方法です。同期処理の場合、スロットリングが発生するとLambda関数は特定のエラーを返却します。このエラーが発生した場合、関数の呼び出し元でリトライ処理を実行します。
また、AWS Lambdaの場合、上限緩和の申請をすれば、同時実行数の増加が認められることがあります(ただし、必ず認められるとは限りません)。
Lambda以外のサーバーレスサービスの制限にも考慮が必要です。
例えば、サーバーレスアプリケーションの構築としてよくあるのが、API Gateway + Lambdaという組み合わせです。この場合はAPI Gatewayの制限にも考慮する必要があります。API Gatewayの場合、最大29秒でタイムアウトとなる仕様となっています。このため、29秒以内にLambda関数から値を返却し、以降は非同期で処理を実行するなどの考慮も必要になります。
また、利用できるプログラミング言語は、Java、Ruby、Python、Node.js、.NET、Goとなっています。
ほかのライブラリを使いたい
Pythonでは多様なライブラリが用意されています。そのようなライブラリを使いたい場合は、レイヤという機能を使います。レイヤは、複数のLambda関数で外部ライブラリやビジネスロジックを共有できる機能です。使いたいライブラリのファイルなどをZip化し、レイヤにアップロードすることで、関数内で任意のライブラリが利用できるようになります。
トラブルシューティングはどうする?
Lambda関数のエラーをトラブルシューティングする場合は、Cloudwatchにログを出力させるようにします。それによって、実行時のログが出力されるようになります。また、エラーは発生していないが、スローダウンが発生している、といった性能の検証も必要な場合があります。その場合は、X-rayというAWSのサービスと連携するといいでしょう。
AWS Lambdaの良いところ
AWS Lambdaのいいところは、先述のサーバレスのメリットと同じように、高速開発が可能であることと、仮想サーバーの運用保守が不要で、大幅な人的コストの改善が見込めるということになります。また、Lambda特有のメリットとしては、AWSのサービスとサービスを疎結合につなげることが簡単にできます。
例えば、S3やDynamoDBのデータ更新をトリガーにLambdaを起動する、といった具合です。疎結合で障害が起きても影響を極小化できる仕組みを簡単に用意できる点が大きなメリットです。
AWS Lambdaの典型的な使い方
AWS Lambda単体ではLambda関数の実行はできません。Lambda関数を実行させるためには、他のサービスリソースで処理を起動させるきっかけとなるトリガーを設定する必要があります。なお、Lambdaを実行するトリガーには大きく分けて2種類あります。1つめはトリガーと同期して関数を起動するタイプです。
これは、API Gatewayや手動実行が該当します。2つめはイベントが発生したことを検知して非同期で関数を実行するタイプです。これはAmazon S3、CloudWatch Log、CloudWatch Eventsからの実行などが該当します。このようにAWS Lambdaは、なんらかのイベントが起きたら、あらかじめ設定していたプログラムの処理が実行される、というようなサービスです。つまり、AWSの他のサービスと組み合わせて利用する、といった使い方が典型的な使い方になります。
具体的には、
といった使い方が挙げられます。ここに挙げたものは、あくまでも一例であり、様々なサービスを組み合わせることで多様な使い方を行うことができます。また、当然ながらLambda同士の連携も可能です。
AWS Lambdaを活用できるスタイルズのサーバーレス開発サービスはこちら→
非同期呼び出し時の重複起動に注意
非同期でLambda関数を実行する場合は重複起動の可能性があります。非同期処理でLambdaがイベントを処理できずにエラーとなった場合、自動的にリトライされるためです。
重複起動しないためには設計時の考慮が必要です。Lambdaが起動する時にDynamoDBにトリガーとなったイベントを保存します。
そして、重複起動が発生した場合はDynamoDBに保存されているイベントを確認して後続処理を動かさないなどです。このように設計時に重複処理を発生させないように対応することで防ぐことができます。
AWS Lambdaは使った分だけの従量課金
サーバの運用管理がいらなくなることは当然,、コスト上のmeritになりますが、料金も処理が動いた時間だけ課金されます。従量課金はAWS全体の大きなメリットですが、それでもサーバインスタンス(EC2)を起動していれば(処理が行われていない時間も)課金対象になります。
一方、Lambdaならリクエストがあったらその時間だけが課金対象となります。これは処理によっては非常に大きなメリットになります。
課金単位が変更でより安く利用可能に
Lambdaの課金体系は2020年12月に刷新され、以前より安くなりました。具体的にLambdaの課金体系を見ていきましょう。Lambdaは次の項目に関して料金がかかります。
- Lambda関数のリクエスト数(実行回数)
- Lambda関数のメモリに応じた実行時間
今回は、Lambdaの実行時間に関する課金体系が更新され、実行時間が100ミリ秒単位ではなく1ミリ秒単位で課金されるようになりました。従来は、Lambdaの実行時間が50ミリ秒だった場合、100ミリ秒に切り上げて料金請求がなされていましたが、新しい料金体系では、50ミリ秒分の課金しか発生しなくなり、約半額で利用できるようになりまます。
なお、そもそも毎月、メモリ1GBで40万秒実行実行した分が無料枠として提供されているため、Lambda自体の料金が安い、ということは頭に入れておくといいでしょう。
まとめ
AWSの代表的なサーバーレスサービスであるLambdaについて紹介していきました。Lambdaは本記事に記載した利用例だけではなく、様々な使い方の可能性があります。AWSのアーキテクチャやサーバーレスサービスの使い方に悩んだ際には、ノウハウが豊富なベンダーに相談してみるのもいいでしょう。