LambdaにおけるPythonのライブラリのロード順序を調べてみる

2020.12.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の夏目です。

今回はServerless Advent Calendarの投稿ですが、LambdaにおけるLayerも含めたPythonのライブラリのロード順序を調べてみることにしました。

方法

標準でも入っているboto3のバージョンを使って調べます。

  • デフォルトで入っているboto3: 1.15.16 (2020/12/19)
  • Layerのpython/: 1.15.0
  • Layerのpython/lib/python3.8/site-packages/: 1.14.0
  • デプロイパッケージのルート: 1.13.0

次のコードを実行し、表示されたboto3のバージョンで順番を特定します。

import boto3

def handler(event, context):
    return boto3.__version__

特定ができたら、そのバージョンのコードを削除して再実行。
4つの順序がわかるまで続けます。

調査

一回目

1.13.0なので最初に呼ばれるのはデプロイパッケージに含めたライブラリのようです。

二回目

1.14.0なので、次はLayerのpython/lib/python3.8/site-packagesのようです。

三回目

ここまでの流れで予想できてしまいましたが、Layerのpythonのようです。

四回目

残りは一つなので、やる必要がなかったとも言えますが、デフォルトで入っているboto3が呼ばれています。

結果

  1. デプロイパッケージ
  2. Layerのpython/lib/python3.8/site-packages/
  3. Layerのpython
  4. デフォルトで入っているライブラリ

以上の結果になりました。

まとめ

以上、LambdaにおけるPythonのライブラリのロード順序を調べる話でした。

先日諸事情あって、Layerに古いバージョンのライブラリを入れることでデフォルトのライブラリを使わないようにする、という対応をしたので、ちょっと気になって調べてみました。

まぁ、これがわかって何か嬉しいことがあるのかわかりませんが、誰かの役にたったら幸いです。