オープンロジを支える技術（2017年版）

[OPENLOGI Advent Calendar 2017](https://qiita.com/advent-calendar/2017/openlogi) 最後の投稿です。

[株式会社オープンロジ](https://openlogi.com/corp/)は 2013年12月25日 が創業日で本日がちょうど創業4年目の節目になります。
[オープンロジ](https://openlogi.com/)のサービスリリースが 2014年10月 なのでそれからは3年程になります。
[物流アウトソーシング「オープンロジ」がサービス開始――中小事業者や個人をターゲットに]
(http://jp.techcrunch.com/2014/10/21/jp20141020_openlogi/)


お陰様でユーザは徐々に増え[今年の夏にはシリーズBラウンドをむかえ](http://jp.techcrunch.com/2017/07/25/openlogi/)事業規模も大きくなってきました。

こんなサービスを３年間支えてきた技術や逆に使わなくなってしまった技術を振り返りながら整理したいと思います。

# インフラ
何はともあれサービスを運用するにはサーバーが必要ですがAWSなどクラウドインフラのおかげで誰でも簡単にサービスを立ち上げられる世の中になりました。
オープンロジも誰でも簡単に物流サービスを提供したいという思いがあり、物流のAWSと説明させていただくことがあります。

我々は幸い [VC](http://www.infinityventures.com/) から [AWS Activate](https://aws.amazon.com/jp/activate/) を提供いただいていたため2年間は無料でインフラを提供できていました。

## Amazon Web Service (AWS)
### ずっと使ってるもの
- [EC2](https://aws.amazon.com/jp/ec2/)
- [S3](https://aws.amazon.com/jp/s3/)
- [RDS](https://aws.amazon.com/jp/rds/)
    - Aurora への移行検討しているが、現在 MySQL 5.7 で運用中なので [Aurora の 5.7 対応待ち](https://aws.amazon.com/about-aws/whats-new/2017/12/announcing-preview-of-amazon-aurora-with-mysql-5-7-compatibility/)
- [Simple Queue Service (SQS)](https://aws.amazon.com/jp/sqs/)
- [Simple Notification Serivce (SNS)](https://aws.amazon.com/jp/sns/)
- [IAM](https://aws.amazon.com/jp/iam/)
- [CloudWatch](https://aws.amazon.com/jp/cloudwatch/)
- [CloudTrail](https://aws.amazon.com/jp/cloudtrail/)
- [CloudFront](https://aws.amazon.com/jp/cloudfront/)
- [Route 53](https://aws.amazon.com/jp/route53/)
- [Certificate Manager](https://aws.amazon.com/jp/certificate-manager/)
    - SSL証明書の有効期限を気にする事が無くなったのは革命的

### 比較的最近導入したもの
- [ElastiCache](https://aws.amazon.com/jp/elasticache/)
    - 今まで DB で行なっていた Cache や Job Queue の管理をしていたものを Redis に移行した
- [Elasticsearch Service](https://aws.amazon.com/jp/elasticsearch-service/)
    - DB Like 検索ではツライ規模になってきた
- [API Gateway](https://aws.amazon.com/jp/api-gateway/)
- [Lambda](https://aws.amazon.com/jp/lambda/)
    - 一部の簡易的な機能は API Gateway + Lambda で提供している
- [Elastic Container Service (ECS)](https://aws.amazon.com/jp/ecs/)
    - 一部の社内向けプロダクトは ECS で運用している

### 利用やめたもの
- [OpsWorks](https://aws.amazon.com/jp/opsworks/)
    - デプロイが遅すぎてツラかった

## Google Cloud Platform (GCP)
AWS Activate の利用期間が切れてしまったので、 極力ロックインされた環境は回避するためにも AWS 以外の選択肢も検討して行きたい。

- [Firebase](https://firebase.google.com/?hl=ja)
    - 一部の社内プロジェクトで利用

## 外部サービス
- [Pusher](https://pusher.com/)
    - イベント通知サービス
    - Websocket でサーバサイドのイベントをクライアントに伝える
    - サーバサイドの処理は非同期ジョブとして実行されているものが多い

- [mailchimp](https://mailchimp.com/)
    - マーケティングメール送信
- [mandrill](https://www.mandrill.com/)
    - トランザクションメール送信

# アプリケーション

## サーバサイド

- [PHP](http://php.net/) 7.0
    - 長らく PHP は避けて生きてきたのだが、一回りして悪くない言語に思えるようなってきている
    - 柔軟すぎない言語仕様が逆に良いのかもしれない

- [Laravel](https://laravel.com/) 5.x
    - もともと CakePHP 2.x で実装されていたサービスを早い段階で Laravel に移行
    - Laravel が好きだから PHP を使っていると言っても過言ではない
    - ミュータブルな処理は全てジョブとして実装しコントローラーなどからはジョブを dispatch するだけのアーキテクチャにしている

- [Node.js](https://nodejs.org/)
- [koa](http://koajs.com/)
    - 一部の社内プロジェクトでは、サーバサイドも JavaScript ベースで実装している
    - フロントもサーバも同じ言語で実装すると幸せになるのかの実験

## フロントエンド
- [React.js](https://reactjs.org/)
- [Redux](https://redux.js.org/)
- [ES2015](http://www.ecma-international.org/ecma-262/6.0/index.html)
    - Laravel に移行したタイミングでフロントも全て React.js / Redux ベースの SPA 実装に切り替え
- [Vue.js](https://jp.vuejs.org/)
- [Nuxt.js](https://ja.nuxtjs.org/)
- [TypeScript](https://www.typescriptlang.org/)
    - いつくかの新規プロジェクトは Vue.js / Nuxt.js ベースで書かれており、当面の標準構成として検討している
    - 型がある世界にロマンを求め始めている

### デザイン
- [Stylus](http://stylus-lang.com/)
    - CSS 記述言語
- [Bulma](https://bulma.io/)
    - CSS フレームワーク。[Bootstrap](https://getbootstrap.com/) 等と違いピュアな CSS のみで構成されているのが良いのだが対応ブラウザーはモダンなものに限られる。


# 運用


## ソースコードホスティング
- [GitHub](https://github.com/)
- [GitLab](https://gitlab.com/)
    - 一部のプロジェクトは GitLab で管理
    - 今でもメインは GitHub だが GitLab での利用を検討中

## デプロイ
- [capistrano](http://capistranorb.com/)

## 開発環境
- [docker](https://www.docker.com/)
- [docker-compose](https://docs.docker.com/compose/)

## CI
- [Wercker](http://www.wercker.com/)
- [CircleCI](https://circleci.com/)
    - 初めは Docker 対応していたということで Wercker を利用していたが、 CircleCI 2.0 で Docker ベースでになったので今は両方稼働中。

## BI
- [Redash](https://redash.io/)
    - 試しに導入したら、非エンジニア中心にどんどん使われるようになった
    - DBの変更に追従させるのがなかなか大変

## モニタリング
- [NewRelic](https://newrelic.com)
    - [APM](https://newrelic.com/application-monitoring) アプリケーション監視
    - [Browser](https://newrelic.com/browser-monitoring) ブラウザ監視
    - [Infrastructure](https://newrelic.com/infrastructure) サーバ監視
- [Papertrail](https://papertrailapp.com/)
    - ログ監視

## アクセス解析
- [MixPanel](https://mixpanel.com/)
- [Google Analytics](https://analytics.google.com/)

# 情報ツール

## チャット
- [slack](https://slack.com/)
    - 暫くエンジニア中心に利用していたのだが全社的に[chatwork](https://go.chatwork.com/)から移行した

## ドキュメント
- [Google Docs](https://www.google.com/intl/ja_jp/docs/about/)
- [crowi-plus](https://github.com/weseek/crowi-plus)
  - [docbase](https://docbase.io/) → [esa](https://esa.io/) と変遷して crowi-plus に移行中

## プロジェクト管理
- [waffle.io](https://waffle.io/)
    - GitHub で完結させるため利用していたが、機能を求めるようになりプロジェクト管理ツールを導入する方向に
- [Planio](https://plan.io/)
    - [Redmine](https://www.redmine.org/) ベースのホスティングサービス
    - カスタマイズ性が低く [Markdown](https://guides.github.com/features/mastering-marinformationkdown/) でかけないのが辛い
    - Redmine に移行するかもしれないが、 Redmine もなんだか古めかしくて気が進まない
    - 良いのないかな〜

# まとめ

利用している技術・サービスを列挙しただけですが、成長・変化を知るためにも年末に棚卸しするのは悪くないかもしれない。
来年はもっとデータ解析・分析の方に力を入れていきたい。
[オープンロジでは一緒に物流の未来を動かす仲間を募集しています](https://www.openlogi.com/corp/recruit/engineer/index.html)ので興味ある方は気軽にご連絡ください！