LoginSignup
2
0

More than 3 years have passed since last update.

LambdaでAPIを立てるときに気を付ける点

Last updated at Posted at 2020-09-10

はじめに

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秒ほどで完了しました。

検討段階

まず、下記のページを参考に、サービスの制約をクリアできるか確認しました。

特に注意したのは以下の項目です。

  1. デプロイパッケージサイズ

    • Lambdaにアップロードできるデプロイパッケージのサイズは、レイヤーを含めて250MBという制限があります。
      今回は、パッケージとモデルで制限を超えているため、EFSの利用を決定しました。
  2. タイムアウト

  3. ペイロードサイズ

    • LambdaやAPI Gatewayには、リクエスト・レスポンスのボディを含めたペイロードに制限があります。
      HTTP APIやREST APIでは10MB、Lambdaでは同期の設定において6MB、非同期で256KBとなっています。

環境検証

Lambda+EFS+API Gatewayで環境を構築可能か確認するために実施した内容を記します。

  1. ペイロードの確認

    • Lambdaのコードに実際のレスポンスを仕込み、リクエストを投げて制限に触れないかを確認します。
      テストは、REST APIのダッシュボードにおけるリソースタブにて簡単に実施できます。
      メッセージをPOSTに設定し、リクエスト本文に実際のデータ(base64の文字列)を入力しました。
  2. ウォームスタート・コールドスタートの実行時間の違い

    • Lambdaでは、毎回EC2においてコンテナを起動するため、初期の実行に時間を要します。
      起動したコンテナは一定期間後に停止するため、アクセスが疎になると、再度コールドスタートとなります。
      連続して実行した場合と、時間を置いて実行した場合の実行時間に違いが発生します。
      また、handle_requestの実装・非実装や、EFSとLambdaレイヤーへの配置を分けることにより実行時間に違いが発生する可能性があります。
  3. 同時アクセス数の増減に対するスループット

    • Lambdaでは同時に1,000まで実行することができます。
      EFSという同一ディレクトリを利用する場合は、共通のファイルを利用する際の注意が必要です。

おわりに

今回はLambdaでAPIを構築する際に気を付けた点についてまとめました。
上記の他にも、APIのセキュリティやVPCの切り分け等、考慮すべき点はあるかと思います。
構築するサービスの諸元値に合わせて、AWS内でも適切なアーキテクチャを選定する必要がありそうです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0