DEV Community

Vikas Garg
Vikas Garg

Posted on

SAM Local with Localstack

As a developer, I look for making local dev experience as smooth as possible. In the same vein, one thing that bothers most of us working with aws cloud is to test it locally. Good thing is that we have localstack to our rescue. This post will focus on how you can have AWS SAM working with Localstack.

Table Of Contents

Tools

Project Setup

For this post, we will use sam init to pull in the hello-world project with nodejs runtime. More information on SAM. After following the prompts, you will get a sample hello world project setup running in node.

Setting up Localstack

In order to setup localstack in the project, we will first create a docker-compose.yml in the root of our project.



version: "3"
services:
  localstack:
    build: localstack
    container_name: localstack
    environment:
      - DATA_DIR=/tmp/localstack/data
      - SERVICES=s3 # this can be a comma separated list of services you want to start
      - TZ=America/New_York
    ports:
      - '4572:4572' # these ports will be different for different services.


Enter fullscreen mode Exit fullscreen mode

Another thing that we will need to do is create a directory called localstack with following contents,



.dockerignore
Dockerfile
recorded_api_calls.json


Enter fullscreen mode Exit fullscreen mode

Let's see what each of these files will look like, .dockerignore



.dockerignore
Dockerfile


Enter fullscreen mode Exit fullscreen mode

Docekrfile



FROM localstack/localstack

COPY /. /tmp/localstack/data


Enter fullscreen mode Exit fullscreen mode

We will get to the contents of the json file later. Once we have this, we are ready to start the localstack in a docker container. You can do this by running,
docker-compose up -d. This will pull the localstack image and build it and start it.

S3 bucket

Now we will need to create a s3 bucket in our localstack container. For this we can just run this: awslocal s3 mb s3://test-bucket. This will create the bucket. Now bash into the container, docker exec -it localstack /bin/bash and then go to vi /tmp/localstack/data/recorded_api_calls.json. Copy the contents of this file and paste them in the file recorded_api_calls.json in the localstack directory we created earlier. We need to do this, so that we don't need to create the bucket every time we start the container.

Hooking it up

Now if you want to setup your project to use any AWS components like S3, IAM, STS etc. you can do so and test them without going to AWS directly.

In the code, you will need aws-sdk to initialize the s3 client, you can do this by,



const s3 = AWS.S3({ endpoint: 'http://localhost:4572' });


Enter fullscreen mode Exit fullscreen mode

Coming back to make sam local invoke work with localstack. For this, bare minimum you would need to do this:



sam local invoke --docker-network host


Enter fullscreen mode Exit fullscreen mode

For more information on sam local

Full working code can be found here:

sam-local-with-localstack

This project contains source code and supporting files for a serverless application that you can deploy with the SAM CLI. It includes the following files and folders.

  • hello-world - Code for the application's Lambda function.
  • events - Invocation events that you can use to invoke the function.
  • hello-world/tests - Unit tests for the application code.
  • template.yaml - A template that defines the application's AWS resources.

The application uses several AWS resources, including Lambda functions and an API Gateway API. These resources are defined in the template.yaml file in this project. You can update the template to add AWS resources through the same deployment process that updates your application code.

If you prefer to use an integrated development environment (IDE) to build and test your application, you can use the AWS Toolkit.
The AWS Toolkit is an open source plug-in for popular IDEs that uses the SAM CLI to build…

Top comments (0)