はじめに
EFSをLambdaで利用できるようになり、機械学習等のサイズの大きいファイルを運用できるようになりました。
ただ、依然LambdaやAWSのサービスには制約が存在しています。
本稿では、画像処理のAPI構築を通して、EC2の代替としてLambdaを利用を検討する際に考慮した点をまとめていきます。
構築するAPI概要
Lambdaを利用するにあたって、構築するAPIの仕様を知ることは大前提です。
今回検証したのは、GPUを利用しないPythonの画像処理APIです。
利用するパッケージは以下の通りです。
- requirements.txt
requests==2.24.0
boto3==1.14.14
certifi==2020.4.5.2
chardet==3.0.4
cycler==0.10.0
decorator==4.4.2
dlib==19.20.0
idna==2.9
imageio==2.8.0
kiwisolver==1.2.0
matplotlib==3.2.2
networkx==2.4
numpy==1.19.0
opencv-contrib-python==4.2.0.34
opencv-python==4.2.0.34
Pillow==7.1.2
pyparsing==2.4.7
python-dateutil==2.8.1
PyWavelets==1.1.1
requests==2.24.0
scikit-image==0.17.2
scipy==1.5.0
six==1.15.0
tifffile==2020.6.3
urllib3==1.25.9
以上のパッケージをフォルダに格納します。
$ pip install -t target -r requirements.txt
$ du -d 1 -h
389M ./target
389MBになりました。
また、下記のモデルを利用します。
$ ls -lh
-rwxrwxr-x 1 ec2-user ec2-user 96M Jun 24 06:14 sp_human_face_68.dat
パッケージとモデルで合計485MBとなります。
本APIでは1500×1500の画像をbase64で受け取り、処理結果をbase64で返します。
おおよそ、ペイロードサイズは以下の通りです。
$ ls -lh
-rw-r--r-- 1 ec2-user ec2-user 3.7M Jun 25 12:12 request.json
-rw-rw-r-- 1 ec2-user ec2-user 3.6M Jun 25 12:29 response.json
画像処理はm5.largeのインスタンスで実行したところ、約6秒ほどで完了しました。
検討段階
まず、下記のページを参考に、サービスの制約をクリアできるか確認しました。
特に注意したのは以下の項目です。
- デプロイパッケージサイズ
- Lambdaにアップロードできるデプロイパッケージのサイズは、レイヤーを含めて250MBという制限があります。
今回は、パッケージとモデルで制限を超えているため、EFSの利用を決定しました。
- タイムアウト
- Lambdaのタイムアウトは15分で実施されますが、API Gatewayを利用する場合は30秒となっています。
加えて、API Gatewayには複数の形式があり、それらの特徴を考慮することも必要です。
下記を参考に、今回はREST APIの形式にしました。
- ペイロードサイズ
- LambdaやAPI Gatewayには、リクエスト・レスポンスのボディを含めたペイロードに制限があります。
HTTP APIやREST APIでは10MB、Lambdaでは同期の設定において6MB、非同期で256KBとなっています。
環境検証
Lambda+EFS+API Gatewayで環境を構築可能か確認するために実施した内容を記します。
- ペイロードの確認
- Lambdaのコードに実際のレスポンスを仕込み、リクエストを投げて制限に触れないかを確認します。
テストは、REST APIのダッシュボードにおけるリソースタブにて簡単に実施できます。
メッセージをPOSTに設定し、リクエスト本文に実際のデータ(base64の文字列)を入力しました。
- ウォームスタート・コールドスタートの実行時間の違い
- Lambdaでは、毎回EC2においてコンテナを起動するため、初期の実行に時間を要します。
起動したコンテナは一定期間後に停止するため、アクセスが疎になると、再度コールドスタートとなります。
連続して実行した場合と、時間を置いて実行した場合の実行時間に違いが発生します。
また、handle_requestの実装・非実装や、EFSとLambdaレイヤーへの配置を分けることにより実行時間に違いが発生する可能性があります。
- 同時アクセス数の増減に対するスループット
- Lambdaでは同時に1,000まで実行することができます。
EFSという同一ディレクトリを利用する場合は、共通のファイルを利用する際の注意が必要です。
おわりに
今回はLambdaでAPIを構築する際に気を付けた点についてまとめました。
上記の他にも、APIのセキュリティやVPCの切り分け等、考慮すべき点はあるかと思います。
構築するサービスの諸元値に合わせて、AWS内でも適切なアーキテクチャを選定する必要がありそうです。