AWS Lambda
pydantic
integrates well with AWS Lambda functions. In this guide, we'll discuss how to setup pydantic
for an AWS Lambda function.
Installing Python libraries for AWS Lambda functions¶
There are many ways to utilize Python libraries in AWS Lambda functions. As outlined in the AWS Lambda documentation, the most common approaches include:
- Using a
.zip
file archive to package your code and dependencies - Using AWS Lambda Layers to share libraries across multiple functions
- Using a container image to package your code and dependencies
All of these approaches can be used with pydantic
. The best approach for you will depend on your specific requirements and constraints. We'll cover the first two cases more in-depth here, as dependency management with
a container image is more straightforward. If you're using a container image, you might find this comment helpful for installing pydantic
.
Tip
If you use pydantic
across multiple functions, you may want to consider AWS Lambda Layers, which support seamless sharing of libraries across multiple functions.
Regardless of the dependencies management approach you choose, it's beneficial to adhere to these guidelines to ensure a smooth dependency management process.
Installing pydantic
for AWS Lambda functions¶
When you're building your .zip
file archive with your code and dependencies or organizing your .zip
file for a Lambda Layer, you'll likely use a local virtual environment to install and manage your dependencies. This can be a bit tricky if you're using pip
because pip
installs wheels compiled for your local platform, which may not be compatible with the Lambda environment.
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)!
- Use the platform corresponding to your Lambda runtime.
- Specify the directory where you want to install the package (often
python
for Lambda Layers). - Use the CPython implementation.
- The Python version must be compatible with the Lambda runtime.
- This flag ensures that the package is installed pre-built binary wheels.
- The latest version of
pydantic
will be installed.
Troubleshooting¶
no module named 'pydantic_core._pydantic_core'
¶
The
no module named `pydantic_core._pydantic_core`
error is a common issue that indicates you have installed pydantic
incorrectly. To debug this issue, you can try the following steps (before the failing import):
- Check the contents of the installed
pydantic-core
package. Are the compiled library and its type stubs both present?
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')]
"""
You should expect to see two files like those printed above. The compile library file will be a .so or .pyd with a name that varies according to the OS and Python version.
- Check that your lambda's Python version is compatible with the compiled library version found above.
import sysconfig
print(sysconfig.get_config_var("EXT_SUFFIX"))
#> '.cpython-312-x86_64-linux-gnu.so'
You should expect to see the same suffix here as the compiled library, for example here we see this suffix .cpython-312-x86_64-linux-gnu.so
indeed matches _pydantic_core.cpython-312-x86_64-linux-gnu.so
.
If these two checks do not match, your build steps have not installed the correct native code for your lambda's target platform. You should adjust your build steps to change the version of the installed library which gets installed.
Most likely errors:
-
Your OS or CPU architecture is mismatched (e.g. darwin vs x86_64-linux-gnu). Try passing correct
--platform
argument topip install
when installing your lambda dependencies, or build inside a linux docker container for the correct platform. Possible platforms at the moment include--platform manylinux2014_x86_64
or--platform manylinux2014_aarch64
, but these may change with a future Pydantic major release. -
Your Python version is mismatched (e.g.
cpython-310
vscpython-312
). Try passing correct--python-version
argument topip install
, or otherwise change the Python version used on your build.
No package metadata was found for email-validator
¶
Pydantic uses version
from importlib.metadata
to check what version of email-validator
is installed.
This package versioning mechanism is somewhat incompatible with AWS Lambda, even though it's the industry standard for versioning packages in Python. There
are a few ways to fix this issue:
If you're deploying your lambda with the serverless framework, it's likely that the appropriate metadata for the email-validator
package is not being included in your deployment package. Tools like serverless-python-requirements
remove metadata to reduce package size. You can fix this issue by setting the slim
setting to false in your serverless.yml
file:
pythonRequirements:
dockerizePip: non-linux
slim: false
fileName: requirements.txt
You can read more about this fix, and other slim
settings that might be relevant here.
If you're using a .zip
archive for your code and/or dependencies, make sure that your package contains the required version metadata. To do this, make sure you include the dist-info
directory in your .zip
archive for the email-validator
package.
This issue has been reported for other popular python libraries like jsonschema
, so you can
read more about the issue and potential fixes there as well.
Extra Resources¶
More Debugging Tips¶
If you're still struggling with installing pydantic
for your AWS Lambda, you might consult with this issue, which covers a variety of problems and solutions encountered by other developers.
Validating event
and context
data¶
Check out our blog post to learn more about how to use pydantic
to validate event
and context
data in AWS Lambda functions.