pixiv insideは移転しました! ≫ https://inside.pixiv.blog/

インターンを支えるpixivの開発環境

インフラチームの @catatsuy です.

f:id:catatsuy:20141114192037p:plain

ピクシブ株式会社では現在春・夏の年に 2 回 2 週間のインターンを行っているのと,選考の過程として 1 週間のインターンを行っています.その際に実際に pixiv の開発に携わってもらいたいことがあります.

しかし残念ながら pixiv を開発する環境を用意するのは以下の理由から容易ではありません.

  • pixiv の抱える画像のデータは膨大
  • MySQL や KyotoTycoon など各種ミドルウェアに大量のデータが保存されている上に系統が複数あるので複数個立てる必要がある

このような状況のために VM などで手軽に pixiv の開発環境を提供することができません.しかしせっかく優秀な学生が会社にインターンしに来てくれているのに pixiv の開発環境を触らせることができないというのは双方に取って機会損失ですし,インターンとして会社の開発手法などを入社前に学べると進路選択を考える上でも参考になると私は考えているので触りたい人には提供してあげたいところです.そこで今回 pixiv の開発環境とインターン生のために私が用意した開発環境のことを紹介します.

現在の pixiv の開発環境

pixiv は現在自社サーバールーム・新宿・白河の 3 拠点のデータセンターで運用されていてそれぞれ専用線で繋がっています.自社サーバールームは pixiv のユーザーデータが保存されている新宿データセンターと専用線で繋がっているため本番のデータと同期を取ることが比較的容易に行えます.そのため自社サーバールーム内で pixiv の開発に必要な画像や MySQL などのミドルウェアを開発用に用意しています.

社員は自社サーバールーム内に用意されているゲートウェイサーバーを通して自社サーバールームに設置されている OpenStack 上に用意された仮想マシンに入りその上で開発をしています.

インターン生用の開発環境

開発環境で使用している画像データや MySQL をインターン生が来る度に用意することはリソースの兼ね合いがあり非常に困難です.そこでインターン生用の開発環境も社員の開発環境と同じものを使用できるようにしたいです.しかし自社サーバールーム内のサーバーに入れてしまうと故意・過失を問わず社内の全サーバーへパケットを送ることができるようになってしまいます.インターン生が入るサーバーは他のサーバーからは隔離された状態であって欲しいです.

そこで pixiv の自社サーバールーム内のサーバーにインターン生用のゲートウェイサーバーを作り,OpenStack 上にインターン生用の仮想マシンを立ち上げます.ゲートウェイサーバーと仮想マシン上の iptables の設定を工夫してセキュリティの問題が起こらないようにします.iptables はパケットフィルターツールでサーバーから外に出すパケットを制御することができます.詳しくは以下のサイトが参考になると思います.

iptables は iptables-save コマンドを使うと設定を出力することができます.Debian7 だとデフォルトで以下の様な設定が出ました.

# Generated by iptables-save v1.4.14 on Mon Apr  6 15:08:38 2015
*filter
:INPUT ACCEPT [84:4608]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [45:3416]
COMMIT
# Completed on Mon Apr  6 15:08:38 2015

iptables は /etc/iptables.up.rules に設定を書いて

iptables-restore < /etc/iptables.up.rules

というようにして設定を反映します.iptables は本来細かく設定する必要がありますが今回はインターン生用に追加した設定を紹介します.

一番最後に以下のような設定を足します.

-A OUTPUT -p tcp -m tcp -d 192.168.0.0/255.255.0.0 -j REJECT
-A OUTPUT -p udp -m udp -d 192.168.0.0/255.255.0.0 -j REJECT

これでもしデータセンター内の全サーバーが 192.168.0.0/16 のネットワークで作られているならデータセンター内のサーバーへパケットを飛ばせなくなります.これでデータセンター内のサーバーにパケットを飛ばせない隔離されたサーバーを作ることができます.

ただしこの設定をインターン生用の仮想マシンに設定するとゲートウェイサーバーから ssh ができなくなってしまいます.ゲートウェイサーバーなどパケットをやりとりする必要のあるサーバーには事前にパケットを飛ばせるようにしなければなりません.ゲートウェイサーバー以外にも例えば DNS・ntp サーバーとはパケットをやりとりしたいですし,当然開発に必要なミドルウェアに対してパケットをやりとりしなければなりません.

そこで以下の様な設定を先程の REJECT の設定の上に足して適用します.

# ゲートウェイサーバー
-A OUTPUT -p tcp -m tcp -d 192.168.*.* -j ACCEPT

# DNS
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT

# ntp
-A OUTPUT -p udp -m udp --dport 123 -j ACCEPT

# MySQL
-A OUTPUT -p tcp -m tcp --dport 3306 -d 192.168.*.* -j ACCEPT

このようにパケットを飛ばす必要があるサーバーやプロトコルを調査して一つ一つ ACCEPT を指定してパケットを飛ばせるようにします.根気のいる作業ですがこれをすることで通信するサーバーを必要なものだけに限定することができるので安全です.

ユーザー作成

ユーザー作成に公開鍵が必要ですが公開鍵を一つ一つ手で設定するのは非常に大変です.そこで GitHub の公開鍵が https://github.com/ユーザー名.keys でダウンロードできる機能を使用して簡略化するようにしています.これだとインターン生が ssh 鍵を設定した GitHub のアカウントを持っていることが必要になりますが,現状問題だとは思っていません.

インターン生への課題

最近は Heroku などの PaaS が充実していることもあり ssh を使ったことがない学生の方も増えているようです.その場合この開発環境を扱うことは極めて困難です.

以前冬インターンという 2 日間で pixiv のソースコードのバグフィックスを行うという企画がありました.たった 2 日間しかないため開発環境の扱いに不慣れだとバグフィックスを行う前にインターンが終わってしまいます.そこで ISUCON の予選問題を使って私が課題を作りました.こういうところにも ISUCON の問題は活用できて大変素晴らしいと思いました.ISUCON 運営陣の皆様ありがとうございます!!

pixiv/intern2014w

冬インターンはこの課題をこなした人だけで行ったため誰も開発環境を扱うことにハマること無く企画は大成功でした.

inside.pixiv.net

まとめ

ピクシブ株式会社では選考の過程としてもインターンを行っています.この開発環境を使って pixiv を改善したいという学生の方ぜひ選考を受けてみてください!!(インターンの課題は希望に添えないこともあります)

recruit.pixiv.net