Amazon RDS 讓關連式資料庫上雲端

Wenchin
8 min readFeb 14, 2020

--

最近把資料庫搬家到雲端,上了 AWS 的 RDS (Amazon Relational Database Service) 的過程覺得滿無痛,趁閒來無事整理一下筆記。

Photo by fabio on Unsplash

什麼是 Amazon RDS?

Amazon Relational Database Service (Amazon RDS) 讓使用者能夠在雲端中輕鬆設定、操作和擴展關聯式資料庫。它提供經濟實惠且可調整大小的容量,且可自動處理硬體佈建、資料庫設定、修補程式和備份等耗時的管理任務。這讓您有更多時間專注在應用程式,以提供其所需的快速效能、高可用性、安全性和相容性。

定價方面跟 EC2 類似按地區、流量等調整,可以參考官網說明

有誰在用 Amazon RDS?

Airbnb, Netflix, Unilever, Expedia… 等等大公司都在用呢,想看使用 MySQL 的企業案例可以參考 Amazon RDS for MySQL customers

from Amazon RDS

RDS 支援的資料庫引擎

from Amazon RDS

怎麼把資料庫從 localhost 搬到 RDS?

以下是同學教我把 localhost 的 MySQL 資料庫搬移到 Amazon RDS 的過程筆記。

1. 開啟 Amazon RDS 服務

登入 AWS 找到 RDS,按 Create Database,選擇你的資料庫引擎跟版本(我選 MySQL 8.0.16,因為它最接近我 localhost MySQL 的版本)。

RDS 選擇 MySQL
選擇版本跟模板

輸入 identifier(之後在 RDS 上查看資料庫用的)跟 credentials。

  • 注意!沒動預設的話,你是 admin(不是 root 或是其他名字),之後登入需要。

其他就照著預設,直到我們來到 connectivity 區塊。

建立一個包含 EC2 和 RDS 的 VPC。

因為您的資料庫執行個體只需要供您的 web 伺服器使用,而不需要供公有網際網路使用,所以您可以建立一個同時包含公有和私有子網路的 VPC。Web 伺服器是在公有子網路中託管,以便它可以到達公有網際網路。資料庫執行個體是在私有子網路中託管。系統會在相同的 VPC 內託管 web 伺服器,因此其能夠連接至資料庫執行個體。然而,為了提供更高的安全性,公有網際網路將無法使用資料庫執行個體。

Source: AWS 教學

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 細節。

RDS DB identifier Summary

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(或是你修改預設的其他名字)跟密碼登入。

GUI MySQL workbench 設定新的連線

Reference

--

--

Wenchin
Wenchin

Written by Wenchin

Software engineer | wanderer

No responses yet