Kanazawa.rb meetup #22でHerokuハンズオンやってきたよ!

もう更新が滞っていても気にしない日記となりましたが、みなさんいかがお過ごしですか。

というわけで 6/21(土) Kanazawa.rb のクラウド祭り第2弾、Heroku ハンズオンでサポートおじさんしてきたよ。おばたけーさんありがとう!!

Heroku | Cloud Application Platform

実際のところ当日まで heroku で遊んだ経験はなかったんですが(笑)

Herokuについての発見

  1. heroku postgres 以外の add-on を使わないならクレカ登録は要らない
  2. 1 アプリ 750 dyno-hour という無料枠が毎月適用される
  3. add-on も buildpack もアホほどある
  4. slug は毎日 cleanup される

2 がよく分からなかったんだけど、dyno-hour という考え方がキモで、dyno の数を増やしたりやらせる仕事が増えるとこの制限を超える。例えば単純な静的サイトで何も余計な仕事をしないのならこの無料枠に収まる。しかも複数のアプリを立ち上げてアプリごとにそれが適用される。ただし、無料アカウントの場合はアプリの数は5までらしい。

クレカ登録は billing info から。

3 の add-on も buildpack もすごく興味深かった。add-on を見るだけで世の中にこんなにいろんな開発者向けサービスがあるのかという驚きと発見があった。ports collection 眺めてアプリの存在を知るというか、なんかそんな感じ。

Perl に対応してる PaaS って見ないけどなんでかねーという話をコソコソしてたんだけど、buildpack の中にしっかり Perl があって、例によって miyagawa さんだった。すげーな、世界の miyagawa.

4 がいわゆる Heroku はファイルが消えるってやつ。Heroku は dyno 上に slug を作ってそこに repository と buildpack でアプリケーションの実行環境を用意するんだけど、この slug の cleanup が毎日入る(これたぶん ruby や add-on の更新の役目も担ってるんじゃないかな)ので、 repository に入っていないものは保存されませんということですね。

いろいろ妄想が膨らんだのでもっと heroku で遊ばないとダメだなと思った。

ハンズオンで気づいた点

今回のハンズオンは「RailsアプリをHeroku上にdeployする」というよくある形かなと思ったんだけど、祭りということでレギュラーメンバー以外もたくさん参加されたので、いろいろ予想外のことがあった。まとめておくね。

git + ssh

heroku toolbelt 入れといてねという話は一応あったんだけど、そもそも heroku が git を利用しており、transport に ssh を使うというところで、

  • git
  • ssh

というハードルがあった。これ実は Windows ユーザーにはあまり優しくない。ただ、2014年現在は Git for Windows を入れれば msys で

  • bash
  • openssh

が使えるので話はだいぶ楽になる。そしてこれが重要なところなんだけど、 heroku コマンドから何からすべて Git Bash 上で操作すること 。でないといろいろ面倒になる。

heroku + ssh

heroku keys:add で公開鍵を add できるんだけど、git push とか実際にそれと対になる秘密鍵を探すシーンでは ssh コマンドのサーチルールに従うので、openssh であれば

~/.ssh/config

Host heroku.com
  IdentityFile /path/to/private_key

みたいな設定をしておくとよい。

すべてデフォルトの ~/.ssh/id_rsa, ~/.ssh/id_rsa.pub を使っているなら面倒はないんだけど。

※ ちなみに自分は以前 github 用に作ったとおぼしき公開鍵を heroku keys:add が探し出したので upload したんだけど、その passphrase を覚えていなかった(たぶん結局使わなかったんだと思う)うえに公開鍵を保存してなくて秘密鍵から生成し直すとか余計な作業をしていた。

ssh-keygen + Japanese Username

ssh-keygen で鍵を作る際、ユーザー名とホスト名が利用されるんだけど、ここで Windows ユーザーはユーザー名に日本語を使っているとそれがそのまま鍵ファイルの中に入ってしまう。

この状態の公開鍵を heroku keys:add で upload しようとすると application error が返ってきて進まない。application error というのが意味がよく分からないので、これは heroku 側の想定漏れじゃないかな。もしかしたら heroku コマンドを使わずに dashboard から登録したら大丈夫だったりするのかな、これ。誰か追試頼む。

cf. WindowsでRuby, Rails, PostgreSQLをインストールしてherokuにデプロイする方法 - dari88's diary

repository は ssh の鍵が必要ないように

これは今回のデモアプリの repository が github にあったんだけど、github に鍵を登録して普段から使っている人でないと git+ssh protocol で clone できないという問題。これは https の URI に差し替えることで解決。

普段から github を普通に使っていることを前提にしてはいけないという教訓を得た。やーやっぱハンズオンてむずいね。

Windows + Ruby

はい、 RubyInstaller for Windows ですね。

Rails + pg gem

これも PostgreSQL が入っていないと bundle install できないので、

bundle install --without production

で。

Rails + native extension

Mac で rbenv や rvm で ruby を入れてるなら問題ないんだけど、そうでないとビルド環境を新たに用意する必要がある。Windows なら RubyInstaller にある devkit を利用する。具体的には json gem とかが引っかかる。もうここら辺で心が折れる。

Windows + foreman

そもそも自分は foreman を知らなくてですね。えへ。

http://ddollar.github.io/foreman/

David Dollar ってすごいお金のにおいのする名前だなーとか失礼なことを思いながら、あー Procfile を使って環境を整えるために使うんですね、と理解。

で、どうもこれ Windows と相性が悪いらしい。最終的には自分がサポートしてた人たちは時間もないことなので、foreman は無視した。

Foreman installed by heroku toolbelt on windows can't be found - Stack Overflow

まぁ今だと .ruby-version とか Gemfile で Ruby のバージョンも指定できるし、それだけのために Procfile を使わなくても開発時には困らないので無視してよいとのこと。(てな話を懇親会の時に中の人に確認しておいたので間違ってないと思う。)

Mac でも pkg じゃなくて brew install で heroku-toolbelt 入れると foreman は勝手に入らないので別途

gem install foreman

が必要になるのもちょっとした落とし穴。

bundle install の利用する帯域

bundle install を一斉にするとネットワークがつらい。そもそもあの人数を全部 WiFi で処理できない。そこは

財力にモノを言わせてテザリングしてください作戦

でなんとかしたけど、アレしかないよなぁ。

それか会場 WiFi とインターネットの間に gem の mirror サーバ立てれればなんとかなるんだろうけど、そっちの方が手間の割に効果小さいもんね。

ハンズオンまとめ

Windows で Rails + git + ssh の組み合わせ、なかなかつらい。

Heroku ハンズオンが目的なら git と ssh はなんとかするとして Rails じゃなくてもっとシンプルに Sinatra アプリとかでいいのかもしんないなーと思ったりした。

いやーめっちゃ Windows に詳しくなった!

meetupまとめ

Yo!!1

More