Play frameworkのサンプルをAWS Elastic Beanstalk + Amazon ElastiCacheで動かす

2011.09.15

今回の目的

さて今回は 「memcachedつかったサンプルをPlay frameworkで動かす。memcachedはElastiCache使って」 という指令を受けたため、調査および環境の構築を行いました。その結果を公開します。 結果的にタイトルにあるように、作成したアプリケーションをElastic Beanstalkにアップロードして、そこからElastiCacheを使用しました。 まずは環境設定から行っていきましょう。

ローカル環境構築

本記事での動作確認環境は下記の通りです。

  • OS : MacOS X 10.7.1
  • Java SE: 1.6.0_26
  • Play framework : 1.2.3
  • memcached : 1.4.5

memcachedはhomebrewで(Macならbrew install memcachedとすれば)簡単にインストールできます。 なお、Elastic BeanstalkとElastiCacheを使用するにはAWSのアカウントが必要です。

サンプルアプリケーションの実装

Play frameworkとmemcachedを使用した簡単なカウンタをつくります。 ボタンを押下するとカウンタをインクリメントし、その値をmemcachedに保存するだけです。 まずはアプリのひな形を作成します。名前はmemsampleとしましょう。

$ play new memsample

application.confでmemcachedの設定をします。まずはローカルで動作確認するので、memcachedは127.0.0.1を指定します。

# Memcached configuration
# ~~~~~ 
# Enable memcached if needed. Otherwise a local cache is used.
 memcached=enabled
#
# Specify memcached host (default to 127.0.0.1:11211)
 memcached.host=127.0.0.1:11211

ここのhostは、あとでElastiCacheの設定をしたときにわかるendpointを設定します。

app/controllers/Application.javaを下記のように修正します。

package controllers;

import com.jamonapi.utils.Logger;

import play.cache.Cache;
import play.mvc.Controller;

public class Application extends Controller {
	public static void index() {
		// memcachedから値を取得し、インクリメント&保存
		Integer count = Cache.get("count", Integer.class);
		if (count == null) {
			count = 0;
		}
		// set memcached
		Logger.log("count=" + count);
		render(count);
	}

	/**
	 * インクリメントボタンを押下
	 */
	public static void increment() {
		// memcachedから値を取得し、インクリメント&保存
		Integer count = Cache.get("count", Integer.class);
		if (count == null) {
			count = 0;
		} else {
			count++;
		}
		// set memcached
		Logger.log("count=" + count);
		Cache.set("count", count, "30mn");
		index();
	}
}

index()関数はカウンタ画面表示時に実行されます。現在memcachedに保存されている値を返します。 increment()関数はmemcachedに保存された数をインクリメントします。 Play frameworkではplay.cache.Cacheクラスを使用して簡単にmemcachedへアクセスすることが可能です。

次にapp/views/Application/index.htmlを編集します。

#{extends 'main.html' /}
#{set title:'Home' /}

<h1>count is ${count?: '0'}!</h1>
<form action="@{Application.increment()}" method="GET">
    <input type="submit" value="increment" />
</form> 

countの数を表示し、ボタン押下でApplication.increment()を実行するようになっています。 ここまでできたらローカルで確認してみましょう。 memcachedを起動し、localhost:9000にアクセスします。 ボタンを押下するたびにmemcachedに保存されたカウンタの数が増えていきます。

ElastiCache設定

アプリケーションがローカルで動くようになったので、次はクラウド上にmemcachedを用意しましょう。 AWSマネジメントコンソールにアクセスし、画面上部のメニューからAmazon ElastiCacheを選択します。 そこで「Launch Cache Cluster」を押下しましょう。

Note: 2011/9/15現在、ElastiCacheはUSリージョンでしか作成できませんので、USリージョンを使用しています。

ウィザードが起動するので、Name(名前)とNumber of Nodes(ノード番号)を入力して起動します。 今回はNameにmemtest、Number of Nodesに1を入力しました。 画像は確認画面です。

ウィザードを終えてしばらく待つと、指定したとおりにCache Clusterが起動します。 画像の「1 nodes」となっているリンクをクリックしてください。ここで詳細情報の確認を行うことができます。

下記画像にあるportとendpointが、アプリケーションのapplication.confで指定する値です。

環境によって値は変わってくると思いますが、それにあわせてapplication.confを修正してください。

# Memcached configuration
# ~~~~~ 
# Enable memcached if needed. Otherwise a local cache is used.
 memcached=enabled
#
# Specify memcached host (default to 127.0.0.1:11211)
 memcached.host=memtest.fobs0c.0001.use1.cache.amazonaws.com:11211

ElastiCacheの設定はいったんおわりですが、あとでSecurity Groupsの設定を行います。

Elastic Beanstalkにデプロイ

ではwarファイルを作成し、Elastic Beanstalkにデプロイしてみましょう。 まずはアプリケーションのwarを作成します。playのwarコマンドを使用すれば、warファイルを作成することができます。

$ play war memsample -o /your/war/memsample --zip

次にAWSマネジメントコンソールからElastic Beanstalkを選択し、画面右上の「Create New/Application」を押下します。 ウィザードが起動するので、設定していきます。

アプリケーション名を入力し、さきほど作成したwarファイルを指定します。

次に、アプリケーションサーバーの種類やURLを指定します。今回はURLを「memsample」、APサーバーは64ビットTomcatを選択しました。

すると、overviewタブに作成したApplicationがでてきます。 画面右のActionドロップダウンメニューから「Edit/Load Configuration」を選択してください。

「EC2 Security Groups」という項目があります。 このグループをElastic cacheのSecurity Groupsに追加しないとアクセスできないので、このグループ名をおぼえておいてください。

ElastiCacheのセキュリティ設定

最後にもう一度ElastiCacheへ移動し、画面左の「Cache Security Groups」を選択します。 defaultセキュリティグループを選択すると、画面下にアクセスを許可するグループを登録する項目がでてくるので、 さきほど確認した「EC2 Security Group」と、アカウントのセキュリティ証明書から確認できる「AWS Account Id」を登録します。 ここまでできたら、デプロイしたアプリケーションにブラウザでアクセスしてみてください。 ローカルと同じく、ボタンを押下するたびに数が増えていきます。

まとめ

今回はPlay frameworkでmemsachedを使用したサンプルをAWSで動かしてみました。 Elastic BeanstalkもElastiCacheも今回はじめて使用しましたが、簡単に動かすことができました。 もちろん本番環境で使用するにはもっと詳細な設定が必要になりますが、ファーストステップとしてためしてみてください。