AWS Lambdaで利用できるPythonライブラリの一覧をpkg_resourcesを使って確認してみた

Lambdaのランタイムを変更するときにはインポートエラーにならないよう、ランタイムごとに利用できるライブラリを把握しておきましょう。
2023.03.13

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

はじめに

最近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のランタイム変更時にインポートエラーが発生するようなときは、利用できるライブラリを確認してみてください。

参考