目次


Heroku から Bluemix にアプリケーションを移植する

Comments

Bluemix は、IBM の Open Cloud Architecture の実装であり、Cloud Foundry を利用していることから、開発者がアプリケーションやサービスを迅速にビルド、デプロイ、管理できるようになっています。Bluemix の他によく使われている PaaS には、Heroku もあります。Heroku にも Cloud Foundry との共通点がかなりたくさんありますが、Heroku アプリケーションを IBM Bluemix に移植するには、対処しなければならない問題がいくつかあります。

このチュートリアルでは、開発者の視点から Heroku と IBM Bluemix の主な違いを分析し、Heroku アプリケーションを IBM Bluemix に移植する際に、これらの違いに対処する方法を Node.js アプリケーションを例に用いて紹介します。

Heroku アプリケーションを IBM Bluemix に移植する際には、以下の 3 つの主要な側面を考慮する必要があります。

  • サービスをバインドするための環境変数: Bluemix では、バインドされるサービスの資格情報は、一貫して VCAP_SERVICES という名前の環境変数に格納されます。一方、Heroku では、サービスをバインドするための環境変数は、すべてのサービスで一貫しているわけではありません。この相違に対処するには、Heroku アプリケーションを Bluemix に移植する前に、2 つのプラットフォームの間で環境変数が正しくマッピングされるように再構成し、元の Heroku アプリケーションに変更を加える必要があります。
  • 提供されるサービスの違い: アプリケーションを IBM Bluemix に移植する際には、サービスの移植についても考慮する必要があります。理想的な場合、IBM Bluemix には Heroku アプリケーションのサービスと同等のサービスがあります。同等のサービスがあれば、Bluemix で新しいサービス・インスタンスを作成し、オプションでコンテンツとデータを移植することができます。同等のサービスがない場合は、元の Heroku アドオンを再利用する必要があります。
  • アプリケーションのモデルとプロセスのタイプ: Bluemix アプリケーションは、1 つのプロセスだけで構成されます。一方、Heroku アプリケーションは、web や worker などといった異なるタイプの複数のプロセスで構成される場合があります。この違いに対処するには、Bluemix で、Heroku アプリケーションの複数のプロセスをサポートする複合アプリケーションを作成する必要があります (これは単に、2 つの関連するアプリケーションを作成するということです) 。

以降では、サンプル・アプリケーションを Heroku から IBM Bluemix に移植する方法をステップ・バイ・ステップで説明します。この sample-app-mongo-node-heroku というサンプル・アプリケーションは、Mongo サービスをバックエンド・データ・ストアとして利用する Node.js アプリケーションです。この Heroku アプリケーションを Bluemix に移植すると、最終的に sample-app-mongo-node-bluemix というアプリケーションになります。この Bluemix アプリケーションは、api/insertMessage と /api/render という 2 つの API を提供します。api/insertMessage が呼び出されると、メッセージがデータベースに書き込まれます。/api/render が呼び出されると、データベースに挿入されたメッセージが Web ページに表示されます。

このチュートリアルでは、サンプル・アプリケーションを Heroku から IBM Bluemix に移植する方法をステップ・バイ・ステップで説明します。

アプリを実行するアプリのコード [1] を入手する アプリのコード [2] を入手する

独自の移植に必要となるもの

