How to Setting up DynamoDB Locally
AWS DynamoDB is a document database that provides single-digit millisecond performance, it is a serverless database, which means you can focus on use applications to access the DynamoDB and AWS will manage the server for you. It's also available in multiple AWS regions and has built-in Cache DAX.
Another good reason to use DynamoDB is the free tier provided by DynamoDB. up to 25 GB storage, 25 write capacity units, and 25 read capacity units are free. Compare to MongoDB, depend on the MongoDB cloud provider it might be 500MB storage if you try to look for a free tier.
Now, in this blog I'll show how to set up DynamoDB locally, also show a few simple codes to access local DynamoDB.
Download DynamoDB
Go to this link from AWS to download DynamoDB, the different region has different DynamoDB file, so choose the region you'll be using for DynamoDB. After unzipping the file, run the following command.
JRE
To start Dynamodb locally you'll need at least JRE version 8. You can use the following link as a reference to download JRE if you don't have it already.
Start DynamoDB
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
If you see the following means your DynamoDB is able to run at your local with port 8000.
Initializing DynamoDB Local with the following configuration:
Port: 8000
InMemory: false
DbPath: null
SharedDb: true
shouldDelayTransientStatuses: false
CorsParams: *
After download, the Dynamodb file to your local OS, cd to the folder, and run the following then it should start DynamoDB on your local. DynamoDB has a few ways to store the database file on your local, these are -sharedDb, -inMemory and -dbPath. Let's see what are the difference between these three.
Omit database file option
If you omit any option, Dynamodb will store the database file with your AWS access key id with the region. For instance, you should see a DB file format as this {your AWS access key ID}_{region}.db when running the following command. So this file will change if you use a different AWS user by run the aws configure
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar
Use -sharedDb, will create a Dynamodb file shared-local-instance.db when starting the Dynamodb.
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
Now, there's another way to save Dynamodb file locally by use
-dbPath {path} . For example, you have the following command,
-dbPath test2
, assume test2
is a folder, first make
sure the folder exists, then when you run the following command you'll see the
shared-local-instance.db file at the
test2
folder.
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -dbPath test2
Use -inMemory, as the name show it will save the database file on the OS' memory but will destroy once stop the Dynamodb on your local.
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -inMemory
So which is better? that'll depend on what your use for DynamoDB on your local, if you just want to test something quick you don't care where it store, then you can omit the file option or use -inMemory by destroying the file once you have done your task. Or you can use -dbPath to create a file path. e.g. dev or dev2 to store different DynamoDB files for a different environment.
DynamoDB port Option
By default, DynamoDB uses port 8000, but you can also change the port by using the following command. If for some reason you need to set up a different Dynamodb file with a different Dynamodb port, you can use -dbPath with -port, cause you might have huge data to test on local before a move to the AWS DynamoDB service.
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb -port 8001
Furthermore, type help to get all the command options
java -Djava.library.path=./DynamoDBLocal_b -jar DynamoDBLocal.jar -help
This is the output when running the -help option
usage: java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar
[-port ] [-inMemory] [-delayTransientStatuses]
[-dbPath ][-sharedDb] [-cors ]
-cors Enable CORS support for javascript against a
specific allow-list list the domains separated
by , use '*' for public access (default is
'*')
-dbPath Specify the location of your database file.
Default is the current directory.
-delayTransientStatuses When specified, DynamoDB Local will introduce
delays to hold various transient table and
index statuses so that it simulates actual
service more closely. Currently works only for
CREATING and DELETING online index statuses.
-help Display DynamoDB Local usage and options.
-inMemory When specified, DynamoDB Local will run in
memory.
-optimizeDbBeforeStartup Optimize the underlying backing store database
tables before starting up the server
-port Specify a port number. Default is 8000
-sharedDb When specified, DynamoDB Local will use a
single database instead of separate databases
for each credential and region. As a result,
all clients will interact with the same set of
tables, regardless of their region and
credential configuration. (Useful for
interacting with Local through the JS Shell in
addition to other SDKs)
Run DynamoDB command in background
You can also run your DynamoDB command in background by append
$ as follow. After this command, you type
ctrl + c
, you close the command but the DynamoDB will still run
the background.
java -Djava.library.path=./DynamoDBLocal_lib -jar DynoDBLocal.jar &
If you wish to switch to the foreground of the DynamoDB command, add
fg to the DynamoDB start command. That will bring the to the
foreground, then you can do ctrl + c
to actual close if you wish
to stop the DynamoDB on your local.
fg java -Djava.library.path=./DynamoDBLocal_lib -jar DynoDBLocal.jar
Use AWS CLI
Once the DynamoDB is ready, you can access DynamoDB via AWS CLI. You can try
the list table, query, or update the table. However, before that, you will
need to run aws configure
to connect from your local OS to AWS
service.
Create a User at AWS console and make sure the user can access the DynamoDB
There are many ways to achieve this and one way you can do is, create a group that has access to DynamoDB, then create a new user and assign the group to this user.
Once you run the following command at your command-line tool, type the user's AWS access key ID and secret access key, then from your local OS will use that user's credential to access to AWS service.
aws configure
Access to local DynamoDB
Now, you should be able to access local DynamoDB from AWS CLI, let's try the following command which will try to list all the tables.
aws dynamodb list-tables --endpoint-url http://localhost:8000
If you see the following output, means you are able to access your local DynamoDB now.
{
"TableNames": []
}
Let's try more, create a table for local Dynamodb.
aws dynamodb create-table \
--table-name User \
--endpoint-url \
http://localhost:8000 \
--attribute-definitions \
AttributeName=Name,AttributeType=S \
AttributeName=Job,AttributeType=S \
--key-schema \
AttributeName=Name,KeyType=HASH \
AttributeName=Job,KeyType=RANGE \
--provisioned-throughput \
ReadCapacityUnits=5,WriteCapacityUnits=5
Now, if we run list-tables
again, should see the output contains
the table we just add.
{
"TableNames": [
"User"
]
}