SAP Cloud Platform Cloud Foundryのアプリケーション開発 第三回


第二回ではEtherCalcをSAP Cloud Platform Cloud Foundryへデプロイしましたが、まだ永続ストアがバインドされていないため、作成したスプレッドシートはアプリケーションを再起動してしまうと編集内容が保存されません。

第三回目の今回は、EtherCalcにNoSQLのRedisサービスをアプリケーションにバインドし、作業内容を保存出来るようにします。

Cloud Foundryでは使用したいサービスのインスタンスを作成し、それをアプリケーションにバインドする事でデータストアなど各種サービスをアプリケーションから利用します。使用しているCloud Foundry環境で何のサービスが提供されているかはサービスマーケットプレイスで確認することが出来ます。

まずはコマンドプロンプト、Macのターミナルから「cf marketplace」コマンドでCloud Foundry内で利用出来るサービスの一覧を表示してみましょう。

cf marketplace

xxxx@xxx.com として組織 <ユーザID>trial_trial / スペース dev 内のマーケットプレイスからサービスを取得しています…

OK

サービス    プラン       説明

application-logs   lite                                Stream logs of bound applications to central application logging stack

connectivity       lite                                Establishes a secure and reliable connectivity between cloud applications and on-premise systems

hanatrial          hdi-shared                          SAP HANA trial database

mongodb            v3.0-dev                            Store JSON-like documents in a document-oriented database.

portal-services    site-host, site-content, site-app   Easily create SAP Fiori launchpad business sites for employees, customers and partners.

postgresql         v9.4-dev                            PostgreSQL object-relational database system

rabbitmq           v3.6.9-1-dev                        RabbitMQ messaging

redis              v3.0-dev                            Redis in-memory data structure store

xsuaa              application                         Manage application authorizations and trust to identity providers

ヒント:  特定のサービスの個々のプランの説明を表示するには、’cf marketplace -s SERVICE’ を使用します。

利用出来るサービスの一覧が表示されました。SAP Cloud Platform Cloud Foundry環境では、PostgreSQLやRedis、MongoDBといったサービス以外にも、HANAデータベースや、Neo環境・オンプレミス環境と連携するためのインテグレーションサービス、ポータルサービスなどがSAP独自のサービスインスタンスとして提供されています。

次に「cf create-service <利用するサービス> <プラン > <サービス名>」コマンドでRedisサービスのインスタンスを作成します。

$ cf create-service redis v3.0-dev redis4e

xxx@xxx.com としてサービス・インスタンス redis4e を組織 <ユーザID>trial_trial / スペース dev 内に作成しています…

OK

作成したサービスインスタンスを「cf bind-service <アプリケーション名> <サービス名>」コマンドを利用して、EtherCalcアプリケーションにバインドします。

$ cf bind-service ethercalc redis4e

xxx@xxx.com としてサービス redis4e を組織<ユーザID>trial_trial / スペース dev 内のアプリ ethercalc にバインドしています…

OK

ヒント: 確実に環境変数の変更が有効になるようにするには、’cf restage ethercalc’ を使用します

次に「cf restage <アプリケーション名>」コマンドでアプリケーションを再ステージングして変更を有効にします。

$ cf restage ethercalc

xxx@xxx.com として組織 <ユーザID>trial_trial / スペース dev 内のアプリ ethercalc を再ステージングしています…

〜中略〜

1 個の中の 1 個のインスタンスが実行中です

アプリが開始されました

OK

アプリ ethercalc はコマンド `npm start` を使用して開始されました

xxx@xxx.com として組織 <ユーザID>trial_trial / スペース dev 内のアプリ ethercalc の正常性と状況を表示しています…

OK

要求された状態: started

インスタンス: 1/1

使用: 256M x 1 インスタンス

URL: ethercalc.cfapps.us10.hana.ondemand.com

最終アップロード日時: Wed Jun 21 07:16:00 UTC 2017

スタック: cflinuxfs2

ビルドパック: node.js 1.5.34

状態開始日時CPUメモリーディスク詳細

#0   実行   2017-06-27 01:59:51 PM   0.0%   256M の中の 114.4M   1G の中の 104.3M

