Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

AWS Lambdaでパフォーマンスを上げる方法

本記事では、Lambdaのパフォーマンスを上げるための方法について紹介します。

よく知られている方法や、初心者は知らない方法なども紹介できればと思います。

筆者自身は、Pythonを使うことが多いためPythonベースのナレッジ・サンプルコードになりますが、他の言語でも流用可能な部分が多いと思います。

DB接続はHandlerから外出しする

DB接続の処理を、メインのロジックから分割することで、コールドスタート時にのみ接続処理が行われるように修正します

都度接続する場合

def lambda_handler(event, context):
    # DB接続処理
    # メインのロジック
    # 接続クローズ処理

接続維持(=コールドスタート時に限定する場合)

# DB接続処理

def lambda_handler(event, context):
    # メインのロジック

一方で最大同時接続数という観点で、アーキテクチャによっては接続維持をしないほうが望ましいケースもあります。

dev.classmethod.jp

Lambdaの同時実行なども踏まえて、最終的な意思決定は必要ですがシンプルなアプリケーションであれば、あまり気にする必要はないでしょう。

SnapStart機能を使う

Lambdaのコールドスタートを高速化するSnapStartという機能があります。

これを使うことにより、レスポンス速度を向上させることができます。

最近までは、Pythonや.Netでは対応していませんでしたが2024年11月よりアップデートが実装され、現在は利用可能です。

aws.amazon.com

一方で、

  • Lambdaのバージョニングごとに課金がされる
  • 最低3時間分のコストがかかる

という特性があるので、不要なバージョンの削除など適切に使用する必要があります。

docs.aws.amazon.com

ライブラリのロードは最低限に

使ってないライブラリをimportするのは避けましょう。

これをするだけ応答速度が改善します。

また、簡易なロジック・メソッドを利用する場合においても、サードパーティのライブラリを使うのではなく自前で実装したほうが望ましいです。

import numpy as np

array = np.array([1, 2, 3])
np.max(array)

このように、記載するのではなく

array = [1, 2, 3]
max(array)

といった形で書くといった方法です。

リソースの割当を最適化する

Lambdaはメモリを積めば積むほど、ハイパフォーマンスなコンピューティングが可能になります。

一方で、コストはメモリ依存なのでコストとパフォーマンスのトレードオフを考えなければいけません。

その観点でAWSは、チューニングツールをリリースしてくれています。

dev.classmethod.jp

Lambda Containerから呼び出す

Lambdaのデプロイ方法として、Lambda Containerから行う方法があります。

一般的な使い方の一例としては、サイズの大きいサードパーティライブラリを扱う際に、Lambda Containerから呼び出す方法があります。

これを使う際に、Pandasなどの比較的サイズの大きいライブラリをLambda Containerから呼び出すことで、通常の方法よりもライブラリのロードも含めて、高速化することが知られています。2 ~ 3secほど。

PythonでPandasを使ってデータ分析が必要、かつ処理速度が厳しく求められる場合は本方法も検討してみてください。