EC2からElastiCache Redisノードに接続する

2016.03.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

EC2(Amazon Linux 2015.09)からElastiCache Redisの各Redisノードに接続し、コマンド実行する方法を紹介します。

ElastiCache Redisは2017/10末から通信の暗号化に対応しました。通信を暗号化している場合は次のブログを参照下さい。

Amazon ElastiCache for Redisの通信暗号化とクライアント認証をやってみた

Redisノードのエンドポイントを確認

  1. マネージメントコンソール
  2. CLI

の2通りで確認します。

1.マネージメントコンソールから確認

メニューから「ElastiCache→Cache Clusters」と遷移し、クラスター一覧画面に移動します。

redis-node-list

エンドポイントを確認したいクラスターの「Nodes」列をクリックすると、ノード一覧画面に遷移します。

Redisの場合は、1クラスターにつき1ノードだけが存在します。

redis-node-endpoint

エンドポイントは「Endpoint」列に表示されています。

2.AWS CLIから確認

elasticache describe-cache-clusters API を使います。

引数無しでAPIを呼び出してみます。

$ aws elasticache describe-cache-clusters
{
    "CacheClusters": [
        {
            "Engine": "redis",
            "CacheParameterGroup": {
                "CacheNodeIdsToReboot": [],
                "CacheParameterGroupName": "my-redis-28",
                "ParameterApplyStatus": "in-sync"
            },
            "CacheClusterId": "test",
            "CacheSecurityGroups": [],
            "NumCacheNodes": 1,
            "CacheClusterCreateTime": "2016-03-12T03:49:42.156Z",
            "AutoMinorVersionUpgrade": true,
            "CacheClusterStatus": "available",
            "PreferredAvailabilityZone": "ap-northeast-1a",
            "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
            "SecurityGroups": [
                {
                    "Status": "active",
                    "SecurityGroupId": "sg-11111111"
                }
            ],
            "CacheSubnetGroupName": "default",
            "EngineVersion": "2.8.24",
            "PendingModifiedValues": {},
            "PreferredMaintenanceWindow": "sat:18:00-sat:19:00",
            "CacheNodeType": "cache.t2.small"
        }
    ]
}

ノードのエンドポイントがレスポンスに含まれていません。 ノードのエンドポイントをレスポンスに含めるには --show-cache-node-info オプション を渡します。

$ aws elasticache describe-cache-clusters --show-cache-node-info
{
    "CacheClusters": [
        {
            "Engine": "redis",
            "CacheNodes": [
                {
                    "CacheNodeId": "0001",
                    "Endpoint": {
                        "Port": 6379,
                        "Address": "test.asdfqw.0001.apne1.cache.amazonaws.com"
                    },
                    "CacheNodeStatus": "available",
                    "ParameterGroupStatus": "in-sync",
                    "CacheNodeCreateTime": "2016-03-12T03:49:42.156Z",
                    "CustomerAvailabilityZone": "ap-northeast-1a"
                }
            ],
            ...
        }
    ]
}

CacheNodes のブロックにノードのエンドポイントが表示されるようになりました。 --queryオプションを使うと、エンドポイントだけを抽出できます。

$ aws elasticache describe-cache-clusters --show-cache-node-info --query 'CacheClusters[].CacheNodes[].Endpoint.Address'
[
    "test.asdfqw.0001.apne1.cache.amazonaws.com"
]

あとはこのエンドポイントに向けて接続すれば良いだけですね。

Redisノードに接続

以下では様々な方法でRedisノードに接続します。

  1. netcat(nc) を使う
  2. telnet を使う
  3. Redisをソースコードからインストール
  4. Redisをyumでインストール

Redisのデフォルトポート6379の指定は適宜省きます。

1.netcat(nc)を使う

デフォルトでインストールされている nc を使います。 急ぎの時にサクッと接続する場合は、この方法が良いかと思います。

コマンドの実行

エンドポイントとポートを指定します。

$ nc test.asdfqw.0001.apne1.cache.amazonaws.com 6379
ping
+PONG
quit
+OK

バッチ形式でコマンドを渡すこともできます。

