最近把資料庫搬家到雲端,上了 AWS 的 RDS (Amazon Relational Database Service) 的過程覺得滿無痛,趁閒來無事整理一下筆記。
什麼是 Amazon RDS?
Amazon Relational Database Service (Amazon RDS) 讓使用者能夠在雲端中輕鬆設定、操作和擴展關聯式資料庫。它提供經濟實惠且可調整大小的容量,且可自動處理硬體佈建、資料庫設定、修補程式和備份等耗時的管理任務。這讓您有更多時間專注在應用程式,以提供其所需的快速效能、高可用性、安全性和相容性。
定價方面跟 EC2 類似按地區、流量等調整,可以參考官網說明。
有誰在用 Amazon RDS?
Airbnb, Netflix, Unilever, Expedia… 等等大公司都在用呢,想看使用 MySQL 的企業案例可以參考 Amazon RDS for MySQL customers。
RDS 支援的資料庫引擎
怎麼把資料庫從 localhost 搬到 RDS?
以下是同學教我把 localhost 的 MySQL 資料庫搬移到 Amazon RDS 的過程筆記。
1. 開啟 Amazon RDS 服務
登入 AWS 找到 RDS,按 Create Database,選擇你的資料庫引擎跟版本(我選 MySQL 8.0.16,因為它最接近我 localhost MySQL 的版本)。
輸入 identifier(之後在 RDS 上查看資料庫用的)跟 credentials。
- 注意!沒動預設的話,你是 admin(不是 root 或是其他名字),之後登入需要。
其他就照著預設,直到我們來到 connectivity 區塊。
建立一個包含 EC2 和 RDS 的 VPC。
因為您的資料庫執行個體只需要供您的 web 伺服器使用,而不需要供公有網際網路使用,所以您可以建立一個同時包含公有和私有子網路的 VPC。Web 伺服器是在公有子網路中託管,以便它可以到達公有網際網路。資料庫執行個體是在私有子網路中託管。系統會在相同的 VPC 內託管 web 伺服器,因此其能夠連接至資料庫執行個體。然而,為了提供更高的安全性,公有網際網路將無法使用資料庫執行個體。
VPC 是啥?讓我們看看官網解釋:
Choose the Virtual Private Cloud (VPC) that defines the virtual networking environment for this DB instance. Only VPCs with a corresponding DB Subnet Group are listed.
Database port 預設是 3306。
確認完所有資訊,按下 Create database,等它 Status 變成 Available 就能使用了。
結束後進入 DB identifier,就能查看 RDS 細節。
2. 搬移資料庫到 Amazon RDS
用 mysqldump 先在 localhost 把資料庫的內容備份:
mysqldump -h localhost -u root -p project_db > mysqldump.sql
再到執行 RDS 的伺服器上復原該資料庫:
- 執行 RDS 的伺服器可以是 localhost 或 EC2 instance(得先透過 SSH / Putty 登入)等
- endpoint 範例:project_name.cydijqyyvvby.us-east-1.rds.amazonaws.com
- 注意:這邊 user = admin
mysql -h endpoint -u admin -p project_db < mysqldump.sql
在執行 RDS 的伺服器上使用 RDS:
mysql -h endpoint -u admin -p
3. 使用及管理 RDS
基本上就跟直接使用 MySQL 一模一樣。
有在 EC2 用 git clone / git pull 拉下專案程式碼,裡面有 gitignore .env 等檔案忽略密碼資訊的話,記得連接後要在 EC2 上新增回去一個 .env 檔案,輸入 configuration 細節:
touch .env
.env 舉例:
MYSQL_HOST = project_name.cydijqyyvvby.us-east-1.rds.amazonaws.com
MYSQL_USER = admin
MYSQL_PASSWORD = password
MYSQL_DATABASE = project_db
util/mysql.js 資料庫設定程式碼:我是用 Connection Pool (createPool),如果不需要 pool 快取連接的話,也可直接 createConnection。
// MySQL Initialization
const mysql = require("mysql");
const util = require('util');// Encrypted data
require('dotenv').config();// Use pool to reuse connections
const pool = mysql.createPool({
connectionLimit: 10, // default 10
host: process.env.MYSQL_HOST,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DATABASE
});pool.getConnection(function(err, connection) {
if (err) throw err; // not connected!
console.log(`MySQL pool connected at ${process.env.MYSQL_HOST}!`);
});// Use util to promisify callback functions automatically
module.exports = {
query: util.promisify(pool.query).bind(pool)
};
4. 在 MySQL Workbench 上使用 RDS 的資料庫
喜歡使用圖形化介面的人當然也可以把 RDS 連上 GUI MySQL workbench。
設定的時候記得還是用開啟 RDS 時註冊的使用者名稱 admin(或是你修改預設的其他名字)跟密碼登入。