DEV Community

Cover image for Local AWS Cloud With LocalStack
Adedamola Ajibola
Adedamola Ajibola

Posted on • Edited on

3

Local AWS Cloud With LocalStack

In this article, I will be discussing localstack, which I got to know and learn while working on an open source project and the task was meant to add an example usage of S3 using localstack.

What is LocalStack?

stack

A fully functional local AWS cloud stack which provides an easy-to-use test/mocking framework for developing Cloud applications. It's an open-source mock of the real AWS services, it produces a testing environment on our local machine that emulates the AWS cloud environment with the same APIs as the real AWS services.

LocalStack has three different tier:

  • Community Edition
  • Pro
  • Enterprise

Each tier has its services and features. Pro and Enterprise require payment, while Community Edition is free for personal usage.

Why Use LocalStack?

The procedure of briefly using a test/mock system in place of actual ones is a common way of running tests for applications with external dependencies. In other words LocalStack executes a test system of our AWS services and its primary objective is to assist in speeding up various procedures, saving money on development testing.

Problems LocalStack Solves

  • Cost effective testing
  • Available as Docker image
  • Local/offline testing
  • Continuous integration
  • Easy to use
  • Increases dev speed
  • Running applications without connecting to AWS.
  • Avoid the complexity of AWS configuration and focus on development.

Requirements

LocalStack is a Python designed application and its main aim is overriding the AWS endpoint URL with the URL of LocalStack. Furthermore, LocalStack runs inside a Docker container, but can also run as a Python application.

  • python (Python 3.7 up to 3.10 supported)
  • pip (Python package manager)
  • Docker

For installing run this command

pip install localstack 
Enter fullscreen mode Exit fullscreen mode

We can also run LocalStack directly as a Docker image either with Docker run or with Docker-compose. Before you start running Localstack, ensure that Docker service is up and running. I would highly recommend you Checkout LocalStack repository

Start Localstack in Docker with this command

localstack start -d 
Enter fullscreen mode Exit fullscreen mode

Check Service status

localstack status services 
Enter fullscreen mode Exit fullscreen mode

Setting up Localstack

To start running localstack in the project, you should have Docker and Docker-compose installed or make use of Docker Desktop to create containers locally.

Create a Docker-compose YAML file at the root of the project

version: '3.8'

services:
  localstack:
    container_name: '${LOCALSTACK_DOCKER_NAME-localstack_main}'
    image: localstack/localstack
    network_mode: bridge
    ports:
      - '127.0.0.1:4510-4559:4510-4559' # external service port range
      - '127.0.0.1:4566:4566' # LocalStack Edge Proxy
    environment:
      - AWS_DEFAULT_REGION=eu-west-1
      - DEBUG=1
      - DATA_DIR=/tmp/localstack/data
      - SERVICES=s3
    volumes:
      - '/private/tmp/localstack:/tmp/localstack'
      - '/var/run/docker.sock:/var/run/docker.sock'
Enter fullscreen mode Exit fullscreen mode

In this docker-compose.yml, we set the environment variable SERVICES to the name of the services we want to use (S3).

Run the below command to get docker-compose.yml file up and running.

docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

Add an example usage of S3

AWS S3 is a program that’s built to store, protect, and retrieve data from “buckets” at any time from anywhere on any device.

Let’s start by creating a directory at the root of the project and installing the NPM package.

mkdir localstack-s3
cd localstack-s3
npm init
npm install --save aws-sdk

Enter fullscreen mode Exit fullscreen mode

The code below provides a summary of the upload.js file. You can checkout the code nx-serverless

const AWS = require("aws-sdk");
const fs = require('fs')

const KEY_ID = "nxserverless"
const SECRET_KEY = "nxserverless"

const BUCKET_NAME = "nxboy";

const s3 = new AWS.S3({
  region: "us-east-1",
  accessKeyId: KEY_ID,
  secretAccessKey: SECRET_KEY,
  endpoint: 'http://localhost:4566', // This is the localstack EDGE_PORT
  s3ForcePathStyle: true,
});

const params = {
  Bucket: BUCKET_NAME
}

// To create an s3 bucket 
s3.createBucket(params,(err, data)=>{
  if(err){
    console.log(err)
  }
  else{
    console.log("Bucket created successfully", data.Location);
  }
})

// To upload a file to s3 bucket 
const uploadFile = (filename) => {
  const filecontent = fs.readFileSync(filename);

  const params = {
    Bucket: BUCKET_NAME,
    Key: "",
    Body: filecontent,
    ContentType: ""
  }

  s3.upload(params,(err, data)=>{
    if(err){
      console.log(err)
    }
    else{
      console.log("File uploaded successfully", data.Location)
    }
  })
}

uploadFile("")
Enter fullscreen mode Exit fullscreen mode

Run the below command to create an s3 bucket

node upload.js
Enter fullscreen mode Exit fullscreen mode

upload.js
Run the below command to list s3 bucket created

aws --endpoint-url=http://localhost:4566 s3 ls
Enter fullscreen mode Exit fullscreen mode

localstack

Conclusion

LocalStack provides an environment to test and develop your application and infrastructure with AWS services locally.

AWS Q Developer image

Your AI Code Assistant

Ask anything about your entire project, code and get answers and even architecture diagrams. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Start free in your IDE

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay