tech.kayac.com

昨年の Advent Calender ぶりの登場です。@m0t0k1ch1 です。

表題の件につきまして、実は 7/31 に公開された こちらの記事 の実績一覧の一番上に載せていただいてもいたのですが、改めてこちらで報告させていただきたいと思います。

alphawing とは

https://github.com/kayac/alphawing

alphawing-ss.png

TestFlight2014/3/21 をもって Android のサポートを終了 してしまったので、それを代替するためのツールとして開発したのが、この alphawing です。簡単に表現すると、「Android 用の TestFlight」です。表題の通り、サーバーサイドは Golang で記述されています。

アプリケーションの詳しい起動方法などについては README をご参照ください。

アプリケーションの概要

alphawing-overview.png

  • アプリケーションにひもづいた service account を作成し、その service account に割り当てられた Google Drive の保存容量を用いて apk ファイルを管理しています。アプリケーションの内部では、基本的にこの service account を用いて各種 Google API を叩いています。
  • アプリケーションへのログインには Google OAuth を用いており、ログイン可能なドメインを限定することも可能となっています。
  • ストア先を Google Drive にしているので、Google Compute Engine との相性がよいです。

alphawing でできること

開発者

  • 任意のプロジェクト単位で apk ファイルをバージョン管理する
    • プロジェクトの登録
    • apk ファイルのアップロード(アップロード API も使用可)
    • 各プロジェクトごとのメンバー(:apk ファイルをダウンロードできるユーザー)管理

テスター

  • メンバーとして登録されているプロジェクトの apk ファイルを端末にダウンロードする

社内運用について

社内運用には docker を用いています。@fujiwara さん作の Urume で立ち上げた VM 上にコンテナを起動し、そのコンテナ上でアプリケーションを走らせています。

最後に

今後について

ipa 対応など、アプリケーションとして改善の余地はまだまだあるので、今後も継続して手を入れていきたいと思っています。もちろん、社外の方からのご要望・ご指摘・pull request もお待ちしております。

つくってみて

今回の開発にあたって触れることになった Golang、Google API、docker などは、どれも今までに扱ったことがないものだったので、自分の中では技術的に新しいチャレンジがたくさんありました。社内向けにリリースしたときには、すっかり Golang と Gopher くんのことが好きになっていました。

また現在、仕事の中で alphawing とはまた別のアプリケーションを Golang で書いていたりもします。運用をメインにやっている自分のようなエンジニアにも、こういった新しい技術を用いて初期段階からプロダクトの開発に参加できるチャンスがあるのは幸せな限りです。

最後の最後に

alphawing の開発にあたって、普段は別々のチームに所属している先輩方・同期のみんなと開発を進めることができました。これはとても楽しかったですし、非常に学ぶことが多かったです(どちらかというと自分は雑用してただけ。。)。ご協力いただいたみなさん、本当にありがとうございました!m(__)m

そして、、

カヤックではサーバーサイドを Golang で書いちゃう開発者を募集中です!

いやー今年もISUCONの予選参加募集がはじまりましたね! 昨年は出題側だったので胃が痛かったですが、今年は参加側ですので大変楽しみにしております。@acidlemonです。

Docker使ってますか?

さてみなさん、Docker使ってますか? 使ってる? 使ってない? ぼくは使ってませんでした。えー今どきBlue-Green Deploymentやってないの? Immutable Infrastuctureじゃないの? と言われそうですが、世の中にはいろんなしがらみとかもあってなかなか簡単にエイヤーでコンテナに移行できるわけでもないのは皆さんなんとなく感じているのではないでしょうか。

とはいえ、最近これだけ話題になっているDockerですので、そろそろ使ってみたいなぁ…ということで、まずは開発環境をDockerで上げられるようにしました。

Dockerでコンテナを作るときには2つのアプローチがあります。

一つはアプリケーションコンテナ。ステートレスなアプリケーションだけを入れて、永続ストアはコンテナの外におく。新しいアプリケーションをデプロイするときは新しいコンテナを作って上位のロードバランサをそちらに向けて、古いコンテナを破棄するというBlue-Green Deploymentのための使い方。

もう一つはサービスコンテナ。アプリケーションやストレージミドルウェアなどなど、サービスを動かすために必要なものを全部入れて作るコンテナです。これを作るメリットはどちらかというと「気軽に捨てられる」という感じなので、新しいバージョンをデプロイしたコンテナを手元や開発サーバで動かしてテストして、使い終わったらすぐコンテナを破棄するみたいな使い方です。

今回はサービスコンテナで開発中のサービスを気軽に立てられるようにしました。具体的にはワイルドカード付きのサブドメインをDockerが走っているホストに全部向けて、表においたnginxからコンテナにReverse Proxyします。

DockerfileにはMySQLとかRedisとかをインストールして、そのあとプロジェクトのリポジトリをcloneして、carton installして動作に必要なものを全部準備した状態のDockerイメージをビルドしておきます。RUNで実行するシェルスクリプトには、git pull、環境変数GIT_BRANCHを取ってきてgit checkout $GIT_BRANCH、そのあとcarton installで実行環境を最新化してProcletを使ったスクリプトを実行して必要なミドルウェア全部とWebアプリを立ち上げるようにしました。

ただ、これには一つ問題がありました。それは「エンジニアじゃないとコンテナ立てられないのでオレが忙しいのは変わらない」ということです。チームにはディレクターやデザイナーもおり、マスターデータやバナーなどのグラフィックをgitにコミットしてくれるのですが、結局それをデプロイしたコンテナを立てるという作業をエンジニアがやらないと、彼ら/彼女らが開発サーバで実地確認できないのです。

ということで、それを解決するためにmirageというツールをGoで書きました。前置きがちょっと長かったですね。

mirageのご紹介

mirageの機能と特徴はこんなかんじです。

  • RESTおよびWebのインタフェースで、Dockerコンテナを起動/停止することができます。その際、
    • サブドメインを指定して、コンテナへのリバースプロキシを提供します
    • gitのブランチ名を指定して、特定のブランチでサービスを構成できます
      • RUNで起動するプログラムから環境変数GIT_BRANCHにアクセスして指定したブランチ名を取得できます

インストールについてはREADMEにも書いてありますが、ビルド済みバイナリがありますのでこちらをご利用いただくのが便利です。簡単にどういう感じで動くのかという構成図をご覧ください。

mirage概要図

図がフルスタックすぎてよくわかりませんね! ということで使い方で機能を説明したいと思います。

まずDockerfileを作って、docker buildでイメージが出来てるという前提からスタートします。また、REST API、Web Interfaceどちらを使っても同じ機能を利用できますが、説明が面倒なのでここではcurlで説明します。

コンテナの起動

あなたはトピックブランチでの開発を終え、開発サーバにデプロイして実際に動かしてみることにしました。トピックブランチの名前はfeature/cool-cool-coolです。さぁ、cool.myapp.example.net でfeature/cool-cool-coolブランチをデプロイしたコンテナにアクセスできるようにしましょう。

curl http://docker.myapp.example.net/api/launch \
  -d subdomain=cool \
  -d branch=feature/cool-cool-cool \
  -d image=myapp:latest

これで、コンテナが起動します。mirageは起動したコンテナをinspectしてコンテナのIPアドレスを調べます。起動後、cool.myapp.example.com にアクセスすると、mirageは接続を起動したコンテナへリバースプロクシします。

プロキシするポートはmirageの設定ファイルで指定可能です。例えば、mirageの8080ポートで待ち受けている通信をコンテナの5000ポートへリバースプロクシするといったことも可能です。また、複数のポートを待ち受けて、それぞれ指定したポートへリバースプロクシすることもできます。

コンテナの停止

feature/cool-cool-coolブランチの動作確認が終わったらもうコンテナはいらないので、破棄しましょう。

  curl http://docker.myapp.example.net/api/terminate \
    -d subdomain=cool 

これで、コンテナが停止します。停止したあとはcool.myapp.example.comにアクセスしても、mirageが404を返します。


はい! 非常にざっくりした説明でした!

