接下來我們要演練的是如何將 EC2 實例連上 RDS,規格如下
EC2 實例
RDS 實例
開啟一個 EC2 實例,規格如上所示,務必記得安全組跟子網路一定要對,不然網路不會通,設定好 key pair 後,使用 PuTTY 連上 EC2 實例,如果忘記的話可以參考前面相關文章Amazon VPC 練習 - Day07,登入成功後請鍵入
# 安裝需要的軟體:網站伺服器 httpd 、程式語言 PHP
、MySQL 客戶端連線套件 mysql、php連線MySQL資料庫套件 php-mysql
sudo yum -y install httpd php mysql php-mysql
# 透過 MySQL 客戶端連線到 RDS
# 需指定 -h 主機、 -u 使用者、 -p 密碼(密碼選項跟密碼間沒有空白)、 資料庫名稱
mysql -h ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com -u ithomeDbuser -pithome-password ithomeDB
如果連線成功會看到如下圖所示,接著新增表格 ec2_metadata 到 RDS 的資料庫中,這個表格會記錄 EC2 實例ID (instanceId)、實例所在的可用區(availabilityZone)、遠端主機的 IP 位址(remoteIp)、以及瀏覽時的時間(ct)
CREATE TABLE ec2_metadata (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
instanceId VARCHAR(30),
availabilityZone VARCHAR(30),
remoteIp VARCHAR(50),
ct TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
圖一、連線至 RDS 並新增表格
接著我們以Elastic Load Balancer (ELB) - Day09的首頁程式為範本,在新增一個程式用來將 EC2 實例ID (instanceId)、實例所在的可用區 (availabilityZone)、遠端主機的 IP 位址 (remoteIp)、以及瀏覽時的時間 (ct) 寫入 RDS 的資料庫中。
首頁程式 index.php
<center>
<table class='table table-bordered'>
<tr><th>Meta-Data</th><th>Value</th></tr>
<?php
#The URL root is the AWS meta data service URL where metadata
# requests regarding the running instance can be made
$urlRoot="http://169.254.169.254/latest/meta-data/";
$instanceId = file_get_contents($urlRoot . 'instance-id');
$availabilityZone = file_get_contents($urlRoot . 'placement/availability-zone');
# Get the instance ID from meta-data and print to the screen
echo "<tr><td>InstanceId</td><td><i>" . $instanceId . "</i></td><tr>";
# Availability Zone
echo "<tr><td>Availability Zone</td><td><i>" . $availabilityZone . "</i></td><tr>";
include("rds_write.php");
?>
</table>
</center>
存取 RDS 的程式 rds_write.php
<?php
//This is a simple EC2_metadata example for testing with RDS
// RDS configuration
$rdsURL = "ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com";
$rdsDB = "ithomeDB";
$rdsUser = "ithomeDbuser";
$rdsPwd = "ithome-password";
// Get remote IP
$remoteIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "";
// Connect to the RDS database
$mysqli = new mysqli($rdsURL, $rdsUser, $rdsPwd, $rdsDB);
// Set mysql connection character set
if (!$mysqli->set_charset('utf8')) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit;
}
// Insert data into ec2_metadata tbale in RDS
$sql = "INSERT INTO ec2_metadata (instanceId, availabilityZone, remoteIp)
VALUES ('${instanceId}', '${availabilityZone}', '${remoteIp}')";
if (!$mysqli->query( $sql))
echo "<div>Error: " . $sql . "<br>" . $mysqli->error . "</div>";
$mysqli->close();
?>
在準備打開 Chrome 瀏覽器瀏覽成果之前請先確認以下步驟
EC2 實例
sudo yum -y install httpd php mysql php-mysql
# 啟動 Web Server
sudo systemctl start httpd
# 檢查 Web Server狀態
sudo systemctl status httpd
ls -la /var/www/html
如果正確應該會看到
[ec2-user@ip-172-16-0-23 ~]$ ls -la /var/www/html
total 12
drwxr-xr-x 2 root root 63 Sep 11 05:53 .
drwxr-xr-x 4 root root 33 Sep 10 12:59 ..
-rw-r--r-- 1 root root 775 Sep 10 14:08 index.php
-rw-r--r-- 1 root root 973 Sep 10 15:14 rds_write.php
mysql -h ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com -u ithomeDbuser -pithome-password ithomeDB
確認了上述訊息後,接著只要把 EC2 實例的 IPv4 Public IP 貼上瀏覽器應該就可以看到我們所期待的畫面
圖二、EC2 實例 結合 RDS
很抱歉的,人生不如意事十有八九,寫系統的人從來不會那麼順風順水的,出現了 Server sent charset unknown to the client 這樣的錯誤,谷哥大神這時候總是可以及時救援的,找了半小時後,開始後悔為什麼要用 Amazon RDS, WAMP (Windows, Apache, MySQL, PHP)不是很好嗎? LAMP (Linux, Apache, MySQL, PHP)也不差啊,每一篇都說是 MySQL 伺服器設定問題,要求修改 MySQL 伺服器的設定,並重開伺服器。 RDS 去哪設定啊?這時候,最棒的還是 stack overflow 總是可以在瀕臨絕望時出現曙光,詳細內容請參閱 References。
步驟如下:
Parameter group family : mysql8.0
Group name : ithomepara
Description : ithome parameter
圖三、新增 Parameter group
圖四、修改 Parameter group 的字元集設定
圖五、修改資料庫 ithomedbid 的設定
找到 Database Options 完成以下設定
DB Parameter group : ithomepara
圖六、修改DB Parameter group 的設定
接下來要特別注意,因為資料庫的設定預設並非立即生效,所以必須要強制立即套用,並重開資料庫實例,這個過程有點久,可以透過觀察 RDS 實例的 status 欄位來了解目前狀態
圖七、立即套用修改
圖八、重開資料庫
接著再回到瀏覽器,再次輸入 EC2 實例的 IPv4 Public IP,看到網頁的回應後,使用 PuTTy 連到 EC2 實例 使用mysql客戶端程式連到 RDS 查詢資料是否寫入,如圖十所示
圖九、EC2 實例 結合 RDS
# MySQL 客戶端連線到 RDS,這是 linux 的指令
mysql -h ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com -u ithomeDbuser -pithome-password ithomeDB
# 查詢資料表的內容,這是 MySQL 客戶端的指令
select * from ec2_metadata;
圖十、查詢 RDS 內的資料
References