ステップ 1. Heroku にアプリケーションをインストールして実行する

  1. git clone を実行して、IBM Jazz Hub から sample-app-mongo-node-heroku アプリケーションをダウンロードします。
    git clone git@heroku.com:sample-app-mongo-node-heroku .git

    このプロジェクトをローカル・ドライブに複製した後、アプリケーションを、適切な名前を付けたディレクトリー (例えば、sample-app-mongo-node-heroku) に保存します。
  2. サンプル・アプリケーションが Heroku でまだ実行されていない場合は、サンプル・アプリケーションを Heroku にプッシュします。詳細については、Heroku のドキュメントを参照してください。
    1. Heroku Toolbelt をまだインストールしていない場合は、インストールします。このツールによって、Heroku コマンド・ライン・ユーティリティーだけでなく、git と Foreman (後のステップで使用するツールです) にもアクセスできるようになります。
    2. コマンド・ウィンドウを開いて cd を実行し、sample-app-mongo-node-heroku アプリケーションが保管されているフォルダーにカレント・ディレクトリーを変更します。アプリケーションを Heroku にプッシュするための準備をします。次の数ステップは、Heroku にアプリケーションをデプロイして実行するためのステップです。
    3. ローカル git リポジトリーを初期化します。
      git init; git add . ; git commit -m "my first commit"
    4. Heroku 上に新規アプリケーションを作成します。これにより、Heroku がソース・コードを受け取れるようになります。また、新規アプリケーションを作成すると、heroku という名前のリモート・リポジトリーが作成され、アプリケーションの名前が無作為に生成されます。
      heroku create
    5. コードを Heroku にデプロイします。
      git push heroku master
    6. 必要に応じて、アプリケーションの名前を変更します。
      heroku apps:rename app_name
    7. アプリケーションのインスタンスが少なくとも 1 つは実行されていることを確認します。
      heroku ps:scale web=1
    8. アプリケーションのアドオンをプロビジョニングします。
      heroku addons:add mongolab

      環境関数 MONGOLAB_URI がアプリケーションに追加されます。heroku config を実行すると、以下に示すようなメッセージが表示されます (セキュリティー上の理由から、重要な資格情報は見えなくしてあります)。サンプル・メッセージのスクリーンショット
      サンプル・メッセージのスクリーンショット
    9. Heroku サービスの環境変数を設定します。この例で設定する必要がある環境変数は、MONGODB です (これは、Mongolab URL を表します)。以下のコマンドを入力します。
      heroku config:set MONGODB=mongolab_url_value
      MONGODB の値のスクリーンショット
    10. 必要に応じて、その他のアプリケーション固有の環境変数を設定します。この例の場合、他に必要な環境変数はありません。
    11. 以下のコマンドを実行してアプリケーションをテストします。
      heroku open

      /api/insertMessage API が呼び出されると、メッセージがデータベースに書き込まれます。

      /api/render API が呼び出されると、データベースに挿入されたメッセージが読み取られてレンダリングされます。出力画面のスクリーンショット
      出力画面のスクリーンショット

ステップ 2. アプリケーションを Bluemix に移植する

