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.