Using GNU Make with JavaScript and Node.js to build AWS Lambda functions

GNU Make is an automation tool that produces executables and other non-source assets. It can be used to coordinate a variety of tasks, from the compilation of code to the transcoding of media files.

Make uses a file called Makefile to determine what needs to be built when it needs to be built, and how.

In the upcoming series of articles, I will show examples of using make to orchestrate builds of JavaScript apps. Today, I want to talk about using make to build Node.js-based Lambda functions.

A Node.js – based Lambda function is deployed as a zip file to AWS. It has a single main entry point, typically index.js, and it has a handler function. I won’t get into the details of building Node.js Lambdas because you can find many more details in AWS Documentation.

Suppose you have a Lambda structured as follows:

./lambda
    index.js
    package.json
    Makefile

Your goal is to rebuild the lambda.zip file only if the source files change. Your Makefile will look like this:

lambda.zip: *.js package.json
    npm install
    zip -r lambda.zip *.js *.json node_modules/*

If you modify any JavaScript files, or package.json, and type make, it will determine that lambda.zip is outdated and rebuild it.

What you also want to do is create a clean target:

clean: 
    rm -f lambda.zip

Finally, you can add a deploy target to deploy the zip file to AWS:

deploy: lambda.zip
    $(info "Run AWS Commands to deploy this Lambda")

Note how deploy target depends on lambda.zip target — if there is no zip file, there is nothing to deploy. I will leave it up to you to figure out how to deploy Node.js AWS Lambda functions

The complete Makefile now looks like this:


lambda.zip: *.js package.json
    npm install
    zip -r lambda.zip *.js *.json node_modules/*

clean:
    rm -f lambda.zip

deploy: lambda.zip
    $(info "Run AWS Commands to deploy this lambda")

Some final thoughts

You can find more documentation on make here. make is available on UNIX-like operating systems, i.e. Linux and Mac OS X, and can be installed on Windows.

In upcoming posts, I will discuss using make for Node.js Docker services and front-ends.