Yknot(ワイノット) を支える技術
こんにちは!エンジニアの内藤 (@kakipo) です。
ディレクター 1 名、デザイナー 1 名、エンジニア 1 名の小さなチームでYknot(ワイノット)というサービスの開発、運用を行っています。
この記事では Yknot(ワイノット)で利用している技術やサービスについてお話いたします。 前半は技術的な内容を中心に、後半は運用が楽しくなる便利なサービスをご紹介いたします。
基本に忠実に、そして良い外部サービスは積極的に利用することを心がけています。
小規模チーム開発におけるシステム構成の参考になれば幸いです。
はじめに: Yknot(ワイノット)とは
企業向けサービスのクチコミサイトです。 食べログの BtoB サービス版です。
「今年はやたらと Slack っていうチャットの記事を目にしたけど、実際どうなんだろ。」
「サーバ監視のサービスって色々あるみたいだけど、なにがいいんだろう。」
などなど、悩めるサービス導入担当者の意思決定をサポートするサービスを目指しています。
アーキテクチャ
Yknot(ワイノット)の主要なシステムは全て AWS 上に構築されています。 後発のサービスと比べると、ものすごく料金が安いというわけではないのですが、ワンストップで必要なサービスを全て調達できる点は魅力ですね。 先人たちによる知見が大量に公開されている点もありがたいことです。
Heroku などの PaaS 型サービスも検討しましたが、トラブル時に対処しきれる自信がなかったため今回は見送りました。AWS を始めとする IaaS 型サービスはセットアップなど面倒なことも多いですが、何かあったときに直接サーバにログインして触れるというオプションは手放しづらいものです。
AWS
AWS で主に利用しているサービスは以下の通りです。
- ELB
- ロードバランサ。負荷分散だけでなく SSL 設定が楽になるのも嬉しいトコロです。
- VPC
- 仮想ネットワーク。構築時には クラスメソッドさんの記事 を参考にさせていただきました <(_ _)>
- S3
- 静的ファイル置き場として、またログや DB バックアップファイルの保存場所として。
- Elastic Beanstalk
- アプリケーションのプロビジョニング、デプロイ、スケーリングなどなど。Docker にも対応してとても便利になりました。EC2 の管理で消耗しない。
- EC2
- なにはともあれ。
- RDS
- DB サーバ。MySQL を利用しています。
- ElastiCache
- キャッシュサーバ。Redis を利用しています。セッションのキャッシュや JOB 管理など。
- CloudFront
- CDN。静的ファイルの配信を行っています。時々トラブる。
- Route 53
- 高機能 DNS サービス。ドメイン取得したらとりあえず全部 Route 53 で管理するようにしています。
奇をてらうことなく、基本に忠実、たいへんベーシックな構成となっております。
ちょっと珍しいところでは Elastic Beanstalk + Docker を利用している点でしょうか。 Elastic Beanstalk は AWS が提供する、アプリケーション管理サービスです。 新たな計算資源などではなく、AWS 上で利用するサービスをより簡便に管理するためのサービスです。 4 月には Docker が正式サポートされ、ますます便利になりました。
デプロイ
Elastic Beanstalk はアプリケーションのデプロイで真価を発揮します。 これまで Capistrano でシコシコと頑張っていた部分がとてもシンプルになりますよ。
CI サーバにて環境ごとの Dockerfile を作成し、Elastic Beanstalk にデプロイ命令を投げます。 命令を受けた Elastic Beanstalk は、Docker Hub から gem や必要なライブラリのみをインストールしたベースイメージを基に最新のイメージを作成し、その後、作成したイメージを Elastic Beanstalk 上で管理しているインスタンスに配備します。
Elastic Beanstalk の導入には初回設定(VPC の構築や設定ファイルの作成など)が必要ではあるのですが、
- PaaS と同じくらい簡単にデプロイ
- PaaS と同じくらい簡単にリソースを追加できる
- 「イザ」というときに直接サーバにログインできる
などなどメリットが沢山あってお気に入りです。Docker を利用していると、トラブル時に環境ごと手元に持ってこられるので安心。
Docker コンテナには
- Nginx
- Phusion Passenger
- Rails
- Sidekiq
などが入っています。Phusion Passenger、Shellshock 騒動のときに「全死亡」なんて揶揄されてましたが、bash を最新版にすれば大丈夫ですよ。
アプリケーション
アプリケーションフレームワークには Rails を採用しています。
筆者自身は元々 Java 界隈の人間でした。しかし、ある日 Rails に触れてしまったために Rails なしではシステム開発ができない身体になってしまい、結果、脱サラして起業したのです。この選択はある意味必然と言えるかもしれません。冗談ですが。この辺はエンジニアが 1 名なので今のところは割りと好みで選んでいます。
また、クチコミ投稿画面など一部リッチな UI が必要な部分には vue.js を利用しています。
「クライアントサイド MVC (MVVM) には興味があるケド、いきなり導入は怖いな。」という方、vue.js オススメですよ。 他のクライアントサイド MVC フレームワークと比較すると、シンプルで既存環境への組み込みが容易です。
バックアップ
バックアップ&リストアは RDS に任せても良いのかもしれません。しかし、万が一を考え定期的にスナップショット(mysqldump)を取得し、S3 に保存するようにしています。 また、S3 にスナップショットを置いておくことでステージング環境や開発環境に対し、簡単に任意の時点の本番環境のデータを同期することもできて便利です。オススメ。
え?わざわざスクリプトを書くのがメンドウですって? そんな方はこちらをどうぞ(宣伝)
kakipo/mysql-s3-backup · GitHub
Mandrill
すでにメルマガの配信で MailChimp を利用していたため、メール配信には関連サービスである Mandrill を使っています。 月々 12,000 通までは無料。その後もかなりお安くメール配信できます。 開封/未開封率はもちろん、ユーザが利用しているメールクライアントや OS の情報なんかも見れたりと便利です。
MailChimp に関するクチコミはこちらから!
NewRelic
NewRelic ではサーバリソースの使用状況や、アプリケーションのパフォーマンスを監視しています。 インストールは超簡単。基本料金無料で利用できるため、とりあえずいれておいて間違いないです。
NewRelic に関するクチコミはこちらから!
Ducksboard
皆さまはサービスを運用していくうえで重要な指標はどのように確認されていますか?
直接 DB を見る?GrowthForecast?Kibana? KPI 確認用のグラフや表を管理画面の中に作りこまれている方もいらっしゃるかもしれませんね。 いろいろ方法はあるかと思いますが、私たちは Ducksboard というサービスを利用しています。
Ducksboard を使うと一目で「サービスの今」が分かります。 もちろんデータの投入は必要ですが、自前で環境を用意する必要がなくなるため、管理画面の作成にマンパワーを割けない場合には大変重宝します。 お気に入りのサービスではあるのですが、シンプルすぎて若干融通の効かない部分もあるので手放しではオススメしづらいかも。
最近 NewRelic に買収されたので今後に期待しつつ、紹介までに。
ちなみに、Ducksboard 上の重要な数値に関しては BOT が定期的に slack に発言するようにしています。
こうして常に「サービスの今」を意識するように工夫しています。
BOT の作成には ruboty を利用させていただきました。
ducksboardと連携させたい場合はこちらを利用されると良いかもしれません(宣伝)
Ducksboard に関するクチコミはこちらから!
Mixpanel
個人的に「2014 もっと早く出会いたかったプロダクト」第一位の Mixpanel。 ユーザ登録や、クチコミ投稿などの重要なイベントのトラッキングを Google Analytics よりももっと簡単に行うことができます。 管理画面がとてもキレイで、クライアントサイドでのトラッキングだけでなくサーバサイドでのトラッキングも容易に行えるため、採用しました。
サイト内にバナーを設置すれば月々 250,000 イベントまでは無料でトラッキング可能です。オススメ!
Mixpanel に関するクチコミはこちらから!
終わりに
いかがでしたでしょうか。
Yknot(ワイノット)ではサーバ監視やタスク管理、チャットツールなど様々なサービスのクチコミを募集しています! 是非、皆さまがご愛用中のサービスもお教えください!