さくらのクラウドとGitHub+Travis CIを使ってCoderDojo向けのプルリクドリブンのPaaSサービスを3日で作った!

僕はCoderDojo熊野のメンバーの一人として月に一度地元の子供たちにプログラミングを教えるという活動をしています。

(最近はあまり参加できてきなくてすいません。。。汗)

https://coderdojo-kumano.github.io/

先日、さくらインターネット様から、CoderDojo Japan向けにさくらのクラウドを無料でご提供いただくことになりました。

子ども向けプログラミング道場を推進する一般社団法人CoderDojo Japanをさくらインターネットが支援、「さくらのクラウド」を無料提供

CoderDojo Japanの安川さんからその旨のアナウンスがあり、サーバーの管理をしてくれるボランティアを募集していますとのことで、実は一瞬スルーしたのですが(笑)、GitHubをつかってうまいことインスタンスの管理ができるんじゃないのかしら?と思いついて、安川さんと二人でワークフローなども含めて作ってみました。

https://github.com/coderdojo-japan/dojopaas

このプロジェクトのゴール

  • コミュニティドリブンなPaaSを作りたい。
  • コミュニティドリブンなのでそれに関わる全員がボランティア。特定の誰かに依存したり作業量が集中する仕組みはよくない。
  • 数日で実装可能であること。
  • サーバーに接続するためのSSHアカウントのやりとりを必要最小限にしたい。
  • 各サーバーの必要最低限のセキュリティは担保したい。
  • さくらのクラウドのコントロールパネルのアカウントを共有したくない。
  • 長期間持続可能であることがとにかく大事。

希望者がサーバーをもらうまでの流れ

  1. サーバーが必要な人はGitHub上のCSVに必要な項目を記述してプルリクエストを送る。
  2. プルリクエストのコメント欄でサーバーの利用規約に同意した旨を書いてもらう。
  3. それを管理者がマージするとTravis CIが発火。
  4. Travis CIでさくらのクラウドのAPIを叩いて必要なインスタンスを起動
  5. インスタンス起動時にあらかじめ指定したスタートアップスクリプトが起動して最低限の処理を実行。
  6. それが完了するとサーバーのリストが自動的に反映される。
  7. 申請した人はそのリストを確認してSSHでログイン。

とまあこんな感じです。

プルリクエストのコメント欄で利用規約に同意してもらう

プルリクエストを送信する際には以下のようなテンプレートを用意していて、プルリクエストのコメント欄に自動的に表示されます。そこで利用規約に同意した旨を書いてもらう感じです。

https://github.com/coderdojo-japan/dojopaas/blob/master/.github/PULL_REQUEST_TEMPLATE.md

公開鍵をCSVに書いてもらうことでSSHに必要な情報のやりとりを省略

申請の際に書いてもらうCSVには、SSH用の公開鍵を書いてもらうことになっていて、サーバーが出来上がった際に更新されるサーバーリストをもとに ssh ubuntu@xxx.xxx.xxx.xxx でSSH接続してもらうという感じ。

https://github.com/coderdojo-japan/dojopaas/blob/master/servers.csv

CSVに書いてもらった公開鍵はインスタンスの起動時に ~/.ssh/authorized_keys に自動的に書き込むようになっており、利用者はIPアドレスさえわかればいいので、SSHに必要なアカウントのやりとりをなくすことができました。

インスタンスの起動後は管理用のリストに自動的に反映

サーバーが起動した後に反映されるリストは、以下のURLにあります。

https://github.com/coderdojo-japan/dojopaas/blob/gh-pages/instances.csv

Travis CIでサーバーを作った後で、同じリポジトリのgh-pagesブランチにおいてあるリストをTravis CIから自動的に更新しています。

こうしておくことで、「サーバー作りましたー」っていうコミュニケーションも省略できました。

Travis CIでCSVのフォーマットもチェック

あと、プルリクエストを送ってもらう際にCSVが間違っていることもありそうなので、CSVのフォーマットを簡単にチェックするためのテストも仕込みました。

https://github.com/coderdojo-japan/dojopaas/blob/master/test/test-csv.js

さらに、GitHubのProtected Branchという機能を使って、このテストに合格しないとマージする際にガミガミ言われるようにもなっています。

以下はCSVに対するCIが通っていない際のマージ画面です。マージボタンの文字が赤くなって注意喚起されています。

インスタンスの起動時にスクリプトを実行

あと、インスタンスを起動する際にはスタートアップスクリプトが一度だけ実行されます。

これ自体もこのリポジトリにおいてあってマージとともにさくらのクラウドに反映されます。

https://github.com/coderdojo-japan/dojopaas/blob/master/startup-scripts/112900928939

現時点では PaaS というにはまだまだ不十分ですが、ここまでやれればWordPressのインストールとかもほいほいできます。

サーバーを作るための仕組み

Travis CIからさくらのクラウドのAPIを蹴っ飛ばしてサーバーを作るには Node.js のスクリプトを作りました。

これは、さくらさんの sacloud というライブラリを使用しています。

https://github.com/sakura-internet/node-sacloud

このライブラリは3年ほどメンテされていない上に情報量もあまりなくて、実装を開始した当初は不安だったのですが、よくよく見てみると、よくありそうなHTTPクライアント風の記述だったので、ドキュメントに書かれていない新しいAPIにも問題なく使用できました。

以下のAPIのドキュメントも合わせてみるといいです。

http://developer.sakura.ad.jp/cloud/api/1.1/

APIドキュメントでやりたいことを調べて、以下のように methodpathbody にドキュメントどおりに記述する感じです。

client.createRequest({
  method: 'DELETE',
  path: 'server/'+serverId,
  body: {
    WithDisk: true
  }
}).send(function(err, result) {
  if (! err) {
    console.log('OK!');
  }
})

さくらのクラウドにはサンドボックスというのがあって、サーバーをつくるための一連の処理をサンドボックス用のAPIを指定することでテストすることもできます。

サーバーを作る一連のタスクを本番環境で毎回やるのはそれなりにリスクが伴うので、これはとても助かりました。

今後の予定

Slackのスラッシュコマンドで管理できるようにしたい

実はすでに手をつけ始めているのですが、既存のインスタンスに対する再起動とかは秘密のチャンネルからスラッシュコマンドでサーバーの再起動や停止ができるといいかなと思っています。

これも数日でできそうなのでできたらまたブログに書きます。

もっとPaaSっぽくしたい

PaaSと言っていますが、今はまだPaaSと名乗るほどなにもできていません。

たとえばWordPress等がいきなりインストールされているとか、ユーザーさんの好みの環境を一発もしくは数回のコマンドでつくれるようにしたいですね。

Ansibleをプリインストールしたので、PlaybookをCoderDojoコミュニティでいろいろ作れたら楽しそうです。

削除も自動化したい

CSVから行が削除されたらインスタンスを自動的に落とすとか考えたんですが、よく考えたらそれだとTravis CIの過去ログからRestartした時に一斉に削除してしまうことに気が付きました。

なにかいい方法ないですかね。

メンテナンス

たとえばパッケージのアップデートとか自動的にまとめてやれるといいかも。

インスタンスを起動後にサーバーのIPアドレスの一覧をJSONでつくっておくと、それをAnsibleで利用してまとめて apt-get update とかできそうですね。

このあたりの仕組みもオープンにするとみんなでノウハウを蓄積できて楽しそう。

アクセストークンを漏らさないように注意!

もらしちゃった。。。

https://github.com/sakura-internet/node-sacloud/issues/9