joppot

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

サーバ プログラミング

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

投稿日:


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?

ingiltere dil okulu にコメントする コメントをキャンセル

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

関連記事

gitのリモートプライベートリポジトリを公開鍵認証を使って環境構築する

概要 みなさんこんにちはcandleです。 今回はgitのリモートプライベートリポジトリを作ってみたいと思います。 リモートリポジトリと言えば、Githubとかbitbucketが有名だと思います。会 …

ruby on railsのckeditor gemの使い方をscaffoldを用いて解説する

概要 みなさんこんにちはcandleです。今回はruby on railsのckeditorという素晴らしいgemを使って見たいと思います。 ckeditorとはweb版の高機能なwordとかテキスト …

td-agentでRails 4のproduction.logを取得する

English 日本語 概要 みなさんこんにちはcandleです。今回はrails 4のproduction ログをtd-agentで取得してみたいと思います。 数年前にも同じ記事を書いたのですが、説 …

railsのsimple-captcha gemを使用してform_forを使ったフォームを画像認証する

概要 みなさんこんにちはcandleです。公に開かれたフォームはスパムや総当り攻撃を受けやすいです。 そこで、画像認証を導入して、悪意のあるフォームを拒否してみましょう。 simple-captcha …

ruby on railsのデータベースのテーブルにカラムを追加、削除する

概要 みなさんこんにちはcandleです。今回はrailsのカラムの追加の仕方を紹介します。 本当にrailsは規約が多くて、多くて、なんでデータベースを直接いじれないんだと。 早速やっていきましょう …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