Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


This is a Terraform module implements the necessary moving parts to take a path that contains a Python or Node project and into a .zip payload for deployment to AWS Lambda.

It requires that you have the following packages installed:

  • jq
  • pyenv
  • openssl
  • BSD md5 or Linux md5sum
  • python2.7, python3.6 and python3.7, selectable via pyenv
  • node and npm
  • virtualenv, in the selected python runtime, installed via pip
  • terraform v0.11.2 or higher. This project may be usable with lower, but it is untested. It is currently untested with v0.12.x.


This module exists to make it easier to construct stable, long-lived zipped payloads for AWS Lambda functions, allowing for the Python or NodeJS Lambda functions to live in the same repository as the rest of the infracode.

How It Works

This module makes extensive use of null_resources and temporary directories (from $TMPDIR) to construct a project directory that is zipped according to the AWS documentation.

Because it uses temporary directories extensively, it requires a user-provided output path to ensure that the written zip is not cleaned up during normal system maintenance.

For Python, this project directory will include building a private virtualenv and running python -m compileall, in order to create the appropriate .pyc files. This is done to ensure faster startup time for the Lambda function.

Installing node_modules is handled in a temporary work directory, to avoid cluttering the repository.

Payload zip files are written in the form of ${}_{epoch} This is done to provide a stable indicator of whether or not a file has been deleted, and if it needs to be re-created.


    module "zip_test" {
      source            = ""
      name              = "test"
      project_path      = "${path.module}/lambda"
      output_path       = "${path.module}/output_path"
      runtime           = "python3.6"
      dependencies_file = "${path.module}/lambda/requirements.txt"
  • name: the name of this zip. used to construct the payload zip filename.
  • project_path: The path to your Python lambda project, not the .py file.
  • output_path: Where to write the final zip.
  • runtime: supports nodejs6.10, nodejs8.10, nodejs10.x, python2.7, python3.6, python3.7
  • dependencies_file: Optional. Not providing a dependency file will otherwise work normally. This largely exists to support Python projects that update the requirements file out of band.


  • path: The path to the final zip. This will be in the form of ${}_{epoch}, to allow for multiple uses of this module in a project
  • sha256: a base64sha256()-compatible sha256 representing the archive, for use in source_code_hash.
  • filename: The filename being exported.
  • md5: Suitable for using in the S3 bucket object etag.

Useful Knowledge

This project does not use the Terraform data source archive_file, even though it looks like it should.

The reason it doesn't is that it uses a shasum of the lambda source to build a temporary directory to install packages and compile source.

When the project sha changes, archive_file will error because it can't find the original source directory, which prevents Terraform from running.

As a result, we use custom per-language archival scripts to mimic the archive_file functionality.


This project is Copyright 2018-2019 Eiara Limited, and licensed under the terms of the MIT license.


A Terraform module to create AWS Lambda zipfiles of Python or NodeJS projects







No releases published


No packages published

Contributors 4