いやーしかしこれはあれです。毎回curlでこんなに長いコマンドを叩いているのは大変です。そんなわけで、IRC botやhubotなどを利用している人は、botにcurlを叩かせればよいですね! もともとREST APIはそれ用に用意しています。bot作るのめんどいなーという人は、Web Interfaceで使ってみてください。

ちなみに、コンテナを起動するときのDocker Imageは基本的にほぼ固定になるとおもいます。そういう使い方であれば、mirageの設定ファイルでデフォルトのコンテナを指定できます。そうなれば、サブドメインとブランチを指定すればスポーンと上がってくるので、コンテナを起動するのがますます楽になりますね。

実際に活用するまでにDockerfile作ったりドメイン設定を変えたりみたいな感じでいろいろ仕込みが必要ですが、仕込んでしまえばあとは楽に使えます。

とはいえこの記事だけで使うのはちょっと大変かもしれません。実際に使い始めるまでのチュートリアルは別途書こうかなぁと思っています。なお、一刻も早く使ってみたいけどよくわからんという人は、8/29、8/30に開催のYAPC::Asia 2014で @acidlemon を捕まえて根掘り葉掘り聞いていただければと思います。それではYAPCの会場でお会いしましょう!

カヤックではYAPCでビール飲むのが好きなエンジニアや、Goでツール作ったりするのが好きなエンジニアを募集しています!

こんにちは、 @Konboiです。 久しぶりの更新です。

残念ながら自分のトークは採択されませんでしたが、このたび開催されるYAPC::Asia 2014に、KAYACからはマコピーのトークが2本採択されました。

ここでその内容を簡単にご紹介します。

macpy01.png

Perl meets Real World 〜ハードウェアと恋に落ちるPerlの使い方〜

Perlといえば電子の世界に閉じたプログラムを書かれる方が多いと思われますが、その対極に位置すると思われていた現実世界に干渉しうるハードウェアプログラミングの分野が、ここ最近かなりウェブ系技術に接近しています。

そこでこのトークでは、いかにPerlやカジュアルなツールを用いて自由自在に電子回路を組み上げ、望み通りのハードウェアを作り出し、Perlとともに現実世界に生まれ落ちる方法を伝えたいと思っています。

特にArduinoやRaspberryPiなどMaker文化の中心にあるデバイスたちをメインに、電圧の測り方からカジュアルな電子回路の組み方、Perlを使ったネギの振り方までエッセンスを抜き出して話します。

趣味開発のためのクラウド/VPS活用術

仕事でプログラムを書く時は指定された環境や、便利な社内ツール群、相談にのってくれる仲間や、何より豊富なコンピューティングリソースがあるでしょう。

しかし仕事から分離された趣味の開発ではそういったサーバは使えないことがあるわけで、それをどのように調達したり工夫を行うことで、いかに自分のポケットマネーから最大の自己満足感を得られるかを紹介させていただきます。

以下の様な内容を紹介させていただきます。

  • おすすめのVPS/クラウドサービス 作業用、助っ人、本番用、それぞれの使い分け
    • Amazon EC2/S3 etc, Google Cloud Platform, Digital Ocean, VULTR, さくらのVPS etc...
  • 自宅サーバという選択肢におけるメリット・デメリット
    • 超低消費電力サーバ RaspberryPi で出来る事出来ないこと
  • 作業場という意味での自宅やコワーキングスペースとか図書館
  • ホビーとしてのPerl

スクリーンショット 2014-07-24 18.07.46.png

以上 マコピー のトークをご期待ください。ソーシャルメディアを通じて投票してくださった皆様、ありがとうございました!

カヤックはYAPC::Asia 2014のスポンサーもしています

スピーカー以外にもKAYAC社員も多数参加する予定ですので、

採択されなかったトークに興味がある人、KAYACに興味のある方もそうでない方もお気軽に話しかけていただけると幸いです。

KAYACではエンジニアを大募集しています。

カヤックでは現在、絶賛エンジニアを募集中です。 Perlに限らず、Webサービス、スマートフォンアプリ開発、ゲーム開発興味のある方、ハードも触れるエンジニアを募集中です!!

仲間募集