Cloud Foundry コマンド・ライン・ツール (CLI) をまだインストールしていない場合は、インストールします。このツールは、Bluemix コマンド・ライン・ユーティリティーを提供します。

  1. アプリケーションが Heroku にインストール済みで、起動されている必要があります。「ステップ 1. Heroku にアプリケーションをインストールして実行する」を参照してください。
  2. Bluemix にログインします。
    cf api https://api.ng.bluemix.net
    cf login -u <username> -p <password>
  3. コマンド・ウィンドウを開いて cd を実行し、ステップ 1 でインストールした sample-app-mongo-node-heroku アプリケーションが保管されているフォルダーにカレント・ディレクトリーを変更します。
  4. コードに必要な変更を加えます (元の Heroku アドオンを再利用する場合は、コードに必要な変更はありません)。この例で必要とされる変更は、環境変数名 MONGODB に関する変更のみです。 変更対象箇所となる MONGODB のスクリーンショット
    元の Heroku アプリケーションのソース・コードで、var mongo = process.env.MONGODB; の変数 MONGODBVCAP_SERVICES に変更します。その後、対応する構文解析を行って正しいサービス資格情報を取得します。
    var mongo = process.env.VCAP_SERVICES;
    var port = process.env.VCAP_APP_PORT;
    if (mongo) {
      var env = JSON.parse(mongo);
      if (env['mongolab']) {
        mongo = env['mongolab'][0]['credentials'];
        }  
      }
    コードの変更内容のスクリーンショット
    コードの変更内容のスクリーンショット
  5. 以下のコマンドを実行して、サンプル・アプリケーションを Bluemix にプッシュします。
    cf push sample-app-mongo-node --no-startサンプル・アプリケーションをプッシュしたときの出力画面のスクリーンショット
    サンプル・アプリケーションをプッシュしたときの出力画面のスクリーンショット
  6. 次の作業では、元の Heroku アドオンを再利用するか、アプリケーションのために同等の Bluemix サービスを作成するかを選択することができます。Heroku アドオンを再利用する場合、元の Heroku アプリケーションに必要となるコードの変更はありません。Bluemix アプリケーションでは、Bluemix の環境変数 MONGODB に Heroku の mongolab URL の値を設定する必要があります (以下を参照)。
    cf set-env sample-app-mongo-node MONGODB mongolab_url_heroku

    同等の Bluemix サービスを作成する場合は、まず、ステップ 4 で説明したように元の Heroku アプリケーションのコードが変更されていることを確認します。その上で、以下の作業を行います。
    1. Bluemix での同等のサービスは Mongolab なので、Mongolab のサービス・インスタンスを作成します。それには、以下のコマンドを実行します。
      cf create-service mongolab sandbox sample-mongolab
    2. 以下のコマンドを実行して、sample-app-mongo-node にサービス・インスタンス sample-mongolab をバインドします。
      cf bind-service sample-app-mongo-node sample-mongolab
  7. 環境変数の注入を適用するために、アプリケーションをもう一度プッシュします。
    cf start sample-app-mongo-node

sample-app-mongo-node は Bluemix で稼働中になりました。これで、Heroku から Bluemix への移植は完了です。

移植の完了を示す画面のスクリーンショット
移植の完了を示す画面のスクリーンショット

移植後のアプリケーションは、Bluemix で正常に稼働しており、サンプル・メッセージを Mongo データベースに挿入することができます。

挿入されたサンプル・メッセージのスクリーンショット
挿入されたサンプル・メッセージのスクリーンショット

そして、データベースからコンテンツを読み取ってレンダリングすることもできます。

表示されたサンプル・メッセージのスクリーンショット
表示されたサンプル・メッセージのスクリーンショット

制限事項

このチュートリアルではまだ、Mongo データベースのデータの移植について触れていませんが、Bluemix で同等の Mongo サービスを作成することにした場合、既存のデータベース・クライアント・ツールを利用することで、必要に応じてデータを移植することができます。

また、例として使用したサンプル・アプリケーションでは Heroku の worker シナリオが考慮されていませんが、worker シナリオでも、移植方法は web シナリオの場合と同様です。

最後に、このチュートリアルでは複数の関連するアプリケーションを移植するというシナリオを取り上げていません。複数の関連アプリケーションを移植する場合、関連する Heroku アプリケーション同士の関係は、環境変数から推測することができます。例えば、アプリケーション A がアプリケーション B に依存しているとすれば、アプリケーション A にはアプリケーション B の URL を参照する環境変数があるはずです。関連する複数のアプリケーションを Bluemix にプッシュした後は、Bluemix で、別のアプリケーションに依存するアプリケーションの該当する環境変数を設定する必要があります。

まとめ

このチュートリアルでは、開発者の視点から、Heroku と Bluemix の主な違いについて説明しました。そして、サンプル Node.js アプリケーションを用いて、Heroku アプリケーションを Bluemix に移植する際に、その違いに対処する手順をステップ・バイ・ステップで説明しました。このチュートリアルは、プラットフォーム間の違いを理解するのに役立つ良き出発点として、アプリケーションを移植する際の参考になります。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing, Web development
ArticleID=1012073
ArticleTitle=Heroku から Bluemix にアプリケーションを移植する
publish-date=08062015