If you are developing AWS Lambda Functions, you will likely use AWS SAM Local for running your functions in a local development environment.
AWS SAM Local is a great tool. However, many users, including myself, run into very slow response times when first using AWS SAM Local, as documented in issue 134. Simlpe functions may be taking more than 6 or even 10 seconds to evaluate.
This is likely for one of two reasons:
You are using a language with compiled-and-compressed code packages like Java’s JAR files.
You have not configured your AWS credentials.
For (A), AWS SAM Local unpacks your compressed code package on every request.
That process takes a few seconds, period. There are a few workarounds,
which include manually unzipping your .jar and pointing at the unzipped files
in your template.yaml’s
However, if you are not using the C# or Java environments and are still experiencing slow requests, you are in (B), and you can solve this problem by configuring your AWS Credentials.
The documentation indicates that you can provide credentials in one of two ways:
Configuring a profile in
~/.aws/credentialsfor Linux or MacOs
Nota Bene: When AWS SAM Local’s README refers to
~/.aws/credentials, there is an implication
that you are using the AWS CLI v2, not the older v1, which stores information in
There are two gotchas with this documentation:
While both solutions will speed up execution, specifying the environment variables is noticeably faster. I recommend you skip the AWS CLI configuration and just specify the environment variables.
If you put your credentials in
~/.aws/credentialsin a profile, you need to specify
--profile <profile_namewhen you invoke
samfor AWS SAM Local.
Note that for basic AWS SAM local operation, you do not need to specify valid AWS credentials - any old value, even the empty string, will do!
Recently, I tried to get a development environment set up for developing a single page web application ClojureScript - but with a backend written to run on AWS Lambda functions, also in ClojureScript.
Because AWS Lambda expects your JS to export the handler functions for the Lambda function using the Node module system, I ended up with a real problem:
How do you require Google Closure-compiled ClojureScript into a node module?
The answer ended up being quite simple. Given that Closure is creating a compiled
file with name
functions.js, which in turn is exporting a namespace
you can create a new
main.js file in the same directory as the compiled
file with the following content:
Recently, I attempted to get started with the
boot build system by
running the boot-cljs-example repository.
On my system, while running the suggested build script:
I ran into the following error:
1 2 3 4 5 6 7 8
To fix this: note that boot relies on a
boot.properties file for version information
and uses that instead of your system versions if set.
To fix the error above, change your
2.7.2 instead of
Happy coding! For extra information, see the version information below:
Version & System Notes
To do so, I installed the default version of boot as of the time of writing. The version output of this version is:
1 2 3 4 5 6
Additionally, I am running Java 1.8. and node 7.10 via Ubuntu 16.04’s node package, but with nvm (node version manager) installed.
Recently, I have been messing around with writing and deploying AWS Lambda Functions and Microsoft Azure Functions - two “serverless” technologies that have a lot of promise for certain applications.
For development environments, both rely on using docker images provided by the respective vendors to run your functions locally.
I attempted to set up Docker on Ubuntu 16.04 by running
sudo apt install docker,
which appeared to succeed.
However, when attempting to run
docker run hello-world - a command which
should pull a ‘hello world’ image from one of the public docker repositories,
then run it - I received an error to the effect of:
The solution to this problem is to either (a) run your docker commands as root, or (b) add your login user to the docker group.
Option (a) is not preferred, as introducing a sudo dependency will quickly lead you to ‘sudo hell’ where everything of use requires sudo.
For option (b), you can run
sudo usermod -a -G docker $USER, which will add your
user to the docker group.
For the change to take effect, you will need to fully log out of your account and log back in.