通常、アプリケーションを作成してクラウドにデプロイする場合、サーバーのセットアップや、自分が信頼する Linux ディストリビューションによるサーバーの構成、必要なランタイムのインストール、データベースのインストールと構成、ライブラリーの依存関係への対処、そしてサーバーのセキュリティー確保などに多くの時間がかかります。しかし、IBM Bluemix を使用すれば、コードを作成することだけに専念することができ、わずか数秒でデプロイすることも可能になります。
“簡単なブログを作成することによって、Bluemix 上で Rails アプリケーションを作成してデプロイするのがいかに簡単であるかを示します。”
この記事では、IBM Bluemix と Ruby on Rails を使い始めるプロセスを紹介するためのサンプル・アプリケーションとして、必要最小限のブログを作成します。私たちが紹介するのは、Rails アプリケーションを作成するステップ、SQLDB データベース (IBM DB2 で動作する Bluemix サービス) を作成するステップ、作成したデータベースにアプリケーションを接続するステップ、そしてアプリケーションをデプロイして実行するステップです。この簡単なブログを作成することによって、Bluemix 上で Rails アプリケーションを作成してデプロイするのがいかに簡単であるかを明らかにします。
必要となるもの
- Bluemix アカウント。無料の試用版にサインアップしてください。
- Ruby 1.8.7 ~ Ruby 2.0.0 のいずれかのバージョン (Bluemix によってサポートされているバージョン)
- Rails フレームワーク 3.2.13 (Bluemix と ibm_db gem によってサポートされているバージョン)
- ibm_db gem
- Cloud Foundry CLI ツール
- Sublime Text などのテキスト・エディター/IDE
このアプリケーションでは、Ruby 1.9.3 と Rails 3.2.13 を使用します。以下の手順を開始する前に、確実に上記のソフトウェアが皆さんのローカル開発マシンにインストールされている状態にしてください。
この記事は、Ruby プログラミング言語と Ruby on Rails フレームワークについて十分理解していることを前提としているため、読者がこの前提を満たしていると助けになりますが、この記事を読み進めていく上で必ずしも必要というわけではありません。
ステップ 1. Ruby on Rails アプリケーションを作成する
- コマンド・プロンプトを開き、新しい Rails アプリケーションを作成します。この例では、新しいアプリケーションの名前は以下に示すように「
Blog
」です。$ rails new Blog
ご使用の環境に複数のバージョンの Rails がインストールされている場合、使用するバージョンをここで以下のように指定することができます。
$ rails _3.2.13_ new Blog
- 正常に動作していることの簡単なテストとして、別のコマンド・プロンプトを開き、Rails サーバーを起動します。
rails new
コマンドで作成されたアプリケーション・ディレクトリー (この例では、Blog
ディレクトリー) 内で、必ず以下のコマンドを実行します。このコマンドを実行すると、開発モードで WEBrick が起動され、ポート 3000 で HTTP リクエストを受信するようになります。$ rails s
- 起動したばかりのローカル Web サーバーに対してリクエストを送信するため、ブラウザーで http://localhost:3000 にアクセスします。すると、以下に示すようなページが表示されるはずです。これにより、サーバー上でアプリケーションが正常に実行されていることが確認されます。これでサーバーを支障なく停止することができます (例えば、CTRL+C を押して停止します)。
ステップ 2. モデル、ビュー、コントローラーを作成する
このアプリケーションを作成するにあたっては、scaffold を生成することにします。scaffold は、Rails によって提供されるスターター・テンプレートで、ブログ投稿のモデル、コントローラー、そして関連するビューをバンドルしています。
- 以下のコマンドを使用して、新しい scaffold を作成します。各投稿にはテキストのタイトルと本文があるため、この投稿 (
Post
) モデルには、データベース内でstring
列 およびtext
列として表される、title
およびbody
という 2 つのフィールドがあります。$ rails generate scaffold Post title:string body:text
以下のスクリーン・ショットには、コマンドが自動的に生成した一連のファイルが表示されています。この一連のファイルには、先ほど指定したフィールドに従ってデータベース内にテーブルを作成する上で必要な情報が記述された、
db/migrate
内のマイグレーション・ファイルが含まれています。 - scaffold を生成した後、開発データベースに実際の
Posts
テーブルを作成する必要があります。Rails フレームワークでは、Rails の原則である「設定より規約」を守り、デフォルトでは SQLite データベースを事前に構成してあります。テーブルを作成する上で必要なことは、マイグレーション・ファイルを実行することのみです。具体的には、以下のコマンドで作成することができます。$ rake db:migrate
Rake とは、Rails フレームワークで広く採用されているタスク管理ツールです。各 Rails プロジェクトには、一連の Rake タスクが組み込まれています。この例では、データベースのマイグレーションを実行しただけで、
Posts
テーブルが作成されました。
ステップ 3. Rails アプリケーションを編集する
- 最初に、作成したアプリケーションのホーム・ページを変更します。エディターを使用して
config/routes.rb
を開き、アプリケーションの/
(ルート) パスがposts
コントローラーのindex
アクションで処理されなければならないことを Rails に知らせるために以下のコードを追加します。root :to => 'posts#index'
- 次に、パブリック・フォルダーにアクセスし、index.html ファイルが Web サーバーによって表示されることがないように、このファイルを別の名前 (index_.html など) に変更するか削除します。
- その後、再度 Rails サーバーを起動して変更を確認します。確認後は、サーバーを停止しても構いません。
ステップ 4. Ruby on Rails アプリケーションを Bluemix 上で作成する
- Bluemix Web サイトにアクセスし、ログインします。Bluemix のアカウントをまだ作成していない場合は、無料のアカウントを作成してください。
- ログインすると、ダッシュボードにリダイレクトされます。ダッシュボードには、「Applications (アプリケーション)」セクションと「Create an Application (アプリケーションの作成)」リンクが見つかるはずなので、このリンクをクリックします。
表示されるカタログには、選択可能なコンポーネントが多数あるはずです。通常、任意のランタイムを選択し、必要に応じてコンポーネントやサービスを追加します。
この例では Rails アプリケーションを Bluemix 上で作成してデプロイしようとしているため、Ruby on Rails ランタイムを選択し、作成するアプリケーションの名前とホスト名を「
Name
(名前)」と「Host
(ホスト)」にそれぞれ入力して、「CREATE (作成)」をクリックします。ホスト名は Bluemix エコシステム内で一意でなければならないため、名前を工夫する必要があるかもしれませんが、一意のホスト名にすれば、アプリケーションの URL も一意になり、いつでも共有可能な状態になります。
「CREATE (作成)」をクリックすると、サンプル Rails アプリケーションが Bluemix 上で実行され、皆さんのダッシュボードに表示されます。このアプリケーションのリンクをクリックすることで、クラウド上で実行されているサンプル・アプリケーションにアクセスすることができます。
- この Bluemix アプリケーションには投稿情報を保管するようにしたいので、その情報を永続化するためのデータベースを作成する必要があります。このアプリケーションでは、IBM DB2 をベースとする SQLDB サービスを使用します。そのために、皆さんの「Dashboard (ダッシュボード)」から「Services (サービス)」にアクセスし、「Add a Service (サービスの追加)」をクリックします。
- 「Data Manaement (データ管理)」カテゴリーで「SQLDB」をクリックします。作成した Rails アプリケーションを選択し、追加するサービスの名前として任意の名前 (ここでは「
blogSQLDB
」) を入力し、「CREATE (作成)」をクリックします。アプリケーションを再起動するよう促すプロンプトが表示されたら、「OK」をクリックします。
- 作成したばかりの Bluemix アプリケーションの URL にアクセスすると、皆さんを歓迎するページが表示されることにお気付きになるかと思います。この「Welcome (ようこそ)」メッセージを表示するアプリケーションは、Rails ランタイムを選択するとすぐに Bluemix によって提供されるサンプル・アプリケーションです。この Bluemix のサンプル・アプリケーションは、クラウド上で何の問題もなく実行されています。私たちは、このアプリケーションにデータベース・サービスも追加しています。
しかし、このサンプル・アプリケーションは私たちの Blog アプリケーションではありません。ここでこのサンプル・アプリケーションに注目するのは、単に私たちのアプリケーションを Bluemix にデプロイする上で必要な情報を指定する manifest.yml という名前の重要なファイルがこのサンプル・アプリケーションに含まれているからです。
ここでの作戦は、サンプル Bluemix アプリケーションからこの manifest.yml ファイルを取得し、私たちのローカル Blog アプリケーション内で使用するというものです。こうすることで、現在 Bluemix 上で実行されているサンプル・アプリケーションを実行し続けるのではなく、私たちの Blog アプリケーションを Bluemix へプッシュできるようになります。
皆さんのダッシュボードの「Applications (アプリケーション)」セクションで、新しく作成したアプリケーション・タイルをクリックします。このアプリケーション・タイルから、ページの右上にある「VIEW QUICK START (クイック・スタートの表示)」ボタンをクリックすることができるはずです。このボタンをクリックすると以下のスクリーン・ショットに示されているように、アプリケーションを開始するためのウィンドウが表示されます。次に「Download the starter application package (スターター・アプリケーション・パッケージのダウンロード)」をクリックします。
- パッケージを展開し、展開された manifest.yml ファイルをコピーして、ローカル Blog アプリケーションのディレクトリーに貼り付けます。
前述のように、manifest.yml ファイルはアプリケーションをデプロイするときに Bluemix で使用されます。このファイルには、追加されたサービス (ホスト、インスタンスの数など) に関する情報が記載されています。
注: manifest.yml ファイルを取得する別の方法として、JazzHub にあるリポジトリーからダウンロードする方法があります。この方法で取得した場合は、サービス名、ホスト、その他の情報を皆さんのアプリケーションに関連する内容に変更することを忘れないでください。
ステップ 5. Bluemix 上で Blog アプリケーションをデプロイするための準備をする
- 私たちのアプリケーションは IBM DB2 で動作する SQLDB サービスを使用しているため、このローカル Blog アプリケーションは DB2 とやりとりできなければなりません。DB2 とやりとりするには、皆さんのプロジェクトの Gemfile に「
gem 'ibm_db'
」という記述を追加することで、ibm_db アダプターをインストール対象に含める必要があります。「
gem 'sqlite3'
」という行は、私たちの Bluemix デプロイメントでは使用しないため、コメント・アウトするか削除してください。ファイルの上の方に「ruby '1.9.3'
」(またはご使用の Ruby のバージョン) という記述を含めることで、Ruby のバージョンを設定します。 - 以下のコマンドを実行し、ローカル開発環境に gem をインストールします。
$ bundle install
注: ibm_db アダプター (Ruby gem) をインストールすると、アプリケーションでは DB2 をローカルでセットアップして構成するまで、または (例えば、開発モードでのみ) データベースを SQLite に再度戻すまで、rails サーバーをローカルで起動して実行することができなくなります。
- ここで、本番環境の設定を変更しましょう。config/environments/production.rb を開き、asset 関連の 2 つの構成パラメーターを true に設定します。
config.assets.compile = true config.serve_static_assets = true
- データベース (database.yml) との接続を設定することは、Rails アプリケーションをデプロイする上で重要なステップとなります。ただし、Bluemix 上に Ruby on Rails アプリケーションをデプロイする場合は、database.yml ファイルは書き直されて
VCAP_SERVICES
変数から自動的に読み込むように設定されます。そのため、皆さんが追加したデータベース・サービスに対する接続を設定する必要はありません。以上は、Bluemix における開発をより迅速に行えるようにする方法の 1 つの例であり、そのためにコンポーネントとサービスが互いにやりとりする方法を簡素化しています。
ステップ 6. Bluemix 上でアプリケーションをデプロイする
コマンド・プロンプトを開き、以下の cf
コマンドを実行します。まだ cf コマンド・ラインをインストールしていない場合は、前述の (アプリケーションを開始するためのウィンドウにある)「Get Started with <appname> (<アプリケーション名> を開始)」メニューからインストールすることができます。
- まず、Bluemix に接続します。
$ cf api https://api.ng.bluemix.net
- 次に、Bluemix にログインします。
$ cf login -u <user.email>
パスワードを要求されたら入力します。ここで入力する e-メール・アドレスとパスワードは、Bluemix に登録したときに使用したものです。
- Bluemix 環境の中でマイグレーションを実行することで、SQLDB データベースにテーブルを作成します。
-c
オプションでコマンドを指定すると、コードをアップロードした直後にそのコマンドを実行することができます。この例では、指定したコマンドによってデータベースをマイグレーションしています。$ cf push <appname> -c "bundle exec rake db:migrate"
ヒント: アプリケーションをデプロイする際には、アプリケーションがプッシュされている間、アプリケーションのログを追いかけられるように、別のコマンド・プロンプトを開き、以下の
cf
コマンドを実行してください。$ cf logs <appname>
注: 上記の
cf push
を実行すると、アプリケーションはアプリケーション・サーバーへの接続を試行し続けますが、まだアプリケーション・サーバーを起動していないために失敗します。私たちは、マイグレーションしか実行していません。ログを確認して、テーブルの作成が完了していることを確認してください。作成されていれば、開始操作を取り消すことができます。 - ここまででマイグレーションの実行が完了しているので、以下のコマンドでアプリケーションをデプロイすることができます。
$ cf push <appname> -c "null"
cf
コマンド・ライン・ツールは-c
オプションに最後に渡されたコマンドを保管しておき、私たちがアプリケーションをデプロイするたびにこのコマンドを使用します。-c
オプションに“null”
を渡すことで、直前のコマンドが消去され、ビルドパックのデフォルトの開始スクリプトを使用してアプリケーション・サーバーを実行することができます。 - おめでとうございます。これで Ruby on Rails アプリケーションが Bluemix 上で実行されている状態になりました!
- Bluemix 上で皆さんのアプリケーションのリンクをクリックすることで、ブラウザー内にアプリケーションを表示します。
ここまでの手順に従っていれば、このスクリーン・ショットと前のスクリーン・ショットの間に大きな違いが 2 つあることに気付くはずです。1 つ目は、私たちが投稿サンプルを作成したことです。2 つ目は 基本アプリケーションがいくらか整って見えるように HTML/CSS で Web ページ・デザイン要素をいくつか追加したことです。リポジトリーからコードをチェックアウトすると、上記の多少整えられたページを生成する実際のコードを見ることができます。
- Bluemix 上で実行されている SQLDB サービスに含まれるテーブルとデータを確認したいと思う場合は、「Dashboard (ダッシュボード)」から「Services (サービス)」にアクセスし、皆さんが追加した SQLDB サービスをクリックして、コンソールを起動してから「Database Viewer (データベース・ビューア)」をクリックします。スキーマの中から、「U」で始まるスキーマ (例えば、
U71290
) を選択します。これはサービスのユーザー名です。テーブルで、「POSTS (投稿)」 をクリックし、「Sample Data (サンプル・データ)」をクリックしてデータを参照します。
まとめ
この記事で行ったことを簡単にまとめてみましょう。
まず、ローカル Rails アプリケーションを作成し、私たちの好みに合うように調整しました。続いて Bluemix アプリケーションを作成し、そこに最新の (そして常に増え続けている) カタログで提供されているデータベース・サービスから 1 つのデータベース・サービスを追加しました。さらに、サンプル Bluemix アプリケーションの事前構成済み manifest.yml ファイルを使用して、ローカル・アプリケーションを Bluemix へ (cf コマンド・ライン・ツールを使用して) デプロイし、デフォルトでロードされるサンプル・アプリケーションを置き換えるようにしました。
この基本的なブログ・アプリケーションは、それほど興味深いものでも、有用なものでもありません。本当に興味深いのは、ごくわずかなコマンドを実行すれば、私たちが作成した簡単な Rails アプリケーションが Bluemix 上で正常にデプロイされ、ポスト情報を格納および取得するための SQLDB サービスが利用できるようになったことです。
これと同じ手法は、皆さんが作成する可能性があるどのような Rails アプリケーションを (それがどんなに複雑であっても) デプロイする際にも、必要とされるだけの Bluemix のコンポーネントやサービスを採り入れる際にも、使用することができます。
IBM によって完全に管理され、IBM SoftLayer のクラウド上で稼働するエンタープライズ・レベルの環境を活用すると、デプロイメントの時間と手間が節約されます。Rails を使用して簡単な概念実証を作成していようと、ミッション・クリティカルなアプリケーションを作成していようと、Bluemix が対応します。