This add-on integrates ElasticMQ into your DDEV project. ElasticMQ is an Amazon SQS-compatible in-memory message queue, perfect for local development and testing.
Features:
ddev add-on get stefpe/ddev-elasticmq
ddev restart
After installation, the following file is created in your .ddev directory:
.ddev/elasticmq.conf - Queue configuration fileMake sure to commit this file to version control.
| Command | Description |
|---|---|
ddev describe |
View service status for ElasticMQ |
ddev logs -s elasticmq |
Check ElasticMQ logs |
ddev exec curl http://elasticmq:9324/health |
Check ElasticMQ health |
ddev elasticmq |
Launch the ElasticMQ Web UI in your browser |
The add-on uses DDEV’s built-in router for HTTPS access, eliminating port conflicts between projects:
https://<project>.ddev.site:9326https://<project>.ddev.site:9327Launch the Web UI quickly with:
ddev elasticmq
const AWS = require('aws-sdk');
const sqs = new AWS.SQS({
endpoint: 'https://<project>.ddev.site:9326',
region: 'elasticmq',
accessKeyId: 'x',
secretAccessKey: 'x'
});
ElasticMQ supports configuring queues via a HOCON configuration file. After installing the add-on, you can define custom queues by editing the .ddev/elasticmq.conf file.
The configuration file uses HOCON format (Human-Optimized Config Object Notation). Here’s an example of defining a simple queue:
include classpath("application.conf")
queues {
my-queue {
fifo = false
defaultVisibilityTimeout = 30 seconds
}
}
You can configure queues with various options including dead letter queues, visibility timeouts, and tags:
include classpath("application.conf")
queues {
# Standard queue with custom settings
admin-integration-development-messenger-transport {
fifo = false
contentBasedDeduplication = false
defaultVisibilityTimeout = 15 seconds
delay = 0 seconds
receiveMessageWait = 0 seconds
}
# FIFO queue example
my-fifo-queue {
fifo = true
contentBasedDeduplication = true
defaultVisibilityTimeout = 60 seconds
}
# Queue with dead letter queue
main-queue {
defaultVisibilityTimeout = 30 seconds
deadLettersQueue {
name = "main-queue-dlq"
maxReceiveCount = 3
}
}
main-queue-dlq { }
}
| Option | Description | Default |
|---|---|---|
fifo |
Whether this is a FIFO queue | false |
contentBasedDeduplication |
Enable content-based deduplication | false |
defaultVisibilityTimeout |
Time before message becomes visible again | 30 seconds |
delay |
Default delay for messages | 0 seconds |
receiveMessageWait |
Long polling wait time | 0 seconds |
deadLettersQueue.name |
Name of the dead letter queue | - |
deadLettersQueue.maxReceiveCount |
Max receives before moving to DLQ | 1-1000 |
copyTo |
Copy all messages to another queue | - |
moveTo |
Move all messages to another queue | - |
tags |
Key-value tags for the queue | - |
After modifying .ddev/elasticmq.conf:
ddev restart
The queues will be created automatically when ElasticMQ starts.
Once configured, connect to ElasticMQ using any SQS-compatible client:
AWS CLI example:
aws --endpoint-url=https://<project>.ddev.site:9326 --no-verify-ssl sqs list-queues
AWS SDK (JavaScript) example:
const sqs = new AWS.SQS({
endpoint: 'https://<project>.ddev.site:9326',
region: 'elasticmq',
accessKeyId: 'x',
secretAccessKey: 'x'
});
The dynamic port binding through DDEV’s router means multiple projects can run ElasticMQ simultaneously without any port configuration. Each project gets its own isolated ElasticMQ instance accessible through project-specific URLs.
To use a different ElasticMQ image, set the environment variable in your .ddev/config.yaml:
web_environment:
- ELASTICMQ_DOCKER_IMAGE=softwaremill/elasticmq-native:latest
Note: The native image is smaller (~30MB vs ~240MB) and starts faster, but some logging features may not work.
To persist queue metadata across restarts, enable queues-storage in your .ddev/elasticmq.conf:
queues-storage {
enabled = true
path = "/mnt/ddev_config/elasticmq-queues.conf"
}
To persist messages to a database (H2), enable messages-storage:
messages-storage {
enabled = true
uri = "jdbc:h2:/mnt/ddev_config/elasticmq.db"
}
Make sure to add the storage files to your .gitignore if you don’t want to commit them.
Contributed and maintained by @stefpe