Sign inSign up

3mcloud/lambda-packager

By 3mcloud

•Updated over 2 years ago

A lambda packager for AWS lambda functions

Image
0

100K+

3mcloud/lambda-packager repository overview

⁠lambda-packager

Package code for Python and Node AWS Lambda functions using a docker container.

Github Repository⁠


⁠Python

⁠TL;DR

Lets say all our code is within a src directory and within that src directory we have a requirements.txt. We want the output to be deployment.zip at the root of our project. Then all we need to do is:

	docker run -it --rm \
        -v $(if ${PWD},${PWD},${CURDIR}):/src \ # First mount our code to the container
		3mcloud/lambda-packager:python-latest

And boom, deployment.zip should be in your repository root.

Note: $(if ${PWD},${PWD},${CURDIR}) is a ternary operator which we use to make it Windows and Mac agnostic with Makefiles.


⁠Container Variables

You can change the default behavior of this packager by using the environment variables of the container

Variable NameDefaultRequiredDescription
MANIFEST_FILE noIf you only want to package a single lambda, ignore this environment variable, else see Manifest File⁠. This is the path, relative to CI_WORKSPACE or absolute, to the manifest file. Empty (default) if you don't want to use it.
LAMBDA_CODE_DIR./srcnoDirectory, relative to CI_WORKSPACE (or absolute), that is to be packaged and zipped.
CONTAINER_BUILD_DIRECTORY/buildnoThe directory within the container where the code is moved to, the pip install is done, and the code is zipped from. Shouldn't need to be changed.
ARTIFACT_NAMEdeployment.zipnoPath and name of the zip file (or artifact) that will be outputted. Relative to CI_WORKSPACE (or absolute).
GLOB_IGNORE*.pyc,__pycache__noComma delimited glob expressions for files and folder to ignore while zipping.
CI_WORKSPACE$(pwd) - i.e. root levelnoWorkspace directory within the container.
REQUIREMENTS_FILErequirements.txtnoPath relative to LAMBDA_CODE_DIR (or absolute) where the requirements file is. If not requirements file is found, it will attempt to use the setup.py
SETUP_FILEsetup.pynoPath relative to LAMBDA_CODE_DIR (or absolute) where the setup.py file is.
MAX_LAMBDA_SIZE_BYTES52428800noUsed for lambda size checking message. Should be an integer value which represents the maximum size of a lambda in bytes.
FAIL_ON_TOO_BIGFalsenoIf set to True, the container will exit with a status code of 1 if the lambda is too big.
SSH_FLIPFalsenoOnly relevant if you are pip installing directly from a repo using ssh or https. If set to True and you are using a REQUIREMENTS_FILE, the container will check if it has access to ssh. If the container does not have access, then it will swap all requirements that use ssh to use https.

⁠Examples

Our code is in a directory named code and we have a reqs.txt file within that directory. We want deployment.zip to be at the root level of our project.

	docker run -it --rm \
        -v $(if ${PWD},${PWD},${CURDIR}):/src \ # First mount our project to the container
        -e CI_WORKSPACE=/src \ # We will be working with /src
		-e LAMBDA_CODE_DIR=/code \ # The code to be packaged is within /src/code
		-e REQUIREMENTS_FILE=reqs.txt \ # Requirements are in /src/code/reqs.txt
		3mcloud/lambda-packager:python-latest

Alternatively, lets say we only want to mount the code directory and not the entire root of our project:

	docker run -it --rm \
        -v $(if ${PWD},${PWD},${CURDIR})/code:/src \ # First mount our code to the container
		-e LAMBDA_CODE_DIR=/src \ # The code to be packaged is within /src (Note CI_WORKSPACE is /)
		-e REQUIREMENTS_FILE=reqs.txt \ # Requirements are in /src/reqs.txt
        -e ARTIFACT_NAME=/src/deployment.zip \ # We need to save the zip within /src/ since we didn't mount the root level.
		3mcloud/lambda-packager:python-latest

Lasty, we can try to leverage the default values. Lets say all our code is within a src directory and within that src directory we have a requirements.txt. We want the output to be deployment.zip at the root of our project. Then all we need to do is:

	docker run -it --rm \
        -v $(if ${PWD},${PWD},${CURDIR}):/src \ # First mount our code to the container
		3mcloud/lambda-packager:python-latest

⁠Node

⁠TL;DR for Node

Make sure:

  • your node code is in a folder called src, relative to the working directory
  • you have a package.json (and preferrably, also a package-lock.json) in your working directory
docker run -it --rm -v $(pwd):/workspace -w /workspace 3mcloud/lambda-packager:node-12.22

And boom, deployment.zip should be in your repository root.

⁠Container variables for node

You can change the default behavior of this packager by using the environment variables of the container

Variable NameDefaultRequiredDescription
ARTIFACT_CODE_PREFIXEmptynoname of the directory inside your zip file containing the code
ARTIFACT_NAMEdeployment.zipnoname of your artifact or zip file that you want to output
CONTAINER_BUILD_DIRECTORY/buildnobuild output directory inside your container
CI_WORKSPACEDocker working dirnoworkspace directory inside your container
LAMBDA_CODE_DIRsrcnocode directory of your lambda function
⁠Examples

See the Examples for Python, except where you see 3mcloud/lambda-packager:python-latest replace that with 3mcloud/lambda-packager:node-12.22

The default behavior of the node packager is to assume that the package.json and package-lock.json are in the same directory as the entry point for your application. For example, your application looks like this:

.
├── app.js
├── package.json

Then just use the defaults as shown in the Examples.

Some projects, however, have a nested structure. If you have a folder structure that looks like this, which was created by sam init:

.
├── README.md
├── __tests__
│   └── unit
│       └── handlers
│           ├── get-all-items.test.js
│           ├── get-by-id.test.js
│           └── put-item.test.js
├── buildspec.yml
├── env.json
├── events
│   ├── event-get-all-items.json
│   ├── event-get-by-id.json
│   └── event-post-item.json
├── package.json
├── src
│   └── handlers
│       ├── get-all-items.js
│       ├── get-by-id.js
│       └── put-item.js
└── template.yml

And you want a package that looks like this on the inside:

.
├── node_modules
└── src

Then use this incantation, from the base folder.

docker run -it --rm -w /test -v $(pwd):/test \
    -e NPM_PACKAGE_FILE=./package.json \
    -e NPM_PACKAGE_LOCK=./package-lock.json \
    -e LAMBDA_CODE_DIR=src \
    -e ARTIFACT_CODE_PREFIX=src \
    3mcloud/lambda-packager:node-12.22

Tag summary

Content type

Image

Digest

sha256:e43068ffb…

Size

589.4 MB

Last updated

over 2 years ago

docker pull 3mcloud/lambda-packager