AWS Lambdaで利用できるPythonライブラリの一覧をpkg_resourcesを使って確認してみた
はじめに
最近Pythonのランタイムを3.7から3.8に変更したところ、一部のコードがインポートエラーで動作しなくなることがありました。(この時は"Unable to import module 'lambda_function': No module named 'requests'”
でrequestsがなくエラー)
Lambdaのランタイムごとにデフォルトでインストールされているライブラリに差異があったのが原因なのですが、ドキュメント上にも載っていないようなので手動で確認してみました。この記事では、Pythonライブラリの一覧をpkg_resources
を使って確認する方法について紹介します。
Lambdaで利用できるPythonライブラリの一覧を確認する方法
以下のようなコードをLambdaで実行します。
import pkg_resources def lambda_handler(event, context): installed_packages = [d.project_name for d in pkg_resources.working_set] print(installed_packages)
このコードを実行すると、Lambdaで利用できるPythonライブラリの一覧が出力されます。これを使っていくつかのランタイムでライブラリの一覧を出力してみます。
pkg_resourcesとは
先ほどのコードで使っているpkg_resources
は、Pythonのパッケージ管理ツールであるsetuptools
に含まれるライブラリです。pkg_resources
のworking_setを取得すると、インポートして利用できるライブラリの一覧を取得することができます。より詳細に知りたい方は以下のドキュメントを参照してください。
Package Discovery and Resource Access using pkg_resources
実際に確認してみる
現在(2023/03/13)Pythonのランタイムで使用できるのは以下3つのになるので、それぞれでどの程度違いがあるのか調べてみました。
- Python3.7
- Python3.8
- Python3.9
そのランタイムでしか利用できないライブラリは*
をつけてます。
Python3.7のライブラリ
urllib3 six s3transfer requests * python-dateutil jmespath idna * charset-normalizer * chardet * certifi * botocore boto3 setuptools pip
Python3.8のライブラリ
urllib3 six s3transfer python-dateutil jmespath botocore boto3 setuptools rapid-client * pip
Python3.9のライブラリ
urllib3 six simplejson * s3transfer python-dateutil jmespath botocore boto3 awslambdaric * setuptools pip
各ランタイムごとに少し差があるのがわかりますね。私がインポートエラーで利用できなくなったrequests
も、Python3.7ではインストールされていますが、Python3.8、3.9では含まれていませんでした。
ランタイム変更でインポートエラーになった時の対応
新しいランタイムには存在していないライブラリを使っている場合、ランタイムの変更時には以下どちらかの対応が必要です。
- コードを修正して標準ライブラリ等で同じ動作を実現
- 元々使っていたライブラリをLambdaレイヤーとしてアップロードする
ケースバイケースだとは思いますが、コードの修正範囲が大きくなりすぎる場合はLambdaレイヤー、修正範囲が小さい場合は他の実現方法を調査すると良いと思います。Lambdaレイヤーはバージョン管理等も必要になり運用も考慮する必要があるので、できればコード修正でカバーしたいですね。
requests
の他にもPython3.7でしか利用できないライブラリが複数あるため、それらをインポートして利用する際には注意してください。
まとめ
pkg_resources
を使ったLambdaで利用できるPythonライブラリの一覧の取得方法について紹介しました。Pythonのランタイム変更時にインポートエラーが発生するようなときは、利用できるライブラリを確認してみてください。