プライベートWEBサービス開発　ツール・サービス・運用環境

最近、個人的にWEBサービスを作成して公開しました。
その際、調べたサービス・ツールや実際にどういう構成にしたのかなどの投稿です。

# サービス・ツール

## 動作環境を選定する

プライベートにサービスを作るとなると、とにかくお金がかけられない。
サラリーマンの月のお小遣いの平均は約4万円らしい[^1]が、そのお小遣いは可能な限り削りたくはない。

そうなると、安価に導入できる動作環境を選定する必要がある。

### IaaS

インフラを提供してくれるサービス。
提供されたインフラ上に独自に環境を構築する。

AWSで以下の様な構成で料金を見積もったところ、__約49\$/月(1$=120円レートの場合、5,880円/月)__となった。

> プライベートプロジェクトの場合、アクセスがほとんどないであろうと仮定して、データ転送にかかる料金は微々たるものになるため、料金の計算からは除外しています。

|用途|タイプ|オプション|金額|
|---|---|---|---|
|WEBサーバー|EC2 t2.micro|Elastic IP 1つ付与|14.61$/月|
|DBサーバー|RDS MySQL t2.micro Single AZ 64G|64Gのバックアップ|33.96$/月|

#### IaaSを選択するメリット

* サーバーのチューニングが自由に行える（ものもある）
* スケールアップが容易
* APIやSDKなど利用するための便利ツールが豊富

#### IaaSのデメリット

* 重量課金なので利用者が増えれば、費用も比例して増加していく
* WEBサーバー構築のための作業コストがかかる
* ミドルウェアのバージョンアップなどの運用コストがかかる

### VPS

VPSはサーバー本体（仮想）をレンタルして月額の利用料を支払う形態で環境を構築していく。

さくらVPSで以下のような構成でVPSをレンタルした場合、__3,650円/月__、初期費用に__5,000円__と、かなりローコストで運用出来る。

|用途|性能|料金|
|---|---|---|
|WEBサーバー|メモリ:1G, HDD:100G|972円/月 + 初期費用1,500円|
|DBサーバー|メモリ:2G, SSD:50G|1,706円/月 + 初期費用2,000円|
|バックアップサーバー|メモリ:1G, HDD:100G|972円/月 + 初期費用1,500円|

#### VPSを選択するメリット

* 性能とコストのパフォーマンスが良い
* 構成の自由度が高い

#### VPSのデメリット

* 構成するためのコスト（作業工数）が高い
* 転送量が増えるとアカウントをいきなり取り消されることがあるらしい
* ミドルウェアのバージョンアップなどの運用コストがかかる
* スケールアップが難しい

### PaaS

コードの変更を反映させるだけでアプリケーションをすぐに動作させることが出来る、動作環境（プラットフォーム）を提供するサービス。
サーバーを直接触ることが出来ない代わりに様々なAdd Onが提供されているので、それらを利用して動作環境を拡張していく。

_主なPaaS_

