Posted on 16 August 2021
This article is intended for use with the baopham/laravel-dynamodb package, however, this can be adapted for any other package providing integration with DynamoDB. Just remember the core concept as this will most likely remain the same: DynamoDB local.
If you're building functionality in to your Laravel app that uses DynamoDB, it can be a cumbersome process to get a DynamoDB instance set up locally. Luckily, Laravel Sail is highly customisable and exposes a docker-compose.yml in the project root for you to make your own.
First, if your Sail environment is running, stop it by running: ./vendor/bin/sail down.
You're going to want to open the docker-compose.yml generated by Laravel Sail and add a new service to the services object array called dynamodb:
dynamodb:
command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
image: amazon/dynamodb-local:latest
working_dir: /home/dynamodblocal
volumes:
- './volumes/dynamodb:/home/dynamodblocal/data'
environment:
AWS_ACCESS_KEY_ID: dynamodb_local
AWS_SECRET_ACCESS_KEY: secret
AWS_REGION: stub
ports:
- "8042:8000"
networks:
- sail
You're also going to want to update the laravel.test service to depend on your shiny new dynamodb service. Update the depends_on to include dynamodb - this should look similar to the following:
depends_on:
- mysql
- redis
- dynamodb
This will ensure your dynamodb service will start before the service running your Laravel app.
A full example of the docker-compose.yml is available as a Gist on GitHub. Please note that the contents of the docker-compose.yml found in the Gist may be out of date by the time you read this as the Sail's docker-compose is of course subject to change.
Next up is configuring the baopham/laravel-dynamodb package to use the DynamoDB local instance you just set up.
Open your .env found in the project root and set the value of DYNAMODB_CONNECTION to local - if this doesn't exist in your config, create it:
DYNAMODB_CONNECTION=local
Inside the same .env, also set the value of DYNAMODB_LOCAL_ENDPOINT to http://dynamodb:8000:
DYNAMODB_LOCAL_ENDPOINT=http://dynamodb:8000
That's it! You've set up Laravel Sail with an instance of DynamoDB Local and configured baopham/laravel-dynamodb to use it. This is super useful if you're needing to write tests to assert functionality with DynamoDB is working correctly.