Lambda とは
AWS Lambda とは、AWS が提供する サーバーレスの関数実行サービスです。クラウド上に関数(プログラム)を定義し、インターネットを通じてその関数を実行します。
サーバーレスというのは、AWS などのクラウド事業者が実際にサーバーを用意し、さらに管理を行うサービスです。つまり、実際には裏ではサーバーが存在するものの、ユーザーはクラウドにあるサーバーの存在を意識せずに処理を実行したりアプリケーションを動かしたりすることができます。サーバーレスによりユーザーは開発の高速化と運用コストの軽減を実現することができます。
Lambda でできること
Lambda は関数実行サービスですが、他の AWS サービスと連携することで様々なユースケースがあります。例えば以下のようなことが可能です。
- S3 にファイルをアップロードなどのイベント発生をトリガーに処理を実行する
- API Gateway と連携して REST API を作る
- Event Bridge と連携して処理の定期実行を行う
- DynamoDB に接続して DB を操作する
また、Lambda には Provisioned Concurreny という常時ウォームスタート状態かつ同時リクエストに対応する関数の数を指定する機能があります。
詳しくはProvisioned Concurrency についてを参考にしてください。
Lambda の制約
Lambda には以下の制約があります。
- 起動時間が 1 つに実行につき最大 15 分まで
- 同時実行数の上限値が同一アカウントの同一リージョン内で 1,000 まで
また、Lambda と他の AWS サービスと連携する際に、その AWS サービスの制約も考慮する必要がある場合もあります。例えば、API Gateway は最大 29 秒でタイムアウトとなる仕様になっています。そのため、Lambda と API Gateway を連携する場合は 29 秒以内に Lambda からのレスポンスを返さないとタイムアウトになってしまいます。
Lambda の料金
Lambda は以下の項目に対して課金されます。
- Lambda 関数のリクエスト数(実行回数)
- Lambda 関数のメモリに応じた実行時間
Lambda では x86 か Arm の2種類のアーキテクチャを選択することができます。以下に東京リージョンの場合のそれぞれのアーキテクチャの料金表を紹介します。
x86 | 期間 | リクエスト |
---|
最初の 60 億 GB 秒/月 GB-秒あたり | 0.0000166667USD | リクエスト 100 万件あたり 0.20USD |
次の 90 億 GB 秒/月 GB-秒あたり | 0.000015USD | リクエスト 100 万件あたり 0.20USD |
150 億 GB 秒/月 以上 | GB-秒あたり 0.0000133334USD | リクエスト 100 万件あたり 0.20USD |
Arm | 期間 | リクエスト |
---|
最初の 75 億 GB 秒/月 | GB-秒あたり 0.0000133334USD | リクエスト 100 万件あたり 0.20USD |
次の 112.5 億 GB 秒/月 | GB-秒あたり 0.0000120001USD | リクエスト 100 万件あたり 0.20USD |
187 億 5 千万 GB 秒/月 以上 | GB-秒あたり 0.0000106667USD | リクエスト 100 万件あたり 0.20USD |
Lambda 関数作成方法
Lambda の作成方法は ZIP 形式とコンテナ形式の 2 種類があります。今回は message として"hello world"を返すだけ(app.py
)の Lambda 関数をそれぞれの形式で作成していきます。
ZIP 形式
ZIP 形式は Java、Ruby、Python、Node.js、.NET、Go の言語に対応しています。(今回は Python を使っています。)
まずはapp.py
Zip 形式に圧縮します。
以下のコマンドで Lambda 関数をデプロイすることができます。
以下のコマンドで作成した Lambda 関数を実行することができます。
コンテナ形式
まずは Dockerfile を作成します。
以下のコマンドでビルドします。
ECR に今回作成する Lambda 関数のイメージ用のレポジトリを作成します。
ECR 上にレポジトリが作成されたら、リポジトリの URI を含めたタグを付与します。
レポジトリに push する前に、ECR にログインしておきます。
レポジトリに push します。
以下のコマンドで Lambda 関数を作成します。
以下のコマンドで作成した Lambda 関数を実行することができます。
AI プロダクトを Lambda で開発する際の注意点
Google Colab やローカルで AI 開発をしていて、完成したプログラムを Lambda で動かそうとすると以下のような理由でプログラムが動かないケースが多々あります。
- インポートできないライブラリがある
- 10GB 以上のメモリを使う処理がある
上記の問題は一般の API 開発ではあまり考えなくても良いですが、AI 関連のライブラリを扱う際には頭に入れておく必要があります。
インポートできないライブラリの例としては、rembg があります。rembg は内部的に multiprocessing.Pool
をインポートしているのですが Lambda では multiprocessing.Pool
が使えないため rembg はインポートエラーになります。
10GB 以上のメモリを使う処理の例としては、U2-Net があります。API のリクエストで送られてきた画像データをそのまま U2-Net で処理すると 10GB のメモリを割り当てていたとしてもメモリ不足になる場合があります。この場合は送られてきた画像データをリサイズする必要があります。
このように、Google Colab やローカルで動いていたプログラムであっても、実行環境を Lambda に置き換えると動かなくなる可能性があるため、Lambda で AI プログラムを動かす際には注意が必要です。
参考

備考
Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。
