Spark Framework on OpenShift

RedHatのPaaSであるところのOpenShiftSpark Framework製のアプリを動かす手順メモ。

HerokuがDynoの価格設定を変更して無料ユーザにやや厳しくなるらしい(Heroku changing up dyno pricing)ということもあって(?)、前から興味のあったOpenShiftを試しました。OpenShiftは今のところ1アカウントで3つまで無料でアプリ立てられるようです。

ローカルで作ったアプリをOpenShift上のGitにプッシュしてデプロイできるのはHeroku的なノリで良い感じです。 必要な実行環境(今回はJava8)やビルドツール(今回はMaven)も「Action Hooks」と呼ばれるスクリプトを書いて自前でインストールできます。Herokuのビルドパックみたいな感じですかね。

SparkアプリをOpenShiftで動かすそのものズバリなサンプルがあった↓のでこれを手本にしました。だいたいこの通りにすればできます。
参考:spark-openshift-quickstart

  • Spark2.1
  • Java8

■Sparkアプリを作成する

まず普通にSparkアプリを作る。

  • プロジェクト名は「sparktest」とする。

pom.xml

  • Spark2.1の依存性を追加する
  • maven-compiler-pluginでコンパイルJavaバージョンを1.8に指定する
  • maven-shade-pluginで依存ライブラリも含んだ単独で実行可能なjarを生成するよう指定する(メインクラスも指定しておく)

依存ライブラリインストール&Eclipseプロジェクト化

Spark Frameworkでごく単純なサーバ書く

  • /hello にアクセスすると Hello World と返すだけのサーバ
  • IPアドレス・ポートは環境変数から取るようにしている

jarファイルを叩いて動作確認する

動作確認する。実行可能jarにパッケージングして生成されたjarを叩いてアプリが動けばオッケー。

こんなん。
sparktest_2015-04-05

Sparkアプリはこれで出来たことにする。
次からはOpenShift側の作業。

■OpenShift上にアプリケーションを作成する

ここからOpenShiftでアプリ作っていく。アカウントさっさと取っておく。

ローカルにOpenShiftのCLIインストールする

ローカルのコマンドラインでOpenShiftを操作できるCLIをインストールする。
Getting Started with OpenShift OnlineからローカルマシンのOSにあわせてインストールする。
これで「rhc」というコマンドが使えるようになる。

Do-It-Yourselfカートリッジ形式のアプリケーションを作成する

上でインストールしたCLIでOpenShift上にアプリを作る。OpenShift的にはアプリは「カートリッジ」と呼ぶらしい。
OpenShiftは「Java」「JBoss」「Jenkins」といったように「言語」「サーバ」「アプリ」それぞれのレベルで様々なカートリッジのひな形?が提供されているが、
今回作りたいSpark(つまりJetty)用のひな形は無いようなので、空っぽのカートリッジを作る「Do-It-Yourself」形式を選ぶ。

  • アプリケーション名は「sparktest」とする

  • 以下のようなログが出力される

すでにmvnコマンドで同名のディレクトリ作っていたのでOpenShiftからクローンできないわ、みたいに怒られるけどアプリケーション作成自体は成功した模様。
なのでOpenShift上のgitをリモートに登録してローカルにマージする

■Action Hooksスクリプトを記述する

OpenShiftのgitからソース落とすとルートに .openshift というディレクトリができている。
この中の action_hooks ディレクトリにアプリのデプロイ時・起動時・停止時に動かしたいスクリプトを書いていく。
最終的に以下のようにする。

Action Hooksスクリプトについては以下参考。

以下それぞれのスクリプトの説明(といってもほとんど参考サイトそのままだけど)。

deployスクリプト

  • Java8インストールする
  • Maven3インストールする
  • mvn installしてプッシュしたアプリを実行可能jarにパッケージングする
  • ※その際にMavenのsettingsファイルを指定し、OpenShift上のローカルリポジトリを書き込み権限のある app-root/data ディレクトリにする
  • ※ぶっちゃけこの辺りの作業は「rhc ssh」でOpenShiftに入って事前に手動で済ませておくこともできそう。スクリプトでやるのが格好良さそうなので…。

setting.xml

startスクリプト

  • Javaのパス通す
  • IPアドレスとポートをOpenShiftの独自環境変数からアプリで参照している環境変数に移し変える(ソースコードの中に「OPENSHIFT〜」とか書くのが嫌だったので)
  • java -jar コマンドを叩いてアプリを起動する

stopスクリプト

  • Javaプロセスを殺す
  • ※stopスクリプト大事。ちゃんと停止しないとアプリが生き残り続けて次にデプロイしようとした時に「port already used」的なエラーになってしまうので

■OpenShiftにpushしてデプロイする

OpenShiftのgitにpushするとデプロイ処理が走る。

※deploy時に実行権限エラー出る場合

意気揚々とgit pushしたらこんなエラー出た。

verion52はJava8のことらしい。実行環境(OpenShift)のJavaバージョンが古い疑惑。
Java8インストールするように指定してるのになんでーと思ってログをよく見るとこんなこと言われてる。deployスクリプトに実行権限無くてデプロイ処理が行えていなかったようだ。

言われた通り実行権限つける。

これでプッシュし直すとデプロイ成功し、アプリが起動した。

こんなん。
sparktest_openshift_2015-04-05

デプロイ成功した後は

  • rhc app stop -a
  • rhc app start -a

とかで停止・起動できる。
参考:Common RHC (Command Line Tool) Commands

ところで Heroku config的なやつ

今回は使ってませんがデータベースのID/PASSWORDとか外部連携サービスのキー情報などの機密情報は、コードや設定ファイルに持たせずにプラットフォームの環境変数にコマンドからぶち込みたいものです。
Heroku config的なのはOpenShiftでは以下のようにやればできます。
参考:Custom Environment Variables

カスタム環境変数を設定する

確認する

削除する

■OpenShiftイイネ

DIY(Do-It-Yourself)カートリッジを使ってSpark Frameworkアプリが簡単にOpenShiftにデプロイできました。素晴らしい。データベースなどもGearとかいう概念でアドオン的にインストールして使えるそうなのでどしどし試して行こうと思います。
ちょっとした要望としては、ドメインにハイフンも使えるようにして欲しいものです(現状は英数字のみ)。


コメントを残す