Version 1.0.0 - ami-0166bfe4e72e26222
Database Stack AMI
MongoDB + InfluxDB + MySQL - A plug-and-play multi-database stack for AWS EC2 with persistent EBS storage.
Overview
This AMI provides a production-ready database stack with three popular databases:
| Database | Version | Port | Use Case |
|---|---|---|---|
| MongoDB | 7.x | 27017 | Document/NoSQL database |
| InfluxDB | 2.x | 8086 | Time-series database |
| MySQL | 8.x | 3306 | Relational database |
Requirements
Instance Sizing
| Workload | Instance Type | vCPU | RAM | Notes |
|---|---|---|---|---|
| Development | t3.small | 2 | 2 GB | Light testing |
| Small Production | t3.medium | 2 | 4 GB | Recommended minimum |
| Medium Production | t3.large | 2 | 8 GB | Better performance |
| Large Production | t3.xlarge+ | 4+ | 16+ GB | Heavy workloads |
Storage
- Minimum EBS: 20 GB (gp3)
- Recommended: 50-100 GB+ depending on data volume
- Type: gp3 for best price/performance
Network (Security Group)
| Port | Protocol | Source | Description |
|---|---|---|---|
| 22 | TCP | Your IP | SSH access |
| 27017 | TCP | Your App/VPC | MongoDB |
| 8086 | TCP | Your App/VPC | InfluxDB |
| 3306 | TCP | Your App/VPC | MySQL |
⚠️ Security Note: Never expose database ports (27017, 8086, 3306) to 0.0.0.0/0 in production!
BuildingGetting the AMIStarted
1. Launch Base Instance
#
- Launch
Ubuntuan 24.04EC2 instance (from this AMI
- Recommended: t3.medium
recommended)or #larger
- Configure security group with required ports
2. Attach EBS Volume
- Create a
secondarygp3 EBS volume for(20 testingGB
2. Upload Scripts
# From your local machine
scp -i your-key.pem setup-dbstack.sh configure-dbstack.sh cleanup-for-ami.sh \
first-boot.sh dbstack-firstboot.service dbstack-cli \
ubuntu@<instance-ip>:/tmp/
3. Run Setup
# On the instance
sudo bash /tmp/setup-dbstack.sh
4. Test Configuration (Optional)
# Attach an EBS volume first, then:
sudo /opt/dbstack/configure-dbstack.sh
# Verify everything works
dbstack-cli status
# Test connections
docker exec dbstack-mongodb mongosh --eval "db.runCommand({ ping: 1 })"
docker exec dbstack-mysql mysql -u root -p -e "SELECT VERSION();"
5. Clean Up for AMI
sudo /opt/dbstack/cleanup-for-ami.sh
6. Create AMI
Stop the instance (do not terminate)minimum)AWSImportant:ConsoleSame→AvailabilityEC2Zone→asInstances → Selectyour instanceActionsAttach→toImageyour instance as/dev/sdfName:dbstack-mongodb-influxdb-mysql-v1.0Wait for AMI to be available
3. Configure Databases
SSH into your instance and templates → Create image
Customer Usage
Option 1: Interactive Setup
Launch Instancefrom the AMIAttach EBS Volume(20 GB+ recommended)SSH and Configure:
sudo /opt/dbstack/configure-dbstack.sh
FollowRootthe prompts to set passwordsusername andconfigure databasespassword
The wizard will prompt you for:
MongoDB:
Optiondatabase 2:name
Launch with this JSON user-data for fully automated configuration:
{
"mongodb": {
"root_user": "admin",
"root_password": "YourSecurePassword123!",
"database": "myapp",
"app_user": "appuser",
"app_password": "AppUserPassword456!"
},
"influxdb": {
"org": "mycompany",
"bucket": "metrics",
"user": "admin",
"password": "InfluxPassword789!"
},
"mysql": {
"root_password": "MySQLRootPass321!",
"database": "myapp",
"user": "appuser",
"password": "MySQLUserPass654!"
},
"host": "your-domain.com"
}
NoteInfluxDB::
- Organization name
- Bucket name
- Admin credentials
MySQL:
- Root password
- Application
aredatabaserequired.name - Application
userhostfieldcredentials
CloudFormation4. TemplateVerify Installation
AWSTemplateFormatVersion:dbstack-cli '2010-09-09'
Description: Database Stack Deployment
Parameters:
InstanceType:
Type: String
Default: t3.medium
KeyName:
Type: AWS::EC2::KeyPair::KeyName
VolumeSize:
Type: Number
Default: 50
MongoRootPassword:
Type: String
NoEcho: true
MongoAppPassword:
Type: String
NoEcho: true
InfluxPassword:
Type: String
NoEcho: true
MySQLRootPassword:
Type: String
NoEcho: true
MySQLAppPassword:
Type: String
NoEcho: true
Resources:
DBStackInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-xxxxxxxxx # Your AMI ID
InstanceType: !Ref InstanceType
KeyName: !Ref KeyName
SecurityGroups:
- !Ref DBStackSecurityGroup
UserData:
Fn::Base64: !Sub |
{
"mongodb": {
"root_user": "admin",
"root_password": "${MongoRootPassword}",
"database": "myapp",
"app_user": "appuser",
"app_password": "${MongoAppPassword}"
},
"influxdb": {
"org": "myorg",
"bucket": "metrics",
"user": "admin",
"password": "${InfluxPassword}"
},
"mysql": {
"root_password": "${MySQLRootPassword}",
"database": "myapp",
"user": "appuser",
"password": "${MySQLAppPassword}"
}
}
DataVolume:
Type: AWS::EC2::Volume
Properties:
AvailabilityZone: !GetAtt DBStackInstance.AvailabilityZone
Size: !Ref VolumeSize
VolumeType: gp3
Tags:
- Key: Name
Value: dbstack-data
DataVolumeAttachment:
Type: AWS::EC2::VolumeAttachment
Properties:
Device: /dev/xvdf
InstanceId: !Ref DBStackInstance
VolumeId: !Ref DataVolume
DBStackSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Database Stack Security Group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 27017
ToPort: 27017
CidrIp: 10.0.0.0/8 # VPC only
- IpProtocol: tcp
FromPort: 8086
ToPort: 8086
CidrIp: 10.0.0.0/8
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: 10.0.0.0/8
Outputs:
InstanceIP:
Value: !GetAtt DBStackInstance.PublicIp
MongoDBURI:
Value: !Sub mongodb://${DBStackInstance.PublicIp}:27017
InfluxDBURL:
Value: !Sub http://${DBStackInstance.PublicIp}:8086
MySQLHost:
Value: !Sub ${DBStackInstance.PublicIp}:3306status
Management Commands
# Service management
dbstack-cli status # Show status of all databases
dbstack-cli start # Start all services
dbstack-cli stop # Stop all services
dbstack-cli restart # Restart all services
# Logs
dbstack-cli logs # All container logs
dbstack-cli logs mongodb # MongoDB logs only
dbstack-cli logs influxdb # InfluxDB logs only
dbstack-cli logs mysql # MySQL logs only
# Configuration
dbstack-cli info # Show configuration info
sudo dbstack-cli credentials # Show passwords and connection strings
# Maintenance
dbstack-cli update # Pull latest images and restart
sudo dbstack-cli backup # Backup all databases
sudo dbstack-cli restore # Restore from backup
# Database shells
dbstack-cli mongo-shell # MongoDB shell
dbstack-cli mysql-shell # MySQL shell
dbstack-cli influx-shell # InfluxDB CLI
Connection Examples
MongoDB
# Python (pymongo)
from pymongo import MongoClient
# Using root credentials
client = MongoClient("mongodb://admin:password@your-ip:27017")
# Using app credentials
client = MongoClient("mongodb://appuser:password@your-ip:27017/mydb")
db = client.mydb
// Node.js
const { MongoClient } = require('mongodb');
const client = new MongoClient('mongodb://appuser:password@your-ip:27017/mydb');
InfluxDB
# Python (influxdb-client)
from influxdb_client import InfluxDBClient
client = InfluxDBClient(
url="http://your-ip:8086",
token="your-api-token",
org="myorg"
)
# CLI
influx write -b mybucket -o myorg -t your-token \
'temperature,location=office value=72.5'
MySQL
# Python (mysql-connector)
import mysql.connector
conn = mysql.connector.connect(
host="your-ip",
port=3306,
user="appuser",
password="password",
database="mydb"
)
# CLI
mysql -h your-ip -P 3306 -u appuser -p mydb
Backup & Recovery
Manual Backup
# Create backup of all databases
sudo dbstack-cli backup
# Backups stored in: /mnt/dbstack-data/backups/
EBS Snapshots (Recommended)
For production, use EBS snapshots for point-in-time recovery:
# Stop services before snapshot for consistency
dbstack-cli stop
# Create snapshot via AWS Console or CLI
aws ec2 create-snapshot --volume-id vol-xxxxx --description "dbstack-backup-$(date +%Y%m%d)"
# Start services
dbstack-cli start
Restore from Backup
sudo dbstack-cli restore
# Follow prompts to select backup timestamp
Architecture
┌─────────────────────────────────────────────────────┐
│ EC2 Instance │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Docker Network │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────────┐ │ │
│ │ │ MongoDB │ │ InfluxDB │ │ MySQL │ │ │
│ │ │ :27017 │ │ :8086 │ │ :3306 │ │ │
│ │ └─────┬─────┘ └─────┬─────┘ └───────┬───────┘ │ │
│ └────────┼─────────────┼───────────────┼──────────┘ │
│ │ │ │ │
│ └─────────────┼───────────────┘ │
│ │ │
│ ┌──────────────────────┼──────────────────────────┐ │
│ │ /mnt/dbstack-data (EBS Volume) │ │
│ │ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ mongodb │ │ influxdb │ │ mysql │ │ │
│ │ └─────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
Troubleshooting
Service Won't Start
# Check Docker status
systemctl status docker
# Check container logs
docker logs dbstack-mongodb
docker logs dbstack-influxdb
docker logs dbstack-mysql
# Check EBS mount
df -h /mnt/dbstack-data
Connection Refused
- Check security group allows the port
- Verify UFW rules:
sudo ufw status - Check service is running:
dbstack-cli status
Out of Disk Space
# Check disk usage
dbstack-cli status
# Extend EBS volume in AWS Console, then:
sudo growpart /dev/xvdf 1
sudo resize2fs /dev/xvdf
Reset Everything
# Complete reset (DESTROYS ALL DATA)
sudo /opt/dbstack/cleanup-for-ami.configure-dbstack.sh
# ThenSelect reconfigure:"yes" sudowhen asked to reconfigure
Data Locations
| Path | Description |
|---|---|
/mnt/dbstack-data/mongodb |
MongoDB data files |
/mnt/dbstack-data/influxdb |
InfluxDB data and config |
/mnt/dbstack-data/mysql |
MySQL data files |
/mnt/dbstack-data/backups |
Backup files |
/opt/dbstack/ |
Saved credentials |
/opt/dbstack/config-info.txt |
Configuration summary |
Security Recommendations
- Use VPC: Keep databases in private subnet
- Security Groups: Restrict ports to application servers only
- Strong Passwords: Use 16+ character passwords
- Enable Encryption: Use encrypted EBS volumes
- Regular Backups: Automate EBS snapshots
- Update Regularly:
dbstack-cli updatefor security patches
Support
Logs:/var/log/dbstack-firstboot.log- Credentials:
sudo cat /opt/dbstack/.credentials - Configuration:
cat /opt/dbstack/config-info.txt - Logs:
dbstack-cli logs
Version History
- 1.0.0: Initial release with MongoDB 7, InfluxDB 2, MySQL 8
Built for AWS Marketplace | Ubuntu 24.04 | Docker-based