iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
自我挑戰組

AWS架構應用系列 第 11

EC2 連接 RDS - Day11

  • 分享至 

  • twitterImage
  •  

EC2 連接 RDS - Day11

接下來我們要演練的是如何將 EC2 實例連上 RDS,規格如下
EC2 實例

  • AMI 版本 : Amazon Linux 2 - amzn2-ami-hvm-2.0.20200904.0-x86_64-gp2 (ami-0b1e534a4ff9019e0)
  • Linux Version: 4.14.193-149.317.amzn2.x86_64
  • Web server : Apache 2.4.43, PHP 5.4.16, mysqlnd 5.0.10
  • 安全組 : ithome_web_SG
  • 子網 : 公有子網 1

RDS 實例

  • MySQL Server : 8.0.17 Community

測試 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 並新增表格
圖一、連線至 RDS 並新增表格

EC2 實例網頁首頁

接著我們以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();
?>

瀏覽 EC2 實例網頁

在準備打開 Chrome 瀏覽器瀏覽成果之前請先確認以下步驟
EC2 實例

  1. 已安裝完該有的套件: httpd php mysql php-mysql,如果沒有,請輸入下列指令並確認有執行成功
sudo yum -y install httpd php mysql php-mysql
  1. 已啟動 Web Server,若不確定那記得檢查一下
# 啟動 Web Server
sudo systemctl start httpd     
# 檢查 Web Server狀態
sudo systemctl status httpd 
  1. 已將上述的兩個檔案 (index.php, rds_write.php) 放入首頁目錄 /var/www/html,可以用以下指令確認
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
  1. 確認 RDS 已經啟動,請組態都正確(endpoint, master名稱、密碼、資料庫),檢查方式就是用第一點所提到的
mysql -h ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com -u ithomeDbuser -pithome-password ithomeDB

確認了上述訊息後,接著只要把 EC2 實例的 IPv4 Public IP 貼上瀏覽器應該就可以看到我們所期待的畫面

EC2 實例 結合 RDS
圖二、EC2 實例 結合 RDS

RDS MySQL 調整設定

很抱歉的,人生不如意事十有八九,寫系統的人從來不會那麼順風順水的,出現了 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。

步驟如下:

  1. 新增 Parameter groups
    到 RDS 主控台,選擇左邊選單中的 Parameter groups,再按下右手邊的 Create parameter group,接下來設定相關內容

Parameter group family : mysql8.0
Group name : ithomepara
Description : ithome parameter

新增 Parameter group
圖三、新增 Parameter group

  1. 修改 ithomepara 的字元集
    到 RDS 主控台,選擇左邊選單中的 Parameter groups,再選擇右手邊的ithomepara,對 ithomepara 進行內部參數的修改。在 Parameters 下方的文字方塊輸入 character_set 後,按下 Edit Parameters ,將這四個參數 character_set_client, character_set_connection, character_set_database, character_set_server 的值改為utf8(預設是空白的),修改完畢後記得勾選要修改的項目,並按下 Save changes 以儲存結果,可參考下圖

修改 Parameter group 的字元集設定
圖四、修改 Parameter group 的字元集設定

  1. 修改資料庫設定
    回到 RDS主控台,選擇左邊選單中的 Databases ,按下資料庫實例 ithomedbid 後,再按右上角的 Modify 來修改資料庫 ithomedbid 的內容

修改資料庫 ithomedbid 的設定
圖五、修改資料庫 ithomedbid 的設定

找到 Database Options 完成以下設定
DB Parameter group : ithomepara

修改資料庫 Parameter group 的設定
圖六、修改DB Parameter group 的設定

接下來要特別注意,因為資料庫的設定預設並非立即生效,所以必須要強制立即套用,並重開資料庫實例,這個過程有點久,可以透過觀察 RDS 實例的 status 欄位來了解目前狀態

立即套用修改
圖七、立即套用修改

重開資料庫
圖八、重開資料庫

再次確認 RDS 的存取

接著再回到瀏覽器,再次輸入 EC2 實例的 IPv4 Public IP,看到網頁的回應後,使用 PuTTy 連到 EC2 實例 使用mysql客戶端程式連到 RDS 查詢資料是否寫入,如圖十所示

EC2 實例 結合 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 內的資料
圖十、查詢 RDS 內的資料

References


上一篇
Amazon Relational Database Service (Amazon RDS) - Day10
下一篇
Auto Scaling Out/In 自動擴展或縮減 - Day12
系列文
AWS架構應用24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言