TCPプロキシとしてEC2インスタンス(Nginx)を構築し、80ポートでRDS(PostgreSQL)に接続する
nginx
今回は、Nginxを用いて80ポートでRDSに接続する方法をまとめたいと思います。
目次
- 背景
- 構築
- 接続確認
- おわりに
1.背景
社内プロキシが原因で80ポート、443ポート以外、外部に出ることができず、
5432ポートや3306ポートでAmazon RDSで構築したPostgreSQL、MySQLに接続できないという問題が発生しました。
「RDS構築時点で80ポートを指定すれば良いのではないか?」という声が聞こえてきそうですが、
1150ポート以上の指定しかできません。

そこで、TCPプロキシとしてNginxを構築し80ポートでRDSに接続する方法をまとめたいと思います。
構築するモノは以下のとおりです。
・Nginx 1.12.2(EC2インスタンス)
・PostgreSQL 11.5-R1(Amazon RDS)
PostgreSQLの構築
特殊な設定は何も行いません。普段どおり構築してくださいw
Nginxの構築
こちらもEC2インスタンス構築時点では、特殊な設定は何も行いません。
構築後、EC2にSSH接続しNginxをインストールしましょう。
AmazonLinux2ではyumパッケージとしてNginxが用意されていないので、以下コマンドでインストールしましょう。
$ sudo amazon-linux-extras install nginx1.12
念のため、インストールできたか確認します。
$ nginx -v
nginx version: nginx/1.12.2
設定ファイルを用意していきます。
/etc/nginx/nginx.conf
include /usr/share/nginx/modules/*.conf;
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.http.conf;
}
stream {
include /etc/nginx/conf.d/*.stream.conf;
}
/etc/nginx/conf.d/postgre_proxy.stream.conf
upstream backend {
server (構築したRDSのエンドポイント):(指定したポート名);
}
server {
listen 0.0.0.0:80;
proxy_pass backend;
}
設定が完了したら反映させましょう。
$ sudo systemctl restart nginx
3.接続確認
psqlで接続確認をします。(事前にusersというテーブルを作成しています)
$ sudo psql -h (EC2インスタンスのIPもしくはホスト名) -p 80 -U (ユーザ名) -c "SELECT * FROM users"
Password for user ***:
name | age
------+-----
taro | 23
tom | 21
(2 rows)
80ポートでRDSに接続することができました。
4.おわりに
いかがだったでしょうか。比較的簡単な設定で接続することができました。
まだ社内では試していないので、会社で接続できるか確認して本記事に追記しますw