トークノート株式会社は、社内コミュニケーションサービス 「Talknote」の運営、管理を行っています。「いい会社をつくるための社内コミュニケーションサービス」を目指し、2011年6月にリリース以来、 累計利用企業数で10,000社を越える企業様にご利用いただいています。(2013年10月時点)

サービススタート当初は利用企業数がどのようなスピードでどの程度まで増えるか分からず、「Start Small, Scale Fast, Think Big」を実現できるインフラ環境が必須でした。また、インフラ専門のエンジニアがいなかったため、手軽にコストをかけず短時間でインフラを構築できるク ラウドは、当社にとって魅力的でした。

クラウドをサービスインフラ環境として検討していくうちに、採用企業数が多く、技術資料が豊富である点を評価し、アマゾン ウェブ サービス(AWS)の導入を決定しました。

当社では、2011年6月のサービス開始当初から AWS を利用しています。サービス開始当初はAmazon EC2 インスタンス 1台に LAMP 環境を構築し、Elastic IPを割り当てていましたが、サービスの拡張に伴い、以下の順に少しずつ構成を変更していきました。

  • データベースサーバーをウェブ・アプリサーバーと分離
  • アプリケーションサーバをスケールアウト可能な構成に変更
  • 自前メールサーバからAmazon SESに変更
  • Amazon SQS を使って処理を非同期化
  • データベースサーバーを Amazon RDS に変更
  • Amazon S3 にログや画像を保存

Talknote は B2B のサービスなので、ご利用いただいている企業様の業務時間内にサービスを停止することができません。障害発生時も無停止であることが要求されるため、従来 であれば ウェブ層は BIG-IP などのロードバランサー製品や LVS を使って処理分散、データベース層は Linux-HA を使って Active-Standby 構成を構築する必要がありました。しかし、サービスが拡大していくにに従って構成を変更していった結果、AWS では Elastic Load Balancing、Amazon RDS を使うだけで冗長性が確保できたのでとても便利でした。

AWS のシステム環境では Amazon Linux を使用しており、ミドルウェアとして以下を採用しています。

  • ウェブサーバー:Nginx
  • アプリケーションサーバー:PHP-FPM
  • リアルタイムサーバー:Node.js
  • キャッシュサーバー:Redis

 

 

 

「トークノート株式会社様 システム構成図」


jp_diagram_talknote2_1024x873

昨今のスタートアップでは、まず最初にユーザに自分のサービスを使ってもらってニーズが確かなものかを早い段階で検証することが重視されています。 当社にはインフラ専門のエンジニアがいないため、インフラ構築、運用については大きな課題でしたが、AWS を使うことでサービス開発に注力することができ、ユーザーに使ってもらうまでの時間を短縮することができただけでなく、AWS CloudFormation、Chef を使ってインスタンス作成とセットアップを自動化したことにより、インスタンス追加に伴う運用作業も削減することができました。

また、インフラ面のセキュリティについては、物理面はAWSが担保してくれている安心感があり、セキュリティグループ、IAMなど、OS/ ネットワークレイヤーのセキュリティを保護するための機能も充実しているため、アプリケーション内に脆弱性を作らないことに集中できます。さらに、 Elastic Load Balancing、Amazon RDS、Amazon S3 を利用することで障害発生時のシングルポイントを排除できているので、無停止運用が可能な設計でシステムを構築することが可能となりました。

今後は、Amazon VPC、Amazon CloudFront、Amazon Elasticache(Redis)の利用も予定しています。

AWS には多くの機能があるので、まずは自社のサービスの規模や性質に合わせて必要な機能のみを使って小さくスタートし、可用性や信頼性、スケーラビリティーが 求められる状況になった場合に、AWS の各機能を利用するのがよいと思います。自分たちの開発リソースはプロダクトの改善に注力し、非機能の改善はAWSを使うことで効率良く安定したシステム を構築できます。

なお、将来 AWS に移行できそうな機能は設計時に移行を考慮したクラス設計にしておくと、移行時のコストが少なく済みます。例えばメール送信であれば、 MailSender クラスを定義して、メール送信の責務を集約して担わせ、子クラスに SmtpMailSender、SesMailSender を作成。切り替えられるようにしておくなどの工夫がお勧めです。

 

 

- トークノート株式会社 取締役 最高技術責任者 杉浦 正明 様


Talknote に関する詳細は、こちらをご覧ください。