ローカル環境からAmazon RDS(MySQL)にアクセスしてみた
注意:RDS MySQLのインスタンスはDBサーバーであって、デフォルトのシステムDB(mysql, information_schema, performance_schema, sys)は入っていますが、編集してはいけません。はテスト用のDBは別途作成する必要があります。
実行環境
- AWSアカウント + AWS CLI
- MacOS Sequoia 15.6.1
- Node.js: v22.11.0
- npm: v10.9.0
手順
最初のセットアップから最後アクセス成功までの手順は下記となります。
- ネットワーク設定
- RDS(MySQL)をセットアップ
- ローカルスクリプトを準備(
package.json
、.env
、setup-with-db.js
、test.js
) - スクリプト実行
ネットワーク設定
RDSに付与するVPC関連(Route Table/Security Group/Internet Gateway/Network ACL)はローカルマシンのIP、もしくは 0.0.0.0/0
やallow all
で、ローカルマシンからのアクセスを許容するように設定します。
自分のテスト環境のネットワーク設定イメージです。
Local Machine
↓
Internet
↓
Internet Gateway (igw-04717792f3af330b0)
↓
Route Table (rtb-0ce1de65a18956dda)
↓
Network ACL (acl-0d62a0a0c3404cb65) - Allow all
↓
Subnet (subnet-061e0eb74d5edb959 or subnet-0ce61331a170e1e13)
↓
Security Group (sg-0c8489cbc0bae27fe) - Allow all
↓
RDS Instance (rds-mysql) on port 3306
RDS(MySQL)をセットアップ
- Amazon RDBコンソール画面に入って、
Create database
を押す - Engine Typeに
MySQL
を選ぶ - 簡単な設定を行う:DB instance size
Free tier
、DB instance identifierrds-mysql
、Master usernameadmin
、Credentials managementSelf managed
、Master password/Confirm master password は自由に - 最後までRDS Instanceを作成できて、statusが
Available
になったら、詳細画面に入ると、Modify
で追加設定を行う - Connectivity部分のAdditional configurationを開いて、
Public accessible
を選択し、次の画面い進む - Schedule modificationsに
Apply immediately
を選択し、Modify DB instance
で変更完了にする
ローカルスクリプトを準備
package.json
{
"name": "aws-rds-test",
"version": "1.0.0",
"type": "module",
"scripts": {
"setup": "node setup.js",
"test": "node test.js"
},
"dependencies": {
"dotenv": "^17.2.2",
"mysql2": "^3.0.0"
}
}
.env
RDS_HOSTNAME=xxx.xxxxx.ap-northeast-1.rds.amazonaws.com
RDS_USERNAME=admin
RDS_PASSWORD=yyyyyyy
RDS_DB_NAME=testrds
RDS_PORT=3306
setup-with-db.js
import dotenv from 'dotenv';
import mysql from 'mysql2/promise';
// Load .env file
dotenv.config();
// Configuration - connect without database first
const connectionConfig = {
host: process.env.RDS_HOSTNAME,
user: process.env.RDS_USERNAME,
password: process.env.RDS_PASSWORD,
// No database specified - connect to server
port: process.env.RDS_PORT || 3306,
ssl: 'Amazon RDS'
};
// Create database and table
async function setupDatabase() {
const connection = await mysql.createConnection(connectionConfig);
// Create database
await connection.execute('CREATE DATABASE IF NOT EXISTS testrds');
console.log('✅ Database "testrds" created successfully');
// Close connection and reconnect to the new database
await connection.end();
const dbConnection = await mysql.createConnection({
...connectionConfig,
database: 'testrds'
});
// Create users table
const sql = `
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
`;
await dbConnection.execute(sql);
console.log('✅ Users table created successfully');
await dbConnection.end();
}
// Run setup
setupDatabase();
test.js
import dotenv from 'dotenv';
import mysql from 'mysql2/promise';
// Load .env file
dotenv.config();
// Configuration
const connectionConfig = {
host: process.env.RDS_HOSTNAME,
user: process.env.RDS_USERNAME,
password: process.env.RDS_PASSWORD,
database: process.env.RDS_DB_NAME,
port: process.env.RDS_PORT || 3306,
ssl: 'Amazon RDS'
};
// Write user record
async function writeUser(name, email) {
const connection = await mysql.createConnection(connectionConfig);
const [result] = await connection.execute(
'INSERT INTO users (name, email) VALUES (?, ?)',
[name, email]
);
console.log(`✅ User created: ${name} (${email})`);
await connection.end();
return result;
}
// Read user records
async function readUsers() {
const connection = await mysql.createConnection(connectionConfig);
const [rows] = await connection.execute(
'SELECT id, name, email, created_at FROM users ORDER BY id DESC LIMIT 10'
);
console.log('📖 Users in database:');
if (rows.length > 0) {
rows.forEach(row => {
console.log(` ID: ${row.id}, Name: ${row.name}, Email: ${row.email}, Created: ${row.created_at}`);
});
} else {
console.log(' No users found');
}
await connection.end();
return rows;
}
// Run tests
async function runTests() {
await writeUser('John Doe', 'john@example.com');
await readUsers();
}
runTests();
スクリプトを実行
以下の順番にコマンド・スクリプトを実行します。
npm install
node setup-with-db.js
node test.js
node setup-with-db.js
実行結果(testrdb
というDBとusers
テーブルの作成):
✅ Database "testrdb" created successfully
✅ Users table created successfully
node test.js
実行結果(John Doe
ユーザーデータの追加とユーザーデータ一覧の取得):
✅ User created: John Doe (john@example.com)
📖 Users in database:
ID: 1, Name: John Doe, Email: john@example.com, Created: Tue Sep 30 2025 11:41:38 GMT+0900 (Japan Standard Time)
これで、ローカルマシンから RDS(MySQL) にアクセス成功になりました。
以上。