ACLをどうにかしたい話(3)

herokuで公開してみた

Web Frontend を Sinatra アプリとして作ってみました。って話だったんですが、いまこれを VMware Player 上のマシンで作っていたので、試しに使ってみようとすると、

  1. vmware player起動する
  2. ssh login
  3. WEBrick起動

という手間がかかるわけです。そして家の外(会社?)からは使えないし(規則的にもシステム的にも社内からはVPNでけん)。そんなわけで heroku で動かすようにしてみました。

って、ブックマーク代わりにURL貼り付けておこうと思っただけでこのエントリ書いているのですが、これだけだと中身が何も無いので、heroku の使い方も書いてみようかな、と思います。もういろんなところにこの程度の情報は転がってるんだけど、個人的メモとして。

heroku 使ってみる

サインアップ

Heroku | Cloud Application Platform 真っ先に "Sign up" リンクが表示されるので素直にメールアドレスを登録します。入れたメールアドレスに、confirm link のはいったメールが届くのでそっちをクリックするとサインアップ完了。パスワードとかを設定します。

Heroku Toolbelt のインストール

ログインするとまずは Heroku Toolbelt をインストールすべし、ってリンクがでてるので、開発機のOSに合わせてインストールします。自分は Debian/Ubuntu です。

stereocat@oftest07:~$ wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh

[略]

Setting up libruby1.9.1 (1.9.3.194-8.1ubuntu2.1) ...
Setting up ruby1.9.1 (1.9.3.194-8.1ubuntu2.1) ...
update-alternatives: using /usr/bin/gem1.9.1 to provide /usr/bin/gem (gem) in auto mode
update-alternatives: using /usr/bin/ruby1.9.1 to provide /usr/bin/ruby (ruby) in auto mode
Setting up foreman (0.63.0) ...
Setting up heroku (3.3.0) ...
Setting up heroku-toolbelt (3.3.0) ...
Processing triggers for libc-bin ...
stereocat@oftest07:~$

heroku login してCLI上からログインします。このとき、ssh 公開鍵を持っているかどうかとかがチェックされて、持っていなければ自動的に鍵作成・公開鍵の heroku への登録が行われます。(heroku.com のWeb上からも鍵登録できる。鍵周りの設定ちゃんとやれば heroku login はいちいちやらないでもアプリをデプロイできる。)

stereocat@oftest07:~/cisco_acl_web$ heroku login
Enter your Heroku credentials.
Email: **********************
Password (typing will be hidden):
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading SSH public key /home/stereocat/.ssh/id_rsa.pub... done
Authentication successful.
stereocat@oftest07:~/cisco_acl_web$ ls ~/.ssh/
id_rsa  id_rsa.pub  known_hosts
stereocat@oftest07:~/cisco_acl_web$
アプリケーション起動用ファイルの作成

今回、既にアプリは要件を満たした状態で作ってあったので、heroku 上で実行するための設定ファイルとチェックだけします。アプリを動かすために必要な要件は bundle でパッケージ依存性解決できることと、git でファイル管理されていることです。

で、起動用ファイル(Procfile)の作成。Sinatraで実行するように書くとこんな感じ。

stereocat@oftest07:~/cisco_acl_web$ cat Procfile
web: bundle exec ruby lib/application.rb -p $PORT
stereocat@oftest07:~/cisco_acl_web$

foreman コマンドでチェックします。(heroku toolbelt インストール時にまとめて入っている)

stereocat@oftest07:~/cisco_acl_web$ foreman check
valid procfile detected (web)
stereocat@oftest07:~/cisco_acl_web$

OKならそのままWEBrickも起動してみる。

stereocat@oftest07:~/cisco_acl_web$ foreman start
23:53:19 web.1  | started with pid 2087
23:53:21 web.1  | [2014-02-14 23:53:21] INFO  WEBrick 1.3.1
23:53:21 web.1  | [2014-02-14 23:53:21] INFO  ruby 2.0.0 (2013-06-27) [x86_64-linux]
23:53:21 web.1  | == Sinatra/1.4.4 has taken the stage on 5000 for development with backup from WEBrick
23:53:21 web.1  | [2014-02-14 23:53:21] INFO  WEBrick::HTTPServer#start: pid=2090 port=5000

localhost:5000とかでアクセスして問題なく動いていればOK.

Lockfileとか

このあと heroku 上にデプロイしていくのですが、デプロイするときにいくつか引っかかったところがあったのでそこを先に書いておきます。

  • Gemfile.lockリポジトリに入れておくこと
    • アプリケーションとして動かす場合 lockfile を追加しておきます。(Bundlerでひな形を作成した場合、.gitignoreGemfile.lock が書いてあったりするので消しちゃいましょう。)
    • lockfile がないとアップロード(git push)したときに reject されるよ。
  • Gemfileruby version を指定しておく。
stereocat@oftest07:~/cisco_acl_web$ cat Gemfile
source 'https://rubygems.org'
ruby '2.0.0'

# Specify your gem's dependencies in cisco_acl_web.gemspec
gemspec
stereocat@oftest07:~/cisco_acl_web$
    • 無くても動くんですが、その場合、デプロイ実行時に使っている ruby のバージョンが指定されます。
アプリケーションのデプロイ

アプリ作成

stereocat@oftest07:~/cisco_acl_web$ heroku create cisco-acl-web
Creating cisco-acl-web... done, stack is cedar
http://cisco-acl-web.herokuapp.com/ | git@heroku.com:cisco-acl-web.git
Git remote heroku added
stereocat@oftest07:~/cisco_acl_web$

heroku create の後にアプリケーション名を指定します。これで http://cisco-acl-web.herokuapp.com/ で使えるようになる。(何も考えずにパッケージ名コピペして名前指定したら "Name must start with a letter and can only contain lowercase letters, numbers, and dashes." っていわれたんで DNS 名としてして名前をつけましょう。) 名前指定が無ければ適当な名前が振られるとのこと。いずれにしろ名前は後で heroku のアプリ管理画面から変更できる。

これをやると手元にリモートリポジトリ(heroku)が増えているはずです。

stereocat@oftest07:~/cisco_acl_web$ git remote
heroku
origin
stereocat@oftest07:~/cisco_acl_web$

あとはリモートへ手元のソースコードを push するだけで終わり。

stereocat@oftest07:~/cisco_acl_web$ git push heroku master
Initializing repository, done.
Counting objects: 68, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (52/52), done.
Writing objects: 100% (72/72), 9.63 KiB | 0 bytes/s, done.
Total 72 (delta 28), reused 0 (delta 0)

-----> Ruby app detected
-----> Compiling Ruby/Rack

[略]

-----> Discovering process types
       Procfile declares types -> web
       Default types for Ruby  -> console, rake

-----> Compressing... done, 13.4MB
-----> Launching... done, v3
       http://cisco-acl-web.herokuapp.com deployed to Heroku

To git@heroku.com:cisco-acl-web.git
* [new branch]      master -> master
stereocat@oftest07:~/cisco_acl_web$

いろいろ出るんでちゃんと読みましょう。あと、トータルどれくらいのサイズをアップロードしているかってのも出ます。無料版は容量制限があるので注意。

で、これでもうできてるので、メッセージに出てきているURL(http://cisco-acl-web.herokuapp.com) にアクセスするともう使える状態。

あとは heroku.com でログインして、 [Apps] から各種設定が可能ですが、無料の範囲内でとりあえず動けばいい、という程度であればコレで終わりです。お手軽。