AWS Elastic Beanstalkを使ってParse Serverを簡単デプロイ！


注：本記事は個人によるものであり、所属する企業や団体に関係するものでも代表するものでもありません。

#はじめに
先日、モバイル向けのバックエンドサービスである[Parse.com](http://parse.com/)が1年後に終了するという[発表](http://blog.parse.com/announcements/moving-on/)がされたのは記憶に新しいと思います。このニュースは多くの人に衝撃をもって受け止められました。
この発表のなかで、既存ユーザに対する救済処置として[データベースの移行ツール](http://blog.parse.com/announcements/introducing-parse-server-and-the-database-migration-tool/)と[Parse Serverのオープンソース化](https://github.com/ParsePlatform/parse-server)を発表しています。このParse Serverは発表中でParse APIとほぼ互換であるものであり、Node.jsで動くとしています。また、最新SDKでは自前のParse Serverへのリダイレクト機能が備わっているということですね。
というわけでこれをAmazon Web Services（AWS）で動かしてみたいと思います。AWSで動かすにあたって今回はAWS Elastic Beanstalkというアプリケーションのデプロイと管理を簡単に行うサービスを利用してデプロイします。

# Parse Server
Parse ServerはほとんどのAPIと互換があります。実際には以下がサポートされています。

* CRUD operations
* Schema validation
* Pointers
* Users, including Facebook login and anonymous users
* Files
* Installations
* Sessions
* Geopoints
* Roles
* Class-level Permissions

大事なこととして**Push通知関連の機能はサポートされていません。**
なお、AWSではプッシュ通知のためのサービスとして[Amazon SNS Mobile Push](https://aws.amazon.com/jp/sns/)というサービスがあります。

#AWS Elastic Beanstalkとは
アプリケーションを実行しているインフラについて心配することなく、AWS上でアプリケーションのデプロイと管理を簡単に行うことができるサービスです。開発者はアプリをアップロードするだけでよく、EC2を使ったサーバのプロビジョニングや、負荷分散やデータベースのマネージドサービスであるRDSのセットアップと管理を自動で行ってくれます。AWS Elastic Beanstalkは本投稿執筆時点で以下の開発言語とプラットフォームをサポートしています。Dockerに対応しているので実質なんでもいけるという状況です。

* Apache Tomcat for Java アプリケーション
* Apache HTTP Server for PHP アプリケーション
* Apache HTTP Server for Python アプリケーション
* Nginx or Apache HTTP Server for Node.js アプリケーション
* Passenger or Puma for Ruby アプリケーション
* Microsoft IIS 7.5, 8.0, and 8.5 for .NET アプリケーション
* Java SE
* Docker
* Go

気付いたでしょうか？Node.jsをサポートしているんですね。先述の通りParse ServerはNode.jsです。というわけでAWS Elastic Beanstalkを使ってデプロイしてみようと思った次第です。

#ローカル環境のセットアップ
最終的にはAWS Elastic Beanstalkを使ってAWS上にデプロイすることが目標なのですがまずはローカル環境をセットアップしていきます。なお、ここでは基本的にMacを想定していますのでLinuxやWindowsの場合は適宜読み替えてください。

## Node.jsのインストール
とりあえずNode.jsのインストールですが、もう既にセットアップされているのであればスキップしてください。
Node.js自体をインストールしてしまうことも可能ですがバージョン管理をしたいのでここでは[nodebrew](https://github.com/hokaccha/nodebrew)を使ってインストールします。同様のツールにnvmというものもありますがどちらでもいいです。
まず、nodebrewをhomerewでインストールした後、Node.js（今回はv4）をインストールします。

```
brew install nodebrew
```

シェルに環境変数PATHの設定を追加します。ここではbashを例にするので`.bashrc`なりに以下を追記してください。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

設定を再読み込みします。

```
source ~/.bashrc
```

確認がてらヘルプでも表示してみてください。

```
nodebrew help
```

続いてNode.jsをインストールします。今回は安定系であるv4の最新版を入れます。

```
nodebrew ls-remote //最新版を確認
nodebrew install v4.2.6 //執筆時点
```

## Mongodbのインストール
MonoDBはhomebrewを使ってインストールします。
```
brew install mongodb
```

起動は適当にデータベース用のディレクトリを作成した上で`mongod`を実行するだけの簡単起動で試します。
```
mkdir ~/data/db
mongod --dbpath ~/data/db
```

停止するにはCtrl+Cとかで終了してください。

## Parse Serverの実行
適当なディレクトリ（今回はparse-server-sample）を用意してParse Serverをnpmでインストールします。

```
mkdir parse-server-sample
cd parse-server-sample
```

このディレクトリ内に最低限のpackage.jsonを記述しておいておきます。`npm init`を実行するとアプリケーション名などが聞かれた上でpackage.jsonのサンプルファイルができあがるので以下のようにpackage.jsonに追加してください。`scripts`として`start`を追加し、依存関係として`dependencies`以下を追加しています。

```
{
  "name": "parse-server-sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "parse-server": "*"
  }
}
```
つづいてParse Serverのインストールです。今package.jsonを保存したディレクトリで以下を実行します。

```
npm install
```
そうするとnode_modulesというディレクトリが作成されてその下にParse Serverならびに依存ライブラリがインストールされます。続いて以下のような内容で起動用のスクリプト（index.js）を用意してNode.jsで起動します。
このスクリプト内では利用するmongodbの情報などを指定します。

```node.js:index.js
var express = require('express');
var ParseServer = require('parse-server').ParseServer;

var app = express();

var api = new ParseServer({
  databaseURI: 'mongodb://localhost:27017/dev',
  //cloud: '/home/myApp/cloud/main.js', 
  appId: 'myAppId',
  masterKey: 'mySecretMasterKey',
  //fileKey: 'optionalFileKey'
});

// Serve the Parse API on the /parse URL prefix
app.use('/parse', api);

// Hello world
app.get('/', function(req, res) {
  res.status(200).send('Express is running here.');
});

var port = process.env.PORT || 1337;
app.listen(port, function() {
  console.log('parse-server-example running on port ' + port + '.');
});
```

上記のなかで大事なのはこの辺りのパラメータです。
* databaseURI (必須) - 利用するDBへのパス, 例）mongodb://user:pass@host.com/dbname
* appId (必須) - このサーバでホストするアプリケーションのID
* masterKey (必須) - ACLセキュリティをオーバーライドするためのマスターキー
* cloud - cloud codeのmain.jsへの絶対パス
* fileKey - マイグレーションされたアプリではParse上にホストされているファイルへのアクセスに必要
* facebookAppIds - 有効なFacebook application IDの配列

というわけで起動してみます。mongodbを起動していなくても起動だけならできます。
```
node index.js
```
起動できたらブラウザなどでアクセスして起動できているか確認してみてください。

# AWS Elasric Beanstalkのセットアップ
ここからはElastic Beanstalkのセットアップを行っていきますが、AWSのアカウントの取得などは割愛します。アカウントの作成から始めるかたは[こちら](https://aws.amazon.com/jp/register-flow/)をどうぞ。

## CLIのインストール
まずは、Elastic Beanstalkを設定や操作、アプリのデプロイをするためのコマンドラインツールをインストールします。Macの場合、AWSが提供するスクリプトによるインストール、brewによるインストール、pipによるインストールと方法はいくつかあるのですが今回はOS X 10.7以降の推奨インストール方法である"AWSが提供するスクリプトによるインストール"を行ってみます。その他のインストールに関しては[こちら](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html)を参照してください。

```
curl -s https://s3.amazonaws.com/elasticbeanstalk-cli-resources/install-ebcli.py | python
eb --version
EB CLI 3.7.3 (Python 2.7.1) //執筆時点
```

## AWS Elastic Beanstalkの設定
作業用のディレクトリ（今回はparse-server-sample）に移動して初期化します。

```
eb init
```

実行するといろいろ聞かれますが大事なのはこのあたりです。
* リージョン - 好みのリージョンを選択してください。今回は東京リージョン（ap-northeast-1）を指定しました
* プラットフォーム - Node.jsを選択します

アプリ名などは好きな名前でいいです。SSHのキーをセットアップするかどうかはご自由に。Elastic Beanstalkでデプロイされたサーバにログインするのであればセットアップしたほうがいいです。あと、AWS CLIの設定を行っていない場合などはAccess KeyとSecret Access Keyが聞かれるので事前に用意した上で入力してください。

続いて、環境を作成します。
```
eb create
```
環境名（environment name）やDNSのCNAMEのプリフィックスが聞かれますがとりあえずデフォルトで大丈夫です。service roleについてもそのままでいいです。
実際にはもっと細かい設定ができるんですが今回はひとまずデフォルトのままで行きたいと思います。
作成完了まで少し時間がかかります。
できあがったら、

```
eb status
```
を実行してHealthの項目がGreenになっていれば問題なしです。ちなみに`eb logs`でログが見れたり、`eb events`でElastic Beanstalkのイベントが見れたりします。

## デプロイ
最後にParse ServerをElastic Beanstalkを使ってデプロイします。

```
eb deploy
```

問題なくデプロイされたら完了です。

# 最後に
何か重要なものを忘れている気がしますね。はい、そうです。MongoDBをAWS上では用意していません。AWSでは現時点ではMongoDBのサービスを提供していないのでMongoDBを利用しようとするとEC2インスタンスを起動して自分でインストールするしかありません。簡単に利用したいのであればMongoDBをサービスとして利用できるように提供している[mongolab](https://mongolab.com/)などのサービスを利用するのが簡単でいいと思います。