serverless/serverless-python-requirements

Packaging of requirements per function generates separate zip files with code and reqs

freekwiekmeijer opened this issue · 2 comments

Problem:

Using per-function requirements according to the explanation on the web page.

I'm encountering this strange problem in which packaging generates TWO zip files per function. One of the two zips contains the included files from the local source code. The other one contains the handler.py and the pip requirements.

Delatils:
Project structure:

- serverless.yml
- lambda_1/
  - handler.py
  - requirements.txt
- lambda_2/
  - handler.py
  - requirements.txt
- shared/
  - __init__.py
  - shared_module.py

Snippet from serverless.yml

package:
  individually: true
  exclude:
    - '**'
 

functions:
  ShortFunctionName1:   # the shorthand name we use to refer to the function within serverless.yml
    name: fully-qualified-function-name-1  # the fully qualified function name used in AWS Lambda
    module: lambda_1
    package:
      include:
        - 'shared/**'
        - 'lambda_1/**'
    handler: handler.handle_lambda_event

  ShortFunctionName2:
    name: fully-qualified-function-name-2
    module: lambda_2
    package:
      include:
        - 'shared/**'
        - 'lambda_2/**'
    handler: handler.handle_lambda_event

What happens during packaging is the following:

  • packaging generates 2 zip files per function:
    • ShortFunctionName1.zip --> contains the files matching the include patterns lambda_1/ and shared/ with files underneath)
    • lambda_1-fully-qualified-function-name-1.zip --> contains handler.py from directory lambda_1/ on the root. also contains all pip requirements)
    • the same applies to function_2, we get one zip with the short name and one with the fully qualified name.
  • deployment uploads only the zip files with file fully qualified name to AWS.
  • runtime you get an ImportError: modules under lambda_1 or shared are obviously not found because these directories weren't packaged in this zip file.

I believe this is a bug in the packaging process, where there is inconsistent usage of the shorthand and fully qualified function names in establishing the target zip filename.

Software versions:
Serverless framework: 3.19.0
Serverless-python-requirements: 5.4.0

Hey @freekwiekmeijer, thanks a lot for reporting and sorry that you've run into trouble here. Just so I understand it correctly, the issue happens when you're specifying name explicitly for each of the functions and you use individual packaging, right?

Indeed. I have per-function requirements and each function specifies a name attribute which is the fully qualified name we use in AWS Lambda.