コンテンツにスキップ

AWS Lambda

pydanticはAWS Lambda関数とうまく統合されています。このガイドでは、AWS Lambda関数にpydanticを設定する方法について説明します。

Installing Python libraries for AWS Lambda functions

AWS Lambda関数でPythonライブラリを利用する方法は数多くあります。AWS Lambdaドキュメントで概説されているように、最も一般的なアプローチには次のものがあります。

  • .zip file archiveを使用して、コードと依存関係をパッケージ化します。
  • AWS Lambda Layersを使用して、複数の関数間でライブラリを共有します。
  • container imageを使用してコードと依存関係をパッケージ化します。

これらのアプローチはすべてpydanticで使用できます。 最適なアプローチは、特定の要件と制約によって異なります。コンテナイメージを使用した依存関係管理の方が簡単なので、ここでは最初の2つのケースについて詳しく説明します。コンテナイメージを使用している場合は、this commentpydanticのインストールに役立つことがわかります。

Tip

複数の関数にわたってpydanticを使用する場合は、複数の関数間でライブラリをシームレスに共有できるAWS Lambda Layersを検討するとよいでしょう。

選択する依存関係管理の手法にかかわらず、円滑な依存関係管理プロセスを確実にするために、これらのガイドラインに従うことは有益です。

Installing pydantic for AWS Lambda functions

コードと依存関係を使用して.zipファイルアーカイブを構築したり、.zipファイルをLambda Layer用に整理したりする場合は、依存関係のインストールと管理にローカルの仮想環境を使用する可能性があります。pipを使用している場合、pipはローカルプラットフォーム用にコンパイルされたwheelsをインストールするため、これは少し厄介ですが、Lambda環境と互換性がない可能性があります。

Thus, we suggest you use a command similar to the following:

pip install \
    --platform manylinux2014_x86_64 \  # (1)!
    --target=<your_package_dir> \  # (2)!
    --implementation cp \  # (3)!
    --python-version 3.10 \  # (4)!
    --only-binary=:all: \  # (5)!
    --upgrade pydantic  # (6)!
  1. Lambdaランタイムに対応するプラットフォームを使用します。
  2. パッケージをインストールするディレクトリを指定します(Lambdaレイヤーの場合はpythonがよく使用されます)。
  3. CPython実装を使用します。
  4. PythonバージョンはLambdaランタイムと互換性がある必要があります。
  5. このフラグは、パッケージが事前に構築されたバイナリホイールにインストールされていることを確認します。
  6. pydanticの最新バージョンがインストールされます。

Troubleshooting

no module named 'pydantic_core._pydantic_core'

この

no module named `pydantic_core._pydantic_core`

エラーは、pydanticが正しくインストールされていないことを示す一般的な問題です。 この問題をデバッグするには、次の手順を実行します(インポートが失敗する前)。

  1. インストールされているpydantic-coreパッケージの内容を確認します。コンパイルされたライブラリとその型スタブの両方が存在しますか?
from importlib.metadata import files
print([file for file in files('pydantic-core') if file.name.startswith('_pydantic_core')])
"""
[PackagePath('pydantic_core/_pydantic_core.pyi'), PackagePath('pydantic_core/_pydantic_core.cpython-312-x86_64-linux-gnu.so')]
"""

上記のような2つのファイルが表示されるはずです。コンパイルライブラリファイルは.soまたは.pydで、名前はOSとPythonのバージョンによって異なります。

  1. lambdaのPythonバージョンが上記のコンパイルされたライブラリバージョンと互換性があることを確認します。
import sysconfig
print(sysconfig.get_config_var("EXT_SUFFIX"))
#> '.cpython-312-x86_64-linux-gnu.so'

コンパイルされたライブラリと同じサフィックスがここに表示されるはずです。例えば、ここでは.cpython-312-x86_64-linux-gnu.soというサフィックスが_pydantic_core.cpython-312-x86_64-linux-gnu.soと実際に一致しています。

これら2つのチェックが一致しない場合は、ビルドステップでラムダのターゲットプラットフォーム用の正しいネイティブコードがインストールされていません。インストールされるインストール済みライブラリのバージョンを変更するために、ビルドステップを調整する必要があります。

Most likely errors:

  • OSまたはCPUのアーキテクチャが一致していません(例:darwin vs x86_64-linux-gnu)。lambda依存関係をインストールするときに正しい--platform引数をpip installに渡すか、正しいプラットフォーム用のlinux dockerコンテナ内でビルドしてみてください。現在使用可能なプラットフォームには--platform manylinux2014_x86_64または--platform manylinux2014_aarch64がありますが、これらは将来のPydanticメジャーリリースで変更される可能性があります。
  • あなたのPythonのバージョンが一致していません(例えばcpython-310cpython-312)。pip installに正しい--python-version引数を渡すか、あなたのビルドで使用されているPythonのバージョンを変更してください。

No package metadata was found for email-validator

Pydanticは、importlib.metadataversionを使用して、email-validatorがインストールされているcheck what version。 このパッケージのバージョン管理メカニズムは、Pythonでのパッケージのバージョン管理の業界標準であるにもかかわらず、AWS Lambdaとは多少互換性がありません。 この問題を解決するにはいくつかの方法があります。

サーバレスフレームワークでlambdaをデプロイしている場合、email-validatorパッケージの適切なメタデータがデプロイパッケージに含まれていない可能性があります。 serverless-python-requirementsなどのツールは、パッケージサイズを小さくするためにメタデータを削除します。この問題は、serverless.ymlファイルでslim設定をfalseに設定することで修正できます。

pythonRequirements:
    dockerizePip: non-linux
    slim: false
    fileName: requirements.txt

この修正、および関連する可能性のあるその他の"slim"設定の詳細については、hereを参照してください。

コードや依存関係に.zipアーカイブを使用している場合は、パッケージに必要なバージョンメタデータが含まれていることを確認してください。これを行うには、.zipアーカイブにdist-infoディレクトリをemail-validatorパッケージ用に含めてください。

この問題は、jsonschemaのような他の人気のあるpythonライブラリで報告されているので、この問題と潜在的な修正についてもそこで読むことができます。

Extra Resources

More Debugging Tips

AWS Lambdaにpydanticをインストールするのにまだ苦労している場合は、他の開発者が遭遇するさまざまな問題と解決策をカバーしているthis issueを参照してください。

Validating event and context data

AWS Lambda関数でpydanticを使用してeventおよびcontextデータを検証する方法について詳しくは、私たちのblog postを参照してください。