2011年8月23日火曜日

Amazon ElastiCacheってなんじゃ?

Amazon ElastiCacheというあたらしいサービスがbeta公開されました。
これはいわゆるAmazonが提供するmemcacheサーバーで、サーバークラスタとして動作し、EC2のネットワーク上からアクセスが可能です。

今回は、簡単にElastiCacheを試してみます。

まず、ElastiCacheのページにアクセスし、右ペインにある"Sign Up Now"のボタンからElastiCacheの利用登録をします。




すると、AWSのコンソールで"ElastiCache"のタブが追加されるので、選択します。
左ペインを見ると、このサービスがまだUS-Eastでしか提供されていないことがわかります。
また、メニューツリーに、いくつか機能がならんでいるのがわかります。



まず、その中から"Cache Security Groups"を選択して、"Create Cache Security Groups"ボタンを押して、"Cache Security Group Name"を入力して登録します。
ここでは
  • Cache Security Group Name:myfirst-cache-sg
としました。



Cache Security GroupはEC2ネットワーク内からのキャッシュクラスタに対するアクセス許可をコントロールします。EC2のセキュリティグループはEC2ネットワーク外部からのアクセスに対して権限をあたえますが、ElastiCacheのキャッシュセキュリティグループは指定されたEC2のセキュリティグループに対してアクセスの権限を与えます。

新規に作成された"myfirst-cache-sg"を選択すると、下部ペインにそのキャッシュセキュリティグループ の情報が表示され、EC2のセキュリティグループに対してアクセス許可を与えることができます。


"EC2 Security Group to Link"に、EC2セキュリティグループ名、AWS Account Idには自分のアカウントIDをハイフンなしの12桁で入力します。
ここでは、あらかじめ同じus-eastで作成したEC2インスタンスが属するmyfirst-use-sgというセキュリティグループがあるので、以下のように入力しました。(AWS Account Idは伏せてあります。)
  • EC2 Security Group to Link:myfirst-use-sg
  • AWS Account Id:xxxxxxxxxxxx



次に左ペインで"Cache Cluster"を選択して、"Launch Cache Cluster"ボタンを押すと以下のような設定ウィンドウが表示されるので、ここにキャッシュクラスタの設定を入力していきます。
ここでは、Nameにクラスタ名、Node Typeにノードのキャッシュのメモリサイズ、Number of Nodesにクラスタのノード数を入力、preferrd Zoneで設置するゾーンを選択します。
ここでは、
  • Name :myfirst-cache
  • Node Type:cache.m1.small(1.3GB memory)
  • Number of Nodes:2
  • Preferred Zone:us-east-1a
で設定しました。


"Continue"ボタンを押すと、追加設定画面が表示されます。
ここで、先ほど作成したキャッシュセキュリティグループを選択します。また、"Cache Parameter Group"ではキャッシュエンジンの設定値をカスタムする場合、クラスタ上のすべてのキャッシュノードに対して共通で適用することができます。"Maintenance Window"は、もしAmazonがElastiCacheに対してバージョンアップやバッチなどの適用を行う場合に、そのタイミングを指定することができます。ここでたとえば火曜の夜中ならメンテナンスを行ってもよいという場合は、そのように設定できます。

ここでは、 キャッシュセキュリティグループの指定のみで、他の2項目はデフォルトのままで設定しました。


"Continue"を押し、確認画面で登録ボタンを押して完了すると、このようにクラスタが登録されているのがわかります。


また、クラスタ名をクリックすると、クラスタの詳細とノードの一覧を確認することが出来ます。



nodeタブのノード一覧では、各ノードのホスト名とポート番号が表示されており、ElastiCacheを使用するときはこのエンドポイントに対してアクセスすることになります。
また、それぞれのノードを選択すると、下部にそのノードのCloudWatchの各メトリクスへのリンク集が表示されます。


これで、ElastiCacheが立ち上がり、使用することが出来るようになりました。

それでは、実際にプログラムからアクセスしてみます。
us-east-1aにあるEC2インスタンスにログインします。
ここではキャッシュアクセスするプログラムはRubyを利用することにしますが、ElastiCacheはAPI経由ではなく、memcacheプロトコルでアクセスするため、いつものようにAWS Access Keyなどの認証は必要ありません。そのかわりとしてElastiCacheのCache Securithi GroupがEC2のSecurity Groupに対してアクセス許可をしているようです。

rubyはインストールしてあることが前提で、さらにmemcacheクライアントライブラリをインストールします。ここではmemcachedを利用しますが、別のクライアントライブラリでもかまいません。

# gem install memcached
Building native extensions.  This could take a while...
Successfully installed memcached-1.3
1 gem installed
Installing ri documentation for memcached-1.3...
Installing RDoc documentation for memcached-1.3...

ここでは簡易的にirbを使用してアクセスします。
ここで指定するホスト名は、ノード一覧に記載されていたendpointとportを指定します。
# irb
irb(main):001:0> require 'memcached'
=> true
irb(main):002:0> $cache = Memcached.new(["myfirst-cahce.umk9bw.0001.use1.cache.amazonaws.com:11211", "myfirst-cahce.umk9bw.0002.use1.cache.amazonaws.com:11211"])
=> (長いので割愛)
irb(main):003:0> value = 'hello'
=> "hello"
irb(main):004:0> $cache.set 'test-key', 'hello'                  
=> nil
irb(main):005:0> $cache.get 'test-key'    
=> "hello"
irb(main):006:0> 

ちゃんとsetとgetができていることが確認できました。
これで、memcacheのためだけにインスタンスやAMIを用意する必要がなくなるかもしれませんね。

今日はここまで。