ProxySQL を使って EC2 をプロキシサーバとして利用し、特定の IP から RDS にアクセスする


背景

社内の RDS の一つに、一時的に特定の外部の固定IPからアクセスできるようにしたい。
そこで、特定の外部の固定IPからのみアクセス可能な EC2 に ProxySQL を設定し、そこ経由で RDS にアクセスしたい。
(今回は MySQL)

AWS マネジメントコンソール上での準備

VPC の用意

VPCを用意しておきます。

RDS の準備

RDS インスタンスを立ち上げる。
インバウンドには、後述する EC2 のセキュリティグループを設定。
port は 3306 を空けておく。
ここでは説明のため、↓のようなユーザ/パスを設定することにする。

user: app
password: pass

EC2 の準備

今回は Amazon Linux を想定。
インバウンドとして、接続してくる外部の固定IPを設定。
port は 22(SSH用)と 6033(proxy用) を空けておく。

EC2 上での操作

RDS インスタンスに接続してテーブルを作成

ユーザは AWS マネジメントコンソールで RDS インスタンスを作る時に作られている。

$ sudo yum -y install mysql mysql-devel
$ mysql -h [RDSのエンドポイント] -u [マスターユーザー名] -p
// RDSインスタンスへの接続
Enter password:
// テーブル作成
CREATE TABLE users(
    id INT(11) AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) NOT NULL ,
    PRIMARY KEY (id));

ProxySQL をインストール

↓ファイルを開いて

$ vi /etc/yum.repos.d/proxysql.repo

↓を書き込む

[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/latest
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key

インストール

$ yum install proxysql

ProxySQL 管理画面での操作

/etc/proxysql.cnf の設定

mysql_variables=
{
  admin_credentials="admin:admin"
  mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
  threads=1
  interfaces="0.0.0.0:6033;"
}

ProxySQL 起動

# 止めるときは stop
$ sudo service proxysql start

ProxySQL 管理画面から proxy 設定

$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
# サーバ情報とユーザを作成
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0,[RDSのエンドポイント],3306);
INSERT INTO mysql_users (username,password) VALUES ('app','pass');

# RUNTIME へ適用
LOAD MYSQL SERVERS to RUNTIME;
LOAD MYSQL USERS TO RUNTIME;

# 永続化
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;

固定IPを持つ外部からの操作

mysql -h [EC2のエンドポイント]  -u app -ppass -P6033

これで接続できます。
先ほど作ったテーブルも確認できるはず。

参考ページ一覧

https://github.com/sysown/proxysql/wiki

https://confluence.sharuru07.jp/pages/viewpage.action?pageId=2883888