Quipper の DevOps のお仕事と技術的課題
技術的課題を書くと、それを解決してくれるエンジニアが採用できるって話は本当ですか?というのは冗談としても、今の技術的課題をブログにまとめて公開するノーガード戦法も良いかと思う。
— Kazuyuki Honda (@hakobera) May 25, 2015
このツイートがそれなりに反応があったので、有言実行してみる。
最初に書いておくと、これはQuipperの採用のための記事です。Quipper では下記のようなお仕事、技術的課題の解決に興味がある DevOps エンジニアを絶賛大募集しております。興味のある方は、Wantedlyの募集ページ から「話を聞きに行きたい」をクリックしてみてください。応募までは行かないけど、もっと詳しい聞いてみたいという方は私個人にでも良いのでご連絡ください。(Twitter で @hakobera にメンション or DM、または hakoberaアットgmail.com までメールください)
2015年6月時点での技術的課題一覧
- Heroku から AWS への移行
- Elastic Beanstalk で運用しているアプリの Docker 化
- Infra As Code のより一層の推進
- BigQuery を利用したレポート基盤の構築
- OSS 業務
合わせて使いそうな技術一覧
- AWS 全般
- Docker
- BigQuery
- Nginx
- Hashicorp 製品全般(主に Terraform と Atlas)
- Ruby/Python/Go など(なんらかの言語でのプログラミングスキルは必要)
Heroku から AWS への移行
Quipper は開発環境も合わせると、200以上のアプリを Heroku で稼働させている Heroku のヘビーユーザです。特に Heroku Review Apps と同じような仕組みをかなり昔から運用していて、便利に使っています。詳細は以下のCTO のブログを参照。
非開発者もGitHub Flowに巻き込んでみんなハッピーになった話 - Masatomo Nakano Blog CircleCIでfeature branchをHerokuに継続deploy - Masatomo Nakano Blog
すごく便利に使っている Heroku ですが、以下の理由から一部のアプリケーションについては AWS への移行を検討しています。
- アクセスが増えてきて、2X Dyno でさばけなくなってきた。現状 PX (Performance) Dyno を利用しているが、$500/Dyno/Month と高く、コストパフォーマンスが結構悪い。
- サービスの主戦場が現時点ではアジア(フィリピン、インドネシア、タイ)であり、US リージョンしかない Heroku だとネットワーク的に遠く、レスポンスが気になる
- セキュリティが緩くなりがちである(詳細は書けないが、IPアドレスが固定できないので、制限が色々とかけにくい。固定IPをつける addon もあるが高い)
AWS に移行するにしても、現状の feature branch を簡単にプレビューできる環境は維持したいので、Docker を利用して以下の構成にする予定です。
- ステージング: Private PaaS の基盤として Flynn or Deis or Dokku Alternative を検討中
- 本番: [Elastic Beanstalk for Docker] で運用(http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_docker.html)
なお、SPDY/HTTP2 を利用したいので、Elastic Beanstalk の前段に Nginx を置く予定(現状も、Heroku の前段に Nginx を置いている)
Elastic Beanstalk で運用しているアプリの Docker 化
Heroku の AWS 移行とも絡むのですが、現在 Elastic Beanstalk で運用している Worker アプリケーションを Docker 化するというのも課題の1つです。Elastic Beanstalk は大変便利ですが、2点ほど大きな問題を抱えています。
- ベースとなる AMI が Amazon Linux しか使えないので、ローカルでテスト環境を作りにくい
- .ebextension 配下に設定ファイルを置くことで、カスタマイズが可能なのだが、カオスになりやすく、Amazon Linux や Elastic Beanstalk のスタックのバージョンが上がると動かなくなることもある。ebextension の闇と呼んでいる。
後者は気合で乗りきれなくもないですが、前者は開発が相当やりにくくなっていたし、Quipper の他のサーバは Ubuntu なので、ここだけ OS が異なるのは管理上も面倒である。ということで、ここも Ubuntu で管理できるように Docker 化をしたいと考えている。
Infra As Code のより一層の推進
現在の Quipper の Infra As Code のレベルは、
- デプロイは全て CircleCI 経由で自動化
- Amazon VPC の一部は Terraform + CircleCI + Atlas によって自動化
- DNS は roadworker で CircleCI から自動適用
- Ansible によるサーバープロビジョニング
- 適用はまだ手動
- ServerSpec によるテストはまだ
- 一部の構成が CloudFormation のテンプレート化されている
今後もこの方向性は強く推進していきたい、アイデアとしては色々とあるし、ツールも進化していくの継続的に改善していきたい。
- ServerSpec によるインフラテストの追加
- CircleCI 経由で master ブランチの Ansible の適用の自動化
- Terraform の適用範囲の拡大
- CloudFormation テンプレートを Terraform で書き換え
- Docker イメージの自動ビルド
など。この分野はやることが無限にある感じなので、自動化大好きな方をお待ちしております。
BigQuery を利用したレポート基盤の構築
上記スライドの後半の事例で書いているように、データの投入は fluentd/embulk/mongobq などで解消済みであるが、スケージューリング、エラー時の再実行などの処理基盤がまだまだ弱い。現状、レポートの数がそれ程多くないので何とかなっているが、今後の業務拡大により回らなくなる可能性が高く、ココは早急に改善が必要だと考えている。
以前発表した BigQuery GAS 連携は1つの解にはなっているが、単純なレポートには良いが、中間テーブルを作成しながら集計していくような複雑なジョブの実行には向かない。これらに対する現在考えている解決策は以下だ。
- Job ネットの構築
- Luigi が良さそう
- Luigi の BigQuery Integration である Luigi-BigQuery を書いて、一部のレポートに適用済みで良い感じ
- スケジューラの改善
- 可視化 (Visualize)
- コストさえ許せば選択肢は色々とある。データサイエンティストの人と相談して決めていきたい。
- BigQuery コネクタのある製品:Mode Analytics, Bime, Chario, [Tableau(http://www.tableau.com/), QLikView など
- GAS で何とかするか、ゼロスクラッチで作るのも場合によってはあり
レポートの処理速度に関しては BigQuery が全てを解決してくれたので、スケジューラの構築、安定運用と可視化に取り組んでいきたい。
OSS 業務
これは課題ではないのですが、必要に応じて、OSS にコントリビュートする、OSS を書くというのも Quipper の DevOps の重要な仕事の1つなのであげておきます。書いたものを OSS として公開するのは、業務に支障がない限り、特に制限はありません。
現在使っているものも、使っていないものも含まれていますが、以下にこれまで Quipper の業務に関連する OSS をあげておきます。
業務のためにコントリビュートした OSS
- woothee/woothee · GitHub
- tagomoris/shib · GitHub
- abronte/BigQuery · GitHub
- kaizenplatform/fluent-plugin-bigquery · GitHub
- GoogleCloudPlatform/fluent-plugin-google-cloud · GitHub
- ixixi/fluent-plugin-sqs · GitHub
- y-ken/fluent-plugin-geoip · GitHub
業務のために書いた OSS
- hakobera/ebfly · GitHub
- hakobera/transfer · GitHub
- hakobera/mongobq · GitHub
- hakobera/fluent-plugin-heroku-syslog · GitHub
- hakobera/fluent-plugin-mixpanel · GitHub
- hakobera/embulk-output-gcs · GitHub
- hakobera/luigi-bigquery · GitHub