How to fix "PackageNotFoundError: importlib_metadata" error in Serverless AWS Lambda
I was building recently a serverless python microservice and for one of the endpoints i needed to implement jsonschema validation. Locally i have built it, covered with unit tests and everything was working just fine. But when i tried to deploy it to AWS Lambda with serverless
framework, i ended up with "PackageNotFoundError: importlib_metadata"
error. After couple of hours of trials and googling i wasn't able to figure out the solution ( there's not much information about this error on web). Thanks to one of my coleague i managed to finally fix it and the fix is stupid simple : in serverless.yml
file i have this block :
pythonRequirements:
dockerizePip: non-linux
slim: true
fileName: requirements/base.txt
In order to make this error go away i just had to change slim
from true
to false
!. It appears that the slim
option of serverless-python-requirements
plugin is indeed the culprit. The simple option is to turn it off entirely. But the plugin allows more fine grained control. See the config below:
slim: true
slimPatternsAppendDefaults: false
slimPatterns:
- "**/*.pyc"
- "**/*.pyo"
- "**/__pycache__*"
This config will slim down by deleting all .pyc/.pyo/__pycache__
files and dirs and by stripping the .so
libs.
Note the "slimPatternsAppendDefaults=false"
. The root cause is that the default slim patterns also contain "**/*.dist-info*"
. Removing these dist-info/ dirs
will break importlib_metadata
. So we can still use slim
, just not with that pattern.
So, in order to make this problem away just set your serverless.yml
like this :
pythonRequirements:
dockerizePip: non-linux
slim: false
fileName: requirements/base.txt
Thanks @Freek Wiekmeijer for adding more light on this question in the comments.