$ (echo ping;sleep 1) | nc test.asdfqw.0001.apne1.cache.amazonaws.com 6379
+PONG

注意点としては、sleep を挟まないとレスポンスを受け取る前に nc が終了してしまいます。

2. telnet

telnet で接続します。

インストール

Amazon Linux では telnet がデフォルトでインストールされていないのでyumでインストールします。

$ sudo yum install -y telnet

コマンドの実行

エンドポイントとポートを指定します。

$ telnet test.asdfqw.0001.apne1.cache.amazonaws.com 6379
Trying 172.31.17.24...
Connected to test.asdfqw.0001.apne1.cache.amazonaws.com.
Escape character is '^]'.
ping
+PONG
quit
+OK
Connection closed by foreign host.

nc の時と同じく、バッチ形式でコマンドを実行した時にレスポンスを確認するには sleep を挟みます。

$  (echo ping;echo quit;sleep 1) | telnet test.asdfqw.0001.apne1.cache.amazonaws.com 6379
Trying 172.31.17.24...
Connected to test.asdfqw.0001.apne1.cache.amazonaws.com.
Escape character is '^]'.
+PONG
+OK
Connection closed by foreign host.

3. Redisをソースコードからインストール

ベンチマークツールなどRedis付属のツールが使えるため、ビルドが手間でなければ一番おすすめです。

インストール

事前準備として gcc/make など C プログラムのビルドに必要なツールをインストールします。

$ sudo yum -y install gcc

あとはC系プログラムのいつもの手順でインストールします。

$ wget http://download.redis.io/releases/redis-2.8.24.tar.gz
$ tar xzf redis-2.8.24.tar.gz
$ cd redis-2.8.24
$ make
...
Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory `/home/ec2-user/redis-2.8.24/src'
$ sudo make install
$ ls -1 /usr/local/bin/
redis-benchmark
redis-check-aof
redis-check-dump
redis-cli
redis-sentinel
redis-server

コマンドの実行

$ redis-cli -h test.asdfqw.0001.apne1.cache.amazonaws.com -p 6379
test.asdfqw.0001.apne1.cache.amazonaws.com:6379> ping
PONG
test.asdfqw.0001.apne1.cache.amazonaws.com:6379> quit

ENDPOINT:PORT> というシェルが起動します。

インストールされるプログラム一覧

Redis 2.8をソースからコンパイルした時にインストールされるプログラムは以下です。

redis-cli 今回のメインとなる、コマンドラインターフェースです。
redis-benchmark ベンチマークプログラムです。

http://redis.io/topics/benchmarks

redis-check-aof AOFファイルののチェックとデータ修正を行うプログラムです。
redis-check-dump RDBダンプファイルのチェックプログラムです。データ修正は行いません。
redis-sentinel Redis サーバーの監視・モニタリングプログラムです。

http://redis.io/topics/sentinel

 redis-server  Redis サーバーです。EC2上でRedisを運用しないかぎり、起動は不要です。

4. Redisをyumでインストール

Amazon Linuxの標準レポジトリにはRedisはパッケージ化されていないため、epel レポジトリからインストールします。

インストール

$ sudo yum install -y redis --enablerepo=epel
$ redis-cli --version
redis-cli 2.4.10

残念な点としては、ElastiCacheのRedisは2.8系なのに対し、epel版はバージョンが 2.4.10 と随分古いことでしょうか。

接続方法のまとめ

以上を元に、接続方法の違いを表にまとめました。

 接続方法 インストール コマンド実行 備考
netcat(nc) を使う 不要 生で実行 任意のEC2インスタンスからコマンド実行するときにおすすめ
telnet を使う yum 生で実行
Redisをソースコードからインストール ソースからコンパイル。 めんどくさい CLI。各種Redisツール利用可能 VPC内の一台にはRedisツール群をインストールして、ベンチマークその他で活用したい。
Redisをyumでインストール yum CLI。各種Redisツール利用可能 バージョンが2.4と2世代古いのでおすすめできない

「netcat(nc)を使う」と「Redisをソースコードからインストール」がおすすめです。

参考サイト