AWS外部からHAProxyを使ってElastiCacheリソースへアクセスする方法

このブログをご覧のみなさん、こんにちは。

Amazon ElastiCacheは同一VPC内のEC2からしかアクセスができません。

ステップ 4: アクセスを許可する – Amazon ElastiCache

AWS外部からAmazon ElastiCacheリソースにアクセスする方法について、以下のリンクの通り、NATインスタンス経由でアクセスする方法が記載されていますが、メンテナンス性も悪く、手順が煩雑です。

AWS 外部からの ElastiCache リソースへのアクセス – Amazon ElastiCache

そこで、同一VPC内のEC2上でHAProxyを動作させ、HAProxy経由でアクセスする方法が分かったので、紹介します。

注意事項

前提

本手順は、以下を前提としています。

  • Amazon ElastiCacheとEC2を同一VPC内で構築している
  • EC2からAmazon ElastiCache、クライアントマシンからEC2は疎通できている

手順

疎通確認

EC2上で、EC2からAmazon ElastiCacheへの疎通確認をします。

$ nc {Amazon ElastiCacheのEndpoint-URI} 6379
ping
+PONG
quit
+OK

HAProxyのインストールおよび設定

$ sudo yum install haproxy -y
:
$ sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy-org.cfg
$ sudo vi /etc/haproxy/haproxy.cfg

以下の内容にします。

global
    log 127.0.0.1 local2 notice
    maxconn 4096
    chroot /var/lib/haproxy
    user nobody
    group nobody
    daemon

defaults
    log global
    mode tcp
    retries 3
    option redispatch
    maxconn 2000
    timeout connect 2s
    timeout client 120s
    timeout server 120s

frontend monitor
    bind :80
    mode http
    stats enable
    stats show-legends
    stats uri   /haproxy?stats
    stats auth  {認証ID}:{Password}

frontend redis
    bind :6379
    default_backend redis_backend

backend redis_backend
    option tcp-check
    tcp-check send PING\r\n
    tcp-check expect string +PONG
    tcp-check send INFO\ REPLICATION\r\n
    tcp-check expect string role:master
    tcp-check send QUIT\r\n
    tcp-check expect string +OK
    server redis1 {Amazon ElastiCacheのEndpoint-URI}:6379 check inter 1s

HAProxyの起動および動作確認

$ sudo service haproxy start
:
$ sudo netstat -antp
:
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      2751/haproxy
:

haproxyがTCP:6379でLISTENしていることを確認します。

EC2上で以下のコマンドを実行し、自分自身の6379に接続し、Amazon ElastiCacheに対して接続するか確認します。

$ nc localhost 6379
ping
+PONG
quit
+OK

クライアントマシン上で以下のコマンドを実行し、Amazon ElastiCacheに対して接続するか確認します。

$ nc {EC2のEndpoint-URI} 6379
ping
+PONG
quit
+OK

参考資料