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

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Develop Document Jekyll