How to Fix Slow Request Handling With AWS SAM Local
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 CodeUri
parameter.
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:
Specify
AWS_ACCESS_KEY_ID
andAWS_SECRET_ACCESS_KEY
environment variablesConfiguring a profile in
~/.aws/credentials
for 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 ~/.aws/profile
.
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/credentials
in a profile, you need to specify--profile <profile_name
when you invokesam
for 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!