Go to RDS Console → Databases → Create database
Choose database creation method:
Engine options:
Templates:
Settings:
daivietblood-dbadminYourSecurePassword123!YourSecurePassword123!⚠️ Important: Save your password securely. You will need it to connect from Lambda.
Connectivity:
daivietblood-vpcdaivietblood-db-subnet-groupdaivietblood-rds-sgDatabase port:
Database options:
daivietbloodBackup:
Encryption:
Monitoring:
Maintenance:
Deletion protection:
Click Create database
ℹ️ RDS creation takes 10-15 minutes. Wait until status shows “Available”.
After RDS is available:
Go to RDS Console → Databases → Click daivietblood-db
In Connectivity & security tab, copy:
daivietblood-db.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com3306Save these values for Lambda configuration:
DB_HOST=daivietblood-db.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com
DB_PORT=3306
DB_NAME=daivietblood
DB_USER=admin
DB_PASSWORD=YourSecurePassword123!
Since RDS is in Private Subnet, you need to connect via a bastion host or use Lambda to initialize the schema.
Option A: Using Lambda to Initialize (Recommended)
Create a one-time Lambda function to initialize the database:
// init-db.js
const mysql = require('mysql2/promise');
exports.handler = async (event) => {
const connection = await mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
// Create tables
const createUsersTable = `
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name VARCHAR(255) NOT NULL,
blood_type ENUM('A+', 'A-', 'B+', 'B-', 'AB+', 'AB-', 'O+', 'O-') NOT NULL,
phone VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
`;
const createDonationsTable = `
CREATE TABLE IF NOT EXISTS donations (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
donation_date DATE NOT NULL,
location VARCHAR(255),
status ENUM('scheduled', 'completed', 'cancelled') DEFAULT 'scheduled',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
)
`;
const createEmergencyRequestsTable = `
CREATE TABLE IF NOT EXISTS emergency_requests (
id INT AUTO_INCREMENT PRIMARY KEY,
requester_name VARCHAR(255) NOT NULL,
blood_type ENUM('A+', 'A-', 'B+', 'B-', 'AB+', 'AB-', 'O+', 'O-') NOT NULL,
units_needed INT NOT NULL,
hospital VARCHAR(255) NOT NULL,
urgency ENUM('critical', 'urgent', 'normal') DEFAULT 'normal',
status ENUM('open', 'fulfilled', 'cancelled') DEFAULT 'open',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
`;
await connection.execute(createUsersTable);
await connection.execute(createDonationsTable);
await connection.execute(createEmergencyRequestsTable);
await connection.end();
return {
statusCode: 200,
body: JSON.stringify({ message: 'Database initialized successfully' })
};
};
daivietblood created| Issue | Solution |
|---|---|
| Cannot connect to RDS | Verify Security Group allows inbound from Lambda SG |
| RDS creation failed | Check Service Quotas for RDS instances |
| Connection timeout | Ensure Lambda is in same VPC and has NAT Gateway access |