aws-sam-cli icon indicating copy to clipboard operation
aws-sam-cli copied to clipboard

sam local build does not copy .so files

Open jrowen opened this issue 6 years ago • 5 comments

Description

The build process doesn't copy over .so files when building a Python Lambda function.

Steps to reproduce

Install the ptvsd library:

pip install --upgrade -t ./package ptvsd

Build a Lambda function that uses ptvsd

sam build --template ./aws/template.yaml --use-container

The template file should include a reference to the package folder noted earlier (like CodeUri: ../package).

Observed result

When following the ptvsd debugging steps, the following error is thrown from the sam local invoke process:

Expected: /var/task/ptvsd/_vendored/pydevd/pydevd_attach_to_process/attach_linux_amd64.so to exist.

Looking into the .aws-sam/build/Function/ptvsd/pydevd/pydevd_attach_to_process folder, I can confirm the .so files were not copied over. Looking in package/ptvsd/_vendored/pydevd/pydevd_attach_to_process, I can confirm that the .so files are present.

Expected result

Debugging process runs without error.

jrowen avatar Aug 22 '19 18:08 jrowen

This is indeed a bug. We intentionally ignore certain files, .so files are one of them - https://github.com/awslabs/aws-lambda-builders/blob/develop/aws_lambda_builders/workflows/python_pip/workflow.py#L27

The intention behind excluding .so files is to prevent people from inadvertently including .so files built for one platform (say Mac) and hoping it will run on Lambda.

Since ptvsd produces .so files it needs to be compiled for the Lambda environment. I would recommend adding ptvsd to your requirements.txt during development and removing it before you push to production.

If this works, I can update the documentation to reflect the "sam build" usecase as well. Of course, it will be easier if sam build had support a requirements-dev.txt that gets built only for development.

sanathkr avatar Aug 22 '19 23:08 sanathkr

I tried adding ptvsd to my requirements.txt file, but it didn't seem to resolve the issue.

My current workaround is to run the following after the build step, which eliminates the error

cp ./package/ptvsd/_vendored/pydevd/pydevd_attach_to_process/*.so .aws-sam/build/Function/ptvsd/_vendored/pydevd/pydevd_attach_to_process

jrowen avatar Aug 23 '19 13:08 jrowen

Are there any plans to support some kind of .samignore file type of mechanism? This really needs to be customizable by the user IMO. I'm seeing that sam build is including my .vagrant directory and other things I don't want it including and is bloating my deployment packages (which as you know have a size limitation. Many tools (e.g. Vagrant) need to have files in the root directory

kbrowns avatar Jan 17 '20 14:01 kbrowns

I've precompiled pymssql using freetds and want to use this with my lambda. It'd be great for me if I could do this with SAM somehow.

tomlockwood avatar Apr 28 '20 04:04 tomlockwood

This feature will be useful for certain libraries that require .so files

rtrive avatar Oct 05 '20 18:10 rtrive

We have a few issues asking for a similar thing in ignore: or a .samignore file. Closing so that we can track here: https://github.com/aws/aws-lambda-builders/issues/185

torresxb1 avatar Jan 18 '23 21:01 torresxb1

⚠️COMMENT VISIBILITY WARNING⚠️

Comments on closed issues are hard for our team to see. If you need more assistance, please either tag a team member or open a new issue that references this one. If you wish to keep having a conversation with other community members under this issue feel free to do so.

github-actions[bot] avatar Jan 18 '23 21:01 github-actions[bot]