これで、Redisへの接続情報などの環境変数が設定されデータストアにデータを格納できるようになりました。何故ソースコードを変えずにRedis接続ができるのかというと、EhterCalc自体がCloud Foundryを意識した実装になっていて、環境変数から接続情報を取得しているからです。これについては後述します。

それでは、EtherCalcアプリケーションを開いてみましょう。今回は、正しくデータがRedisにストアされることがわかるように、URLの末尾に/sampleを付加して開きsampleというファイルを作成し編集します。(EtherCalcはURLでファイルを識別する)

sample_spreadsheet

それでは、ブラウザを一度閉じてからアプリケーションを再起動してみましょう。コマンドプロンプト、Macのターミナルから「cf restart ethercalc」と入力します。もしくは、CockpitのEtherCalcアプリケーション画面の再起動ボタンから行っても構いません。

$ cf restart ethercalc

xxx@xxx.com として組織 <ユーザID>trial_trial / スペース dev 内のアプリ ethercalc を停止しています…

OK

xxx@xxx.com として組織<ユーザID>trial_trial / スペース dev 内のアプリ ethercalc を開始しています…

1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です

1 個の中の 1 個のインスタンスが実行中です

アプリが開始されました

OK

アプリ ethercalc はコマンド `npm start` を使用して開始されました

xxx@xxx.com として組織 <ユーザID>trial_trial / スペース dev 内のアプリ ethercalc の正常性と状況を表示しています…

OK

要求された状態: started

インスタンス: 1/1

使用: 256M x 1 インスタンス

URL: ethercalc.cfapps.us10.hana.ondemand.com

最終アップロード日時: Wed Jun 21 07:16:00 UTC 2017

スタック: cflinuxfs2

ビルドパック: node.js 1.5.34

状態   開始日時                 CPU    メモリー            ディスク           詳細

#0   実行   2017-06-27 02:07:27 PM   0.1%   256M の中の 75.8M   1G の中の 104.3M

アプリケーションが再起動したら、もう一度EtherCalcのURLに/sampleを追加して開きます。

再起動前と同じ状態が復元されていることがわかります。

sample_spreadsheet

これで、EtherCalcに永続化機能を追加することが出来ました。

EtherCalcはCloud Foundry用の実装がされているため、特に変更せずともサービスインスタンスをバインドしてあげればそのまま渡されてくる環境変数を元にRedisに接続してくれました。しかし、通常アプリケーション開発をする場合にはデータストアの接続情報が必要になりますので、最後にその確認方法を説明します。

接続情報は「cf env <アプリケーション名>」で確認出来ます。

$ cf env ethercalc

xxx@xxx.com として組織 <ユーザID>trial_trial / スペース dev 内のアプリ ethercalc の環境変数を取得しています…

OK

システム提供:

{

“VCAP_SERVICES”: {

“redis”: [

{

“credentials”: {

“hostname”: “<ホスト名>”,

“password”: “<パスワード>”,

“port”: “<ポート>”,

“ports”: {

“6379/tcp”: “<ポート>”

}

},

“label”: “redis”,

“name”: “redis4e”,

“plan”: “v3.0-dev”,

“provider”: null,

“syslog_drain_url”: null,

“tags”: [

“redis”,

“keyvalue”

],

“volume_mounts”: []

}

]

}

}

接続情報が表示されますので、これをソースコードまたはコンフィグファイルに埋め込んでも構わないですし、VCAP_SERVICESという環境変数に上記形式のJSONで渡されますので、プログラム内でそちらから取得していただいても構いません。

また、Redis以外にHANAやPostgreSQLなどのサービスをバインドした場合にも同様に取得出来ますので、アプリケーションを開発する場合には参考にしてみてください。

三回に渡って、SAP Cloud Platform Cloud Foundry版のアプリケーション開発について解説しました。Cloud Foundryを触ったことがない方には少々手間のように思うかもしれませんが、慣れるととても簡単にアプリケーションが開発できますし、コンテナ仮想化によるスケールアウト性の高さはとても便利ですので、是非触っていただければと思います。

ご質問はチャットWebからも受け付けております。お気軽にお問い合わせください。

●お問い合わせ先
チャットで質問する
Web問い合わせフォーム
電話: 0120-554-881(受付時間:平日 9:00~18:00)