附录:创建、配置数据库代理
创建EC2数据库代理,配置Nginx转发到数据源
创建并登录到代理EC2机器,配置转发端口
有一些用户的数据库Security Group设置了限制,只允许固定IP访问。这个时候,用户需要一个EC2作为Proxy来提供固定的IP。
接下来,我们将创建1个EC2实例作为数据库代理,并安装Nginx软件并设置端口转发。在做数据源连接时,SDPS连接EC2,并通过这台EC2目标对数据库进行JDBC连接。
Step 1:创建EC2实例
- 在EC2控制台。在SDP所在的VPC创建一台EC2机器, 作为代理服务器。
- 配置EC2的安全组(Security Group):添加Inbound Rule,允许以下2个安全组的所有TCP进入:SDPS-CustomDB、堆栈名-RDSRDSClient
Step 2:在EC2上安装Nginx软件
- 将EC2的pem文件拷贝到Bastion host上,用于登陆代理服务器。
- 从你的Bastion host上,使用SSH方式登陆到EC2。例如:
ssh -i /path/to/your/key.pem ec2-user@ec2-private-ip
- 依次运行下面的命令,安装并启动Nginx。
- 安装:
sudo yum install nginx nginx-mod-stream
- 启动:
sudo systemctl start nginx
- 查看状态:
systemctl status nginx
Step 3:配置Nginx软件
- 打开配置文件:
vim /etc/nginx/nginx.conf
- 编辑配置文件:
# 用代码替换默认的nginx.conf文件内容。您需要进行必要的调整。 stream { upstream backend1 { server 10.0.34.171:3306 max_fails=3 fail_timeout=30s; # server地址可以使用域名 } server { listen 3306; proxy_connect_timeout 1s; proxy_pass backend1; } }
数据库太多时,如何编辑配置文件?
如果您需要配置多个端口转发,可以使用SDP 批量创建数据源功能,并通过模版来创建Nginx配置文件。见下面附录。
Step 5: 重新加载配置文件
保存配置文件,并重新加载使其生效:sudo nginx -s reload
Step 7: 测试代理EC2端口转发是否生效 (可选)
在EC2上,安装telnet,并测试本机的7001端口是否可以ping通。
sudo yum install telnet
telnet 127.0.0.1 7001
如果已经正确配置,您应该看到如下log:
Trying 127.0.0.1...
Connected to 127.0.0.1.
批量创建数据源时,生成Nginx配置文件
Step 1: 下载模版
从SDP UI上面,下载批量创建数据源的模版。
Step 2: 编辑excel文件
填入您所需要扫描的数据源。
InstanceName | SSL | Description | JDBC_URL | JDBC_Databases | SecretARN | Username | Password | AccountID | Region | ProviderID |
---|---|---|---|---|---|---|---|---|---|---|
test-instance-7001 | 1 | xxxx1.sql.db.com:23297 | jdbc:mysql://172.31.48.6:7001 | root | Temp123456! | 123456789 | ap-guangzhou-1 | 4 | ||
test-instance-7002 | 1 | xxxx2.sql.db.com:3306 | jdbc:mysql://172.31.48.6:7002 | root | Temp123456! | 123456789 | ap-guangzhou-1 | 4 |
Step 3: 生成Nginx软件的config文件
(在本地)打开模版文件(.xlsm)软件,菜单栏点击 Tools → Marco → Visual Basic Editor 功能。
点击运行按钮,会看到excel文件所在目录下生成一个config.txt文件。
// 这个是一个样例。
// 通过EC2的7001端口转发至xxxx1.sql.db.com:23297数据库。
// 通过EC2的7002端口转发至xxxx2.sql.xxdb.com:3306数据库。
stream {
upstream backend1 {
server xxxx1.sql.db.com:23297 max_fails=3 fail_timeout=30s;
}
server {
listen 7001;
proxy_connect_timeout 2s;
proxy_pass backend1;
}
upstream backend2 {
server xxxx2.sql.db.com:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 7002;
proxy_connect_timeout 2s;
proxy_pass backend2;
}
}