Skip to main content

Version 1.0.0 - ami-0166bfe4e72e26222

#

Database Stack AMI

**

MongoDB + InfluxDB + MySQL**MySQL - A plug-and-play multi-database stack for AWS EC2 with persistent EBS storage.

##

Overview

Overview

This AMI provides a production-ready database stack with three popular databases:

| |Version| Port | ||----------|---------|------|----------||**MongoDB**||27017 | ||**InfluxDB**| |8086 | ||**MySQL**| |3306 | |
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

All databases share a single EBS volume for persistent storage, making it easy to backup, snapshot, and manage your data.

##

Requirements

Requirements ###

Instance Sizing

| | |vCPU|RAM|Notes||----------|--------------|------|-----|-------|| Development | |2 | | ||| |2 | | ||| |2 | | ||| |4+ | | |###
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**EBS: 20 GB (gp3)
  • - **Recommended**
  • Recommended: 50-100 GB+ depending on data volume
  • - **Type**
  • Type: gp3 for best price/performance
  • ###

Network (Security Group)

| |Protocol|Source|Description||------|----------|--------|-------------||22 | TCP | | |||TCP | |MongoDB||8086| TCP | |InfluxDB||3306| TCP | |MySQL|
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**Note: Never expose database ports (27017, 8086, 3306) to 0.0.0.0/0 in production!

##

Building the AMI

###

1. Launch Base Instance

```bash
# Launch Ubuntu 24.04 instance (t3.medium recommended)
# Attach a secondary EBS volume for testing
```
###

2. Upload Scripts

```bash
# 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@:ubuntu@<instance-ip>:/tmp/
```
###

3. Run Setup

```bash
# On the instance
sudo bash /tmp/setup-dbstack.sh
```
###

4. Test Configuration (Optional)

```bash
# 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

```bash
sudo /opt/dbstack/cleanup-for-ami.sh
```
###

6. Create AMI

1.
  1. Stop the instance (do not terminate)
  2. 2.
  3. AWS Console → EC2 → Instances → Select instance
  4. 3.
  5. Actions → Image and templates → Create image
  6. 4.
  7. Name: `dbstack-mongodb-influxdb-mysql-v1.0`0
  8. 5.
  9. Wait for AMI to be available
  10. ##

Customer Usage

###

Option 1: Interactive Setup

1.
    **
  1. Launch Instance**Instance from the AMI
  2. 2. **
  3. Attach EBS Volume**Volume (20 GB+ recommended)
  4. 3. **
  5. SSH and Configure**Configure:
  6. ```bash
sudo /opt/dbstack/configure-dbstack.sh
```
4.
  1. Follow the prompts to set passwords and configure databases
  2. ###

Option 2: Automated Setup (User-Data)

Launch with this JSON user-data for fully automated configuration:

```json
{
  "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"
}
```
**Note**

Note: All password fields are required. The `host`host field is optional (defaults to public IP).

###

CloudFormation Template

```yaml
AWSTemplateFormatVersion: '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}:3306
```
##

Management Commands

```bash
# 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

MongoDB ```python
# 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
```
```javascript
// Node.js
const { MongoClient } = require('mongodb');
const client = new MongoClient('mongodb://appuser:password@your-ip:27017/mydb');
```
###

InfluxDB

InfluxDB ```python
# Python (influxdb-client)
from influxdb_client import InfluxDBClient

client = InfluxDBClient(
    url="http://your-ip:8086",
    token="your-api-token",
    org="myorg"
)
```
```bash
# CLI
influx write -b mybucket -o myorg -t your-token \
  'temperature,location=office value=72.5'
```
###

MySQL

MySQL ```python
# Python (mysql-connector)
import mysql.connector

conn = mysql.connector.connect(
    host="your-ip",
    port=3306,
    user="appuser",
    password="password",
    database="mydb"
)
```
```bash
# CLI
mysql -h your-ip -P 3306 -u appuser -p mydb
```
##

Backup & Recovery

###

Manual Backup

```bash
# 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:

```bash
# 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

```bash
sudo dbstack-cli restore
# Follow prompts to select backup timestamp
```
##

Architecture

Architecture ```
┌─────────────────────────────────────────────────────┐
│                    EC2 Instance                      │
│  ┌─────────────────────────────────────────────────┐ │
│  │                  Docker Network                  │ │
│  │  ┌───────────┐ ┌───────────┐ ┌───────────────┐  │ │
│  │  │  MongoDB  │ │ InfluxDB  │ │     MySQL     │  │ │
│  │  │   :27017  │ │   :8086   │ │     :3306     │  │ │
│  │  └─────┬─────┘ └─────┬─────┘ └───────┬───────┘  │ │
│  └────────┼─────────────┼───────────────┼──────────┘ │
│           │             │               │            │
│           └─────────────┼───────────────┘            │
│                         │                            │
│  ┌──────────────────────┼──────────────────────────┐ │
│  │     /mnt/dbstack-data (EBS Volume)              │ │
│  │  ┌─────────┐ ┌─────────────┐ ┌─────────────┐    │ │
│  │  │ mongodb │ │  influxdb   │ │    mysql    │    │ │
│  │  └─────────┘ └─────────────┘ └─────────────┘    │ │
│  └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
```
##

Troubleshooting

Troubleshooting ###

Service Won't Start

```bash
# 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

1.
  1. Check security group allows the port
  2. 2.
  3. Verify UFW rules: `sudo ufw status`status
  4. 3.
  5. Check service is running: `dbstack-cli status`status
  6. ###

Out of Disk Space

```bash
# Check disk usage
dbstack-cli status

# Extend EBS volume in AWS Console, then:
sudo growpart /dev/xvdf 1
sudo resize2fs /dev/xvdf
```
###

Reset Everything

```bash
# Complete reset (DESTROYS ALL DATA)
sudo /opt/dbstack/cleanup-for-ami.sh
# Then reconfigure:
sudo /opt/dbstack/configure-dbstack.sh
```
##

Security Recommendations

1.
    **
  1. Use VPC**VPC: Keep databases in private subnet
  2. 2. **
  3. Security Groups**Groups: Restrict ports to application servers only
  4. 3. **
  5. Strong Passwords**Passwords: Use 16+ character passwords
  6. 4. **
  7. Enable Encryption**Encryption: Use encrypted EBS volumes
  8. 5. **
  9. Regular Backups**Backups: Automate EBS snapshots
  10. 6. **
  11. Update Regularly**Regularly: `dbstack-cli update`update for security patches
  12. ##

Support

-
    **Logs**
  • Logs: `/var/log/dbstack-firstboot.log`log
  • - **Credentials**
  • Credentials: `sudo cat /opt/dbstack/.credentials`credentials
  • - **Configuration**
  • Configuration: `/opt/dbstack/config-info.txt`txt
  • ##

Version History

-
    **
  • 1.0.0**0: Initial release with MongoDB 7, InfluxDB 2, MySQL 8
  • ---
**

Built for AWS Marketplace**Marketplace | Ubuntu 24.04 | Docker-based