How to deploy DynamoDB locally?
Set up a No-SQL database playground for testing purposes
3 min readWhat is a No-SQL database?
A "No-SQL" or "non-relational" database (the term is used since mid to late 2000s) is mainly about being less strict with how the data is stored - semi-structured or even unstuctured.
Just remember that "SQL" is the abbreviation for "Structured Query Language", and so "No-SQL" means "No Structured Query Language". 😎
The ability to store and change data structures flexibly allows businesses to move and scale quickly, adapting to market needs.
Accessing data is also faster compared to a "relational" database, due to accessing data without having to join multiple tables.
However, relational databases also have their advantages, but more to this in another blog post! 🤪
What is DynamoDB?
DynamoDB is a database service offered by Amazon. It is
a fully managed, serverless, key-value No-SQL database designed to run high-performance applications at any scale. DynamoDB offers built-in security, continuous backups, automated multi-Region replication, in-memory caching, and data import and export tools
Alrighty - let's get going
- Create a new project and install:
// create project
$ mkdir <dynamodb-local>
$ cd <dynamodb-local>
$ npm init -y
// install package
$ npm i @aws-sdk/client-dynamodb
- Create tsconfig.json file:
$ touch tsconfig.json
- Copy the following into the tsconfig.json file:
{
  "compilerOptions": {
    "esModuleInterop": true,
    "lib": ["es2015", "dom"]
  }
}
- Create Docker file:
$ touch docker-compose.yml
- Copy the following into the Docker file:
// docker-compose.yml
version: '3.8'
services:
 dynamodb-local:
   command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
   image: "amazon/dynamodb-local:latest"
   container_name: dynamodb-local
   ports:
     - "8000:8000"
   volumes:
     - "./docker/dynamodb:/home/dynamodblocal/data"
   working_dir: /home/dynamodblocal
- Create database creation file:
$ touch createTable.ts
- Copy the following into the table creation file:
// createTable.ts
import {
  DynamoDBClient,
  CreateTableCommand,
  CreateTableCommandInput,
} from '@aws-sdk/client-dynamodb';
const dbclient = new DynamoDBClient({
  region: 'eu-central-1',
  credentials: {
    accessKeyId: 'MYACCESSKEY',
    secretAccessKey: 'MYSECRETKEY',
  },
  endpoint: 'http://localhost:8000',
});
const command: CreateTableCommandInput = {
  TableName: 'MyTable',
  KeySchema: [{ AttributeName: 'id', KeyType: 'HASH' }],
  AttributeDefinitions: [{ AttributeName: 'id', AttributeType: 'S' }],
  BillingMode: 'PAY_PER_REQUEST',
};
const run = async function () {
  try {
    const results = await dbclient.send(new CreateTableCommand(command));
    console.log(results);
  } catch (err) {
    console.error(JSON.stringify(err));
  }
};
run();
- Run Docker:
$ docker compose up
- Execute database table creation file:
$ npx ts-node createTable.ts
- Check database table is created:
$ AWS_DEFAULT_REGION=eu-central-1 \
AWS_ACCESS_KEY_ID=MYACCESSKEY \
AWS_SECRET_ACCESS_KEY=MYSECRETKEY \
aws dynamodb list-tables --endpoint-url http://localhost:8000
// response
{
    "TableNames": [
        "MyTable"
    ]
}
Last Words
The rest you can find out yourself! 😎 Make sure to rest well before you continue! Adiós 👋