EC2 连接 RDS

12 篇文章 0 订阅
3 篇文章 0 订阅

EC2 连接 RDS

接下来我们要演练的是如何将 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 Relational Database Service (Amazon RDS) 笔记,登入成功后请键入

# 安装需要的软件:网站服务器 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 并新增表格
图 1 、联机至 RDS 并新增表格

EC2 实例网页首页

接着我们以Elastic Load Balancing (ELB) 笔记的首页程序为模板,在新增一个程序用来将 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
图 2 、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
图 3 、新增 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 的字符集设定
图 4 、修改 Parameter group 的字符集设定

  1. 修改数据库设定
    回到 RDS控制台,选择左边选单中的 Databases ,按下数据库实例 ithomedbid 后,再按右上角的 Modify 来修改数据库 ithomedbid 的内容

修改数据库 ithomedbid 的设定
图 5 、修改数据库 ithomedbid 的设定

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

修改数据库 Parameter group 的设定
图 6 、修改DB Parameter group 的设定

接下来要特别注意,因为数据库的设定默认并非立即生效,所以必须要强制立即套用,并重开数据库实例,这个过程有点久,可以透过观察 RDS 实例的 status 字段来了解目前状态

立即套用修改
图 7 、立即套用修改

重开数据库
图 8 、重开数据库

再次确认 RDS 的存取

接着再回到浏览器,再次输入 EC2 实例的 IPv4 Public IP,看到网页的响应后,使用 PuTTy 连到 EC2 实例 使用mysql客户端程序连到 RDS 查询数据是否写入,如下图所示

EC2 实例 结合 RDS
图 9 、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 内的数据
图 10 、查询 RDS 内的数据

References

  • PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers, https://stackoverflow.com/questions/43437490/pdo-construct-server-sent-charset-255-unknown-to-the-client-please-rep
  • PHP连接操作MySQL数据库出错Server sent charset unknown to the client. Please, report to the developers解决, https://blog.csdn.net/caixuanji/article/details/107433268
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值