tanaka's Programming Memo

プログラミングについてのメモ。

HerokuでJava

PaaS(Platform as a Service)のherokuを使って見る。言語はとりあえずJavaで。

下準備

  • herokuの公式ページに接続
  • 登録がまだであれば、[Sign up]から登録してログインする
  • Javaの[Get Started]をクリック

herokuでJavaを利用するときの要件

  • herokuに登録していること
  • JDK1.6以降がインストールされていること
  • Maven 3をインストールしていること

Maven 3をインストールする

Maven 3とは、Apacheプロジェクトの1つで、ソフトウェアプロジェクトのビルドを支援するツールである。同様のツールに、makeやantがある。

  • herokuページの[Maven 3]へのリンクをクリック
  • Maven 3.x.x (Binary zip)の行のLinkのファイルをクリックしてダウンロード
  • ファイルを解凍する
  • 解凍したフォルダを適当な場所に置き、binフォルダにパスを通す
  • 環境変数JAVA_HOMEが、JDKのフォルダを指していることを確認する(設定方法はこちら→

PATHの設定及び環境変数JAVA_HOMEの設定 - Javaダウンロードとインストール
)

Herokuの環境を構築

  • コマンドウィンドウが開いていたら閉じる
  • [Download Heroku Toolbelt for Windows]をダウンロードしてインストール
  • コマンドを開く
  • heroku loginと入力して、herokuのアカウントでログインする
  • ログインに成功したらここまでの作業完了

簡単なアプリの公開の事前準備

  • cd Documentsなどで、コマンドラインのパスを適当な場所に移動する
  • webにあるコマンドを入力して、herokuのGithubリポジトリからサンプルデータをクローンして、そのフォルダ内に移動する
  • フォルダ内には、gitリポジトリと、Maven用の設定であるpom.xmlが入っている

アプリを公開する

  • heroku create で、Heroku上のアプリを作成する
  • heroku アプリが作成されると、herokuという名前のgit remoteが作成されて、ローカルリポジトリと紐付けられる
  • herokuは、アプリにランダムな名前(dry-stream-401など)を生成する。これはあとでheroku apps:renameで変更できる
  • 生成が終わったら git push heroku master で公開する。完了するまで1分ほど時間がかかる
  • heroku ps:scale web=1 を実行すると、少なくとも1つのインスタンスが動作する
  • heroku open でページにアクセスできる。URLは、https://アプリ名.herokuapp.com となる

ログを見る

  • heroku logs --tail を入力すると、herokuのサービスのログを監視できる
  • 公開したページを再読み込みすると、ログにアクセス履歴が追加される
  • ログ表示は[CTRL]+[C]で停止できる

Procfileの定義

  • Procfileは、アプリフォルダに入っているテキストファイ
  • テキストエディタで開くと設定が見れる
  • Procfileは、アプリをどのコマンドで起動するかを明示的な宣言である
  • サンプルは web: java -cp target/classes:target/dependency/* Main とあり、1つのプロセス型であるwebの定義であり、アプリを起動するのに必要なコマンドである
  • web は重要な定義であり、herokuのHTTP routing スタックに接続されており、公開した時にwebの交信を受信するものである
  • Herokuの実行単位であるdynoがこのコマンドで実行される。これはUnixのコマンドである
  • Windows上で動作させるためには、このままでは文法エラーになるので、以下のように修正する
    • 新しくProcfile.windowsというファイルを作成
    • 作成したファイルをメモ帳などで開き、以下のように追加
web: java -cp target¥classes;"target¥dependency¥*" Main
    • foremanを使ってアプリを走らせる時に指示を見たら、Windowsに -f Procfile.windows フラグを明示的に追加する。
foreman start web -f Procfile.windows
  • Procfilesは追加のProcess typeを追加できる

アプリのスケール

  • 現在、アプリが1 web dynoで動作している。dynoは、Procfileで指定されたコマンドを動作させる軽量なコンテナである。
  • いくつのdynoが動作しているかは、 heroku ps で見ることができる
  • 1つのweb dynoで動作させている場合、1時間動きがないとスリープに移行する。スリープしたアプリが起動するには数秒かかる。その後はすぐに動作するようになる。
  • この症状をなくすには、もう一つのdynoを追加する。これをscaleという。
heroku ps:scale web=2
  • 不正防止のため、アプリをスケーリングをするには、承認アカウントが必要である
  • アカウントをまだ承認していない場合は、認証ページにいって登録する
  • アプリごとに、1時間に750 dynoが無料で提供される。アプリを2 dynoで動かすとこの制約を越えることになる。越えたら1 dynoに戻る(最低で、1日24 dyno。31日で744 dyno)

アプリの依存関係の定義

  • Herokuはルートディレクトリのpom.xmlファイルで、アプリがJavaであることを認識する
  • アプリのための設定は、 mvn clean install で生成できる
  • サンプルのプロジェクトには、あらかじめpom.xmlが入っている
  • pom.xmlで、アプリの動作に必要な環境が書かれている。アプリが公開される際に、Herokuはこのファイルを読み込んで、mvn clean installコマンドを使って、必要な環境をインストールする
  • system.properties ファイルでは、javaのバージョンを定義している。このファイルはオプション
  • mvn clean install を実行すると、ローカルディレクトリに依存環境がインストールされるので、ローカル環境でアプリの動作を確認することができる

ローカルでアプリを動かす

  • foreman を使って、アプリを開始できる
foreman start web
  • エラーが発生したら、先の -f Procfile.windows を追加する
  • ローカルアプリは http://localhost:5000 で動作する。curlやWeb Browserで確認する。curlの場合、[Ctrl]+[C]で停止
  • この状態ではまだ自由なアプリは実行できない。あとで出てくる config vars の設定が必要

アプリの更新方法

  • チュートリアルの指示に従って各ファイルを編集
  • 依存環境が変更になったので、 mvn clean install でインストールをし直して、foremanでローカルで起動
  • 動作が確認できたら、デプロイする
  • gitに追加
git add .
  • gitにDemoとメッセージを添えてコミット
git commit -m "Demo"
  • リモートにプッシュする
git push heroku master
  • herokuに公開する
heroku open

続く・・・