search
LoginSignup
25

More than 5 years have passed since last update.

posted at

updated at

AWSでmongoを動かしてみる(AutoScale対応)

AWSでmongoを動かしてみる(AutoScale対応)

Advent Calendar2014ということで、mongoの枠が余ってたので書いてみることにした。他の人達がシャーディングがどうこう言っている中で、1人だけ超初心者投稿だけど頑張る。

今回作ったサンプルのレポジトリ
https://github.com/KeitaMoromizato/mongosample

前置き

取り急ぎAWSでmongoを動かしてみたいときは普通にインスタンスにmongoをインストールすればいい。ただしそれだとAutoScaleした時に困る。インスタンスがそれぞれ別のDBを見ていたらデータがおかしな事になってしまうから。
RDBMSなら、AWSにはRDSという便利なサービスがあってDBサーバだけ切り出すことができる。AutoScaleしたインスタンスはそれぞれ同じRDSを見に行けばいい。mongoにはそれが無い。

そんなときはインスタンスをもう一つ立ち上げるのです。

アプリケーションインスタンスを作る

プログラムを走らせるために、AWSのElasticBeanstalkでアプリケーションインスタンスを作る。

1.アプリケーション名を適当に設定

1.png

2.sails.jsを使うのでnode.jsのWebServer

2.png

3.環境名を指定

4.png

4.RDSはいらない

5.png

5.カギとかもろもろ設定してLaunch!

mongoインスタンスを作る

1.とりあえずのAmazon Linuxで

9.png

2.色々設定してLaunch!

3.名前がついてなかったのでEC2コンソールからmongoインスタンスに名前を付ける

13.png

4.mongoインスタンスのSecurityGroupを確認(リンクを飛ぶ)

15.png

5.mongoインスタンスのSecurityGroupのInboundでmongo用ポートを開放

20.png

OK!

mongoインスタンスの設定

mongo用インスタンスにsshログイン、mongoの設定をしていく。
まずはインストールのためのレポジトリ追加。以下のファイルを作成する。

$ sudo vim /etc/yum.repos.d/10gen.repo
/etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1

インストールが完了したら起動する前に、重要な設定を変更します。mongoの設定ファイル/etc/mongod.confにてbind_ip=127.0.0.1をコメントアウト。これがあるとlocalhostからのアクセスしか受け付けないので大変です。

vim /etc/mongod.conf

# bind_ip=127.0.0.1

設定が完了したらサービスを開始。

$ service mongod start

アプリケーションインスタンスとmongoインスタンスの接続

Sails.jsでサンプルプログラム作成

最近自分の中でSails.jsブームが来ているのでサンプルはSailsで。アプリケーションを作ります。

$ sails new mongosample

mongoを使いたいのでmongoモジュールをインストール。

$ npm install sails-mongo --save

Production環境を認識するための環境変数定義。

ebextensions/00environment.config
option_settings:
  - option_name: NODE_ENV
    value: production

connection.jsにmongoの設定を記述。mongoインスタンスのIPアドレスを設定。

config/connection.js
module.exports.connections = {
  //省略

  someMongodbServer: {
    adapter: 'sails-mongo',
    host: process.env.NODE_ENV === "production" ? 'xx.xx.xx.xx' : 'localhost',
    port: 27017,
  },

  //省略
}

上で書いた設定を使いますよという命令をmodels.jsに記述。これでSails.jsのmongo設定は完了。

config/models.js
module.exports.models = {
  connection: 'someMongodbServer',
  migrate: 'alter'
};

超適当にAPIを作る。

$ sails generate api Hoge

もっと適当にViewを作る。

views/homepage.ejs
<form method="post" action="/hoge">
<p><input type="text" name="text" size="50"></p>
<p><input type="submit" value="送信する"></p>
</form>

実行

AWSコンソールからアプリケーションにアクセス。適当にメッセージを入力して「送信」

17.png

レスポンスがちゃんと返ってきたら、mongoインスタンスにsshで接続して確認。データが保存されてたら成功!

18.png

注意点

今回はとりあえず動かしてみた、というレベルなので実運用の時には気をつけること。

  • mongoインスタンスにしているEC2は何かの拍子にリブートすると真っさらになります。mongoをインストール/設定した段階で、AMI(イメージ)を作成し、リブート後もそのイメージから再生できるようにしましょう。
  • 同様に、mongoDBのデータも消えるので実際はS3とかに保存するか定期バックアップを取るべき。
  • mongoインスタンスのSecurityGroupの設定でIPをすべて許可しているので、これはアプリケーションインスタンスからに限定する。ELB(ロードバランサ)のIPにしたらたぶんOK
  • デフォルトではmongoのUserName/Passwordが設定されていないので設定しましょう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
25