* [Heroku](https://www.heroku.com/)
* [Google App Engine](https://cloud.google.com/)
* [Engine Yard](https://www.engineyard.co.jp/)

Herokuを利用して以下の様な環境を構築した場合、__約50\$/月(1$=120円レートの場合、6,000円/月)__となった。
AWSとほぼ同程度の金額で利用出来る。

|サーバー／AddOn|プラン|金額|
|---|---|---|---|
|WEBサーバー|1X 1つ|0$/月|
|Heroku Postgres|Standard0|50$/月|

#### PaaSを選択するメリット

* 動作環境構築の作業コストがかからない
* 機能を拡張したい場合もAddOnを追加するだけなので、作業コストは物凄く少ない
* PaaSが提供する機能・AddOnだけで完結させれば（多分）安全な構成になる
* スケールアップが容易

#### PaaSのデメリット

* サーバーのチューニングは一切行えない
* 性能を上げたい場合、費用の上がり幅が大きい

## ドメインの取得

とにかくお金をかけたくないなら、お名前.com、ムームードメイン、VALUE-DOMAINから取得出来る__.link__、__.click__ドメインだと99円/年ですみます。

以下の様なサイトからドメイン取得の申し込みを行うことが出来る。

* [お名前.com](http://www.onamae.com/)
* [ムームードメイン](http://muumuu-domain.com/)
* [VALUE-DOMAIN](https://www.value-domain.com/)
* [スタードメイン](http://www.star-domain.jp/)
* [ゴンベイドメイン](http://www.gonbei.jp/)
* [Go Daddy](https://www.godaddy.com/)

## SSL通信

会員制サイトではhttps通信は必須ですね。
そうなるとSSL証明書が必要になってきますが、SSL証明書は一般的に取得するために結構な費用（個人の財布の視点）がかかります。

しかし、以下の様なサービス・サイトを利用することで費用をかけずにSSL通信を利用することができるようになる。

### StartSSL

[StartSSL](https://www.startssl.com/)を利用すると無料でSSL証明書を取得することが出来ます。
詳細は下記投稿を見ましょう。

[無料のSSL証明書StartSSLを活用する](http://qiita.com/k-shogo/items/870b6d3939dd08da2de4)

### Cloud Flare

[CloudFlare](https://www.cloudflare.com/)はCDNを提供するサービスですが、
CloudFlareを通してWEBサーバーにアクセスすることでSSL通信を行うことが出来ます。

通信は以下の様になる。
UserからCloud Flareへの通信のSSL証明書をCloud Flareが提供してくれます。
Cloud FlareからWeb ServerへのHttps通信はオレオレ証明書であっても問題ないようです。

```
[User] -- Https --> [Cloud Flare] -- Http(s) --> [Web Server]
```

## リソースモニタリング

サービスの負荷などは、モニタリングしておくことで何処に問題があるのかを把握し対応を決めるのます。

### NewRelic

リソースのモニタリングだけでなく、サーバーエラーの監視、アラートメールの通知などを行ってくれる。
モニタリング項目も豊富。

[パフォーマンス監視サービスのNew Relicが超便利な件](http://qiita.com/y_uuki/items/dd4fce78b1bc32b64600)

## ソースコードバージョン管理

プライベート開発なので、ローカルでバージョン管理ツールを利用するだけでも問題はないのでしょうが、CIなどを絡めたくなった時にソースコードのホスティングサービスが欲しくなると思います。

OSSとして開発するならGithubが様々なサービスと連携出来て安定していますが、多くのプライベートプロジェクトはソースコードを公開したくないはずです。

### BitBucket

[BitBucket](https://bitbucket.org/)はAtlassian製のGitホスティングサービスです。
このサービスは5名までのチームであればプライベートリポジトリを無料で作成することが可能です。

プライベートで開発を行う場合、リポジトリを利用するのは1人ですから無料で利用することが出来ます。

BitBucketはCIサービスなどとの連携も豊富なのでプライベート開発にはピッタリです。

## タスク管理

プライベートで開発だからといって、気の向くままに開発していると気の乗らないタスクがどんどん積まれていってモチベーションも一緒に下がっていくなんてことはないでしょうか？（私はそんな感じでした…）

タスク管理をすることで、__実装したい機能__、__優先順位__が分かるようになり、やるべきことが分かるとモチベーションも保てるようになる（気がしています）。

### BitBucket

ソースコードのバージョン管理でBitBucketを紹介しましたが、
BitBucketにはシンプルな課題管理機能がついています。

優先度の管理、コミットへの参照、コミットメッセージの課題への参照が行えます。

### Trello

[Trello](https://trello.com/)はタスクの進捗状況まで含めて管理できるタスク管理ツールです。

BitBucketと連携できるらしいので、本格的にタスク管理したい場合に導入してみるといいかもしれません。

[Bitbucketのコミット内容をTrelloに渡す方法](http://qiita.com/Sugima/items/184b4acfc9fca2594d30)

## CI

コードの品質が落ちると、開発のモチベーションも落ちてしまいます。
プライベート開発では、コードレビューもなくコードの品質を守るのは自分との戦いです。

最低限、テストコードやコードの品質チェックツールを用意してあれば、
CIサービスを導入することで一定の品質を保ちながら開発を続けることが出来ます。

### wercker

[wercker](http://wercker.com/)はGithubやBitBucketと連携してCIできるサービスです。
今のところ、プライベートリポジトリでも無料で利用することが出来ます。

[werckerを使ってBitbucketのプライベートレポジトリからOctopressを自動デプロイする](http://rcmdnk.github.io/blog/2015/02/25/blog-octopress/)

# 実際に運用している構成

![private develop structures (1).png](https://qiita-image-store.s3.amazonaws.com/0/28406/74abaf5b-c865-fa05-8be3-d52936686cf3.png)

サーバー構築作業をやる時間が勿体なかったので、PaaSであるHerokuをWEBサーバーとして選択しました。

DBには、AWSの無料枠が利用出来たこともありRDSを選択しています。

> Heroku + RDSの構成だと、DB接続でIPのフィルタリングが出来ないため、どこかのタイミングでRDSをHeroku Postgresに置き換えるか、PaaSをEngine Yard
に変更する予定です。

この構成でかかっている費用はドメインの取得だけです。

CloudFlareを通していること、
Herokuのリージョンの問題もあってページの表示速度に若干問題（assetの読み込み完了含めて1.8secほど）がありますが、
利用者が少ないこともあり、問題なく動作しています。

## サーバー構成

* CloudFlare(CDN) + Heroku + RDS + MailGun(SMTP:Heroku Add On)
* リソース管理にNewRelic(Heroku Add On)を利用

## 自動デプロイ

* BitBucketでソースコードを管理
* BitBucketに変更をpushするとwerckerでBuild(テストとコード解析)が実行され、問題が見つからなければHerokuにデプロイされる。

---

[^1]: http://www.shinseibank.com/cfsg/questionnaire/archive/pdf/2014/2014_report.pdf