DEV Community

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

Posted on • Updated on

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.

Top comments (0)