TCPプロキシとしてEC2インスタンス(Nginx)を構築し、80ポートでRDS(PostgreSQL)に接続する

nginx

今回は、Nginxを用いて80ポートでRDSに接続する方法をまとめたいと思います。

目次

  1. 背景
  2. 構築
  3. 接続確認
  4. おわりに

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