joppot

コピペで絶対動く。説明を妥協しない

サーバ プログラミング

ElastiCacheのmemcachedとEC2上のrailsとdalli-elasticacheを使ってキャッシュ管理する

投稿日:

Pocket

Photographers

概要

皆さんこんにちはcandleです。今回はaws上にあるElastiCacheというサービスを使って
railsのキャッシュを管理したいと思います。

キャッシュというのはwebサービス上でよく使うページをサーバが使いやすい形に変換して、溜めておき必要とあらば
キャッシュからページをユーザーに返したりする機能です。

キャッシュの保管場所としてよく使われるのがデータベースです。一時的に保持して、そこからユーザーにページ情報を返答するやり方します。

しかし、データベースは単純かつ高速なインプット・アウトプットに適しているわけではありません。

キャッシュはもっと短時間で意味不明なものを素早く保存、取り出しするものです。

そこで登場するのがmemcachedサーバです。これはキー=>バリューの形式でデータを保存、アウトプットします。
ここにセッション情報やキャッシュ情報を保存し取り出せば、アプリケーションの動作が速くなると言われています。

cacheela

memcachedサーバの運用として、AWSのEC2にmemcachedを立てて、
そこに他のEC2のrailsサーバからアクセスさせても良いのですが、
セキュリティ面、立ち上げや停止のやりやすさも兼ねて、
AWSのサービスの1つElastiCache(EC)を使ってみましょう。

前提

railsアプリケーションがEC2上で起動している

ElastiCacheはセキュリティ面も考慮して、AWSのEC2からしかアクセス
できないようになっています。
ローカルのrailsからはアクセスできないので
注意してください。

EC2上のrailsにdalli-elasticacheをインストールする

EC2のサーバににアクセスして、railsプロジェクトに移動します。
Gemfileを開いて、下の内容を書き込みます。

gem 'dalli-elasticache'

保存したら、下のコマンドでインストールします。

bundle install

dalliがインストールできました。

 

EC2とElastiCacheを繋ぐSecurity Groupを作る

これがすごい大変です。複雑です。

現在EC2上のrailsサーバが属しているsecurity group 「myec2」というが
あるとします。

ec2securitygroup

次に、新しくSecurity Groupを作ります。名前は「ec2-memcached」にしておきます。
「Inbound」を「All TCP」にします。
カスタムIPのところに、「myec2」と書き込みます。
すると入力補完でmyec2のIDが出てくるのでそれを選びます。

「Outbound」も同じ様に「All TCP」にして、カスタムIPのところに同じく「myec2」と書き込み、
でてくるmyec2のIDをクリックします。

最終的に下の様になります。
createsecuritygroup

様は、カスタムIPのところにrailsサーバが属しているSecurity GroupのIDを入力するということです。
最後に「Create」を押せばEC2とElastiCacheを結ぶSecurity Groupが作られます。

今作ったec2-memcachedというSecurity GroupをElastiCacheに付与していきます。

ElastiCacheを起動させる

AWSのサイトにログインして上のメニューから
ElastiCacheを選びます。
awsmanagement

「Launch Cache Cluster」をクリックして起動します。

launchcache

必要事項を埋めていきます。

「Name」は自分のサービスの名前とかにします。
testと名前付けてみました。

「Number of Nodes」は分散処理をどのぐらい持つかみたいなのだと思うのですが、実はよく理解していません。

調べてみると、だいたい2と設定しておけば問題ないっぽいですね。
今回はテストですので、1でやっていきます。

「Node Type」はそのサービスの規模によりますが、普通のサービスならm1.smallでいいと思います。

今回は最も小さい、t1.microにします。

「Topic for SNS Notification」はCPUの稼働率とかで警告をだす
設定ですが、もしも予めARNを作っていなければ、「Disable Notifications」
にしておきます。

「engine」はmemcachedにします。

あとは写真のとおりです。
elasticsetting1

Nextを押して次の設定に移動します。

次の所が重要なのですが、「Security Group」という項目があると思います。

Security Groupは先ほど作ったec2-memcachedを選びます。

choosesecuritygroup

nextボタンを押します。

最後に設定の一覧が出てきますので、確認してから、「Launch Cache Cluster」を押します。

submit

これで少し待っていると、memcachedが起動します。

 

memcachedのendpointを確認する

作成したmemachedを選択して、エンドポイントのURLをクリックします。

elasticacheconsole

ウィンドウで2つのURLが出てくると思います。
上の方をクリックしてコピーして、URLをどこかに控えておきます。
elasticcacheurl

これでmemachedのサーバの設定およびElastiCacheの設定が終わりました。

railsのmemcachedの設定

今度はec2のrailsに移動します。dalli-elasticacheはすでにインストールされています。

railsが本番環境ならばconfig/environments/production.rbを開き、
もしも、ディベロップメント環境ならconfig/environments/develpment.rbを開きます。

下の記述を書き込みます。

endpoint = "先ほどコピーしたmemachedのURL:11211"
elasticache = Dalli::ElastiCache.new(endpoint)
config.cache_store = :dalli_store, elasticache.servers, {:expires_in => 1.day, :compress => true}

保存しましょう。

セッションを使ったサービスをだしているなら、下のファイルが作られていると思います。
無い場合はセッションを使ったサービスをしてないと思います。その場合は無理に作って
設定する必要はありません。

config/initializers/session_store.rbを開きます。

Rails.application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 1.day

を書いて、保存しましょう。

これで終わりです。実に簡単ですね。

動作確認

本番環境ならapacheのpassengerとかnginx unicornを使っていると思います。
railsプロジェクトのlogからproduction.logを見て、
本当にキャッシュをされているか確認して下さい。

ちなみに私の環境では下のように良い感じにキャッシュされました。
Cache Write とかCache readとかされていますね。
memcachelog

まとめ

実は、この記事は全て実際に作ってから思い出して書いているので、試行錯誤もテストも
できないところで書きました。もしかすると、security groupの設定が間違っていたり
memachedのところがおかしかったりするかもしれません。
気付いた点などがありましたら、コメント欄かtiwtterで報告お願いします。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ, プログラミング
-

執筆者:


  1. Is there any information about this subject in other languages?

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

wordpressのbogoでサイトで使用する言語を「en-US」から「en」に変更する方法

English 日本語 概要 みなさんこんにちはcandleです。 今回はbogoプラグインのカスタマイズです。bogoはwordpressのサイトを簡単に他言語に対応することができる素晴らしいプラグ …

macでreact nativeの環境構築をして、iosアプリのhello worldをする

概要 みなさんこんにちはcandleです。 今回は、react nativeの環境構築をmac上で行い、iosアプリでhello worldをしてみたいと思います。 react nativeはreac …

cakephp2系にphpunitとDebugkitをcomposerを使って最速で導入する

概要 みなさんこんにちはcandleです。今回はcakephp2.4以降でphpunitとdebugkitをcomposerを使って導入してみたいと思います。 cakephpは標準でphpunitを使 …

pythonのpipでfabricをインストールする

概要 みなさんこんにちはcandleです。今回はpipでデプロイメントツールのfabricをインストールしたいと思います。 前提 pipがインストールされている

railsのaws-sdk gemを使ってs3のファイルを削除する

by martinak15 概要 みなさんこんにちはcandleです。今回はs3にアップロードされている画像ファイルをrailsのaws-sdk gemを使用して削除してみたいと思います。 記事中で開 …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