OpenShift Express, Flex, PowerはOpenShiftへ。

2012年5月6日 | by | cloudfoundry, openshift

5/5の更新が抜けてしまいました。あちゃー。
ということで、5/6は複数まとめて書く予定です。さて、今回はOpenShiftの話。

先日オープンソース化されたOpenShiftですが、オープン化前まではRedHatが提供するサービスとして、Express、Flex、Powerの3種類が提供されていました。

参考:注目のPaaSを一挙に紹介! ~Cloud Foundry、OpenShift、Herokuなど

シンプルな共有ホスティングモデルだったExpress
専用ホスティングモデルでオートスケールにも対応していたFlex
より高度で複雑なアプリケーションも動作可能なPower

という位置づけでしたが、具体的に何をどう使っていけば良いのか、曖昧で分かりづらかったのも事実。

そこで今回、オープンソース化と合わせる形で、3サービスを統合し、新たに「OpenShift」としてサービスが提供されるようになりました。

Recapping the OpenShift Origin Launch and What Happened to Express and Flex?

Contrary to what was written – Express, Flex and Power are no longer part of the OpenShift vernacular. It’s just good ‘ol OpenShift moving forward. In fact, astute visitors to openshift.com noticed we unified the services a few weeks ago. We actually first started talking about this unification of services way back in January.

方向性自体は今年の1月の時点で示されていたようです

現時点でOpenShiftのサイトにはExpressやFlexに関する記述はなくなっており、トライアルでもシンプルな1サービスとして利用できるようになっています。RedHatの日本語ページだとまだ記述が残っているので、早く修正してほしいところですね:p

これで、Cloud Foundryにおけるcloudfoundry.comと、OpenShift OriginにおけるOpenShiftが同じ位置づけになったことになります。

        オープンソースプロジェクトで開発
      ↓                 ↓
 独自サービスで提供   | プライベートクラウド向けにベンダーに提供

ビジネスモデルもほぼ同じ。
今後注目すべきなのは、

・開発速度(両社内での体制や、他の開発者をどうやって巻き込んでいくか・・など)
・ベンダーをいかにしてエコシステムに巻き込むか
・既存ソリューションとの連携

あたりでしょうか。
githubを見る限り、OpenShiftのほうが開発者の頭数を揃えているように思えます。
ただ、Cloud Foundryもオープンソースプロジェクトとして1年先行している分、開発体制について試行錯誤しており、つい先日もCloudFoundry.orgの新体制が発表されました。実際4月頃から開発速度が目に見えて向上しています。

ベンダーの巻き込みについては、1年分のアドバンテージがある分Cloud Foundryが先行していますね。RedHatがどうやって周囲を巻き込んでいくかが注目です。

既存ソリューションについては、両者得意分野が異なるので、非常に興味深いところです。仮想化についてシェアをもつVMWareと、OSとしてシェアをもつRedHat。一枚レイヤーの違う両社がどういう手を打っていくのか、注目していきたいところですね。

1 Comment »

Software Design 2012年5月号で自宅PaaSを作ろう

2012年5月4日 | by | cloudfoundry

このblogを見ている人は、もうほとんどの方がチェック済のような気はしますが改めてご紹介。

 

Software Design誌 2012年5月号にて、@diceken@hamaknが、第1特集を書いてます。

クラウドの力試し なぜCloud FoundryのPaaSがお勧めなのか?
第1章 PaaSが無視できない理由 (@diceken)
第2章 はじめてのCloud Foundry構築とデプロイ (@hamakn)
第3章 Cloud Foundryの中身を知る (@hamakn)
第4章 Cloud Foundryの実力を測る (@hamakn)
第5章 XaaS時代に、エンジニアはどうするべきか (@diceken)

どの章もとても良いものなのですが、特に第4章がおすすめ。複数ノードでのCloud Foundry構築方法を解説しています。
複数ノードの構築はウェブ上にもそれほど情報が多くないため、とても参考になると思います。

Cloud Foundryを深く知るためにも、是非お勧めしたい特集です。

No Comments »

【小ネタ】Cloud FoundryでMinecraft Serverを動かす!?

2012年5月3日 | by | cloudfoundry

ついにCloud FoundryにWorker(Standalone app)が実装された!ので、早速触ってみた

Standalone Applicationが実装されたことにより、Webで待ち受けないバックグラウンドのアプリケーションの動作が可能になりました。じゃあ、何をどこまで動かせるんだろう?・・・ということで、真っ先に気になったのが、個人的に去年よりどっぷりハマっていたゲーム、Minecraft

Minecraftの説明は詳しいサイトに譲るとして、このMinecraftのマルチプレイ用のサーバーをCloud Foundryにデプロイしてみたらどうなるんだろうかと。

・・・ということで。

Minecraftの公式より、minecraft_server.jarをダウンロード。
そして任意のフォルダに突っ込んで、vmc push。

$vmc push
Would you like to deploy from the current directory? [Yn]: Y
Application Name: minecraft_test
Detected a Standalone Application, is this correct? [Yn]: Y
1: java
2: node
3: node06
4: ruby18
5: ruby19

当然javaアプリケーションなのでjavaを選択。

Select Runtime [ja va]: 1
Selected java

そして起動のコマンドはMinecraft公式にあるやつをそのままに。

Start Command: java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
Application Deployed URL [None]:
Memory reservation (128M, 256M, 512M, 1G, 2G) [512M]: 1G
How many instances? [1]:
Bind existing services to 'minecraft_test'? [yN]: N
Create services to bind to 'minecraft_test'? [yN]: N
Would you like to save this configuration? [yN]: N
Creating Application: OK
Uploading Application:
  Checking for available resources: OK
  Processing resources: OK
  Packing application: OK
  Uploading (0K): OK
Push Status: OK
Staging Application 'minecraft_test': OK
Starting Application 'minecraft_test': OK

・・・とくにエラー等出てないようにみえますね。

ログを見てみましょうか。

$vmc logs minecraft_test
2012-05-02 15:02:23 [INFO] Starting minecraft server version 1.2.5
2012-05-02 15:02:23 [INFO] Loading properties
2012-05-02 15:02:23 [WARNING] server.properties does not exist
2012-05-02 15:02:23 [INFO] Generating new properties file
2012-05-02 15:02:23 [INFO] Starting Minecraft server on *:25565
2012-05-02 15:02:23 [WARNING] Failed to load ban list: java.io.FileNotFoundException: banned-players.txt (No such file or directory)
2012-05-02 15:02:23 [WARNING] Failed to load ip ban list: java.io.FileNotFoundException: banned-ips.txt (No such file or directory)
2012-05-02 15:02:23 [WARNING] Failed to load operators list: java.io.FileNotFoundException: ops.txt (No such file or directory)
2012-05-02 15:02:23 [WARNING] Failed to load white-list: java.io.FileNotFoundException: white-list.txt (No such file or directory)
2012-05-02 15:02:23 [INFO] Preparing level "world"
2012-05-02 15:02:23 [INFO] Default game type: 0
2012-05-02 15:02:24 [INFO] Preparing start region for level 0
2012-05-02 15:02:25 [INFO] Preparing spawn area: 24%
2012-05-02 15:02:26 [INFO] Preparing spawn area: 48%
2012-05-02 15:02:27 [INFO] Preparing spawn area: 77%
2012-05-02 15:02:28 [INFO] Done (5.235s)! For help, type "help" or "?"

・・・おおお。
動いてるよ、Minecraft Serverが動いてるよ!
これでMaaS(Minecraft as a Service)が実現・・・!

とココまで書いたところで今回のオチですが、Cloud Foundryの仕組み上、Minecraft ClientからこのServerに繋ぎに行く方法がありません。というわけで、動きはしたけど使えません!
いや、最初から分かっててやってたんですけどもw

もし仮に接続する方法があったとしても、おそらく大した速度は望めず、ストレスの溜まるゲームになってしまう可能性が高いと思われます。PaaS側はMinecraftのようなディスクアクセスを考慮してないでしょうからね。PaaS側でbanされる可能性すらあります。
(Minecraftはディスクへのアクセス頻度が多く、多人数プレイだとRAMDiskが必要になるくらいの負荷になる)
今回に限って言えば、そもそもClientが接続できないので、ほとんどディスク負荷は発生していないはずですが。

ひとまず、こんなものも動きはしますよというお話でした。

No Comments »

ついにCloud FoundryにWorker(Standalone app)が実装された!ので、早速触ってみた

2012年5月2日 | by | cloudfoundry

Cloud Foundryの最大の欠点。それは、一般的にはWorkerと呼ばれる、バックグラウンドで処理を行う仕組みを備えていないことでした。ライバルであるHerokuやWindows Azure、そしてOpenShiftはWorker機能を備えています。

Cloud Foundryを愛し、普及に努めるCloud Foundryエバンジェリストの方々は、「バックグラウンドの処理はどうやればいいの?」と聞かれる度に、苦々しい思いをしてきたことでしょう。

でも、そんな日々は今日でおしまいです。
cloudfoundry.comに、バックグラウンド処理を行える仕組みが実装されました。

Cloud Foundry Improves Support For Background Processing

みんなが待ち望んでいたこの機能。早速使ってみることにしましょう。

Standalone appを作ってみる!

AzureだとWorker Role、HerokuだとWorker Dynoと呼ぶ、このバックグラウンド処理の仕組みですが、Cloud Foundryでは”Standalone”アプリとしてデプロイします。RailsアプリやJavaアプリと同様、DEAで動くわけですね。

この記事の執筆段階では、githubのvcapレポジトリにはStandaloneに関する更新は来ていません。とりあえず試したいという場合は、cloudfoundry.comを使う必要があります。CloudFoundry派生PaaSや自前PaaSで使うには、もう少し待つ必要がありそうですね。

下準備

Standaloneでデプロイするには、vmcの0.3.17以上が必要です。
まずは、vmcのアップデートをしておきましょう。

gem install vmc

オプション付けずにインストールを行うと、最新の0.3.17以上が入るはずです。
インストール後、vmc targetでapi.cloudfoundry.comを選んでおいてくださいね。もちろんcloudfoundry.comが使えない人は、先に登録してくるのを忘れずに

簡単なアプリをつくる

ひとまずRubyで簡単なアプリを作ってみましょう。
任意の名前のフォルダを作成し、その中にhello-world.rbを作成。

loop {
  puts 'Hello world'
  sleep 5
}

5秒ごとに、Hello worldを出力するコードです。

そして、vmc push。

$vmc push helloworld_udcp
Would you like to deploy from the current directory? [Yn]:
Detected a Standalone Application, is this correct? [Yn]:
1: java
2: node
3: node06
4: ruby18
5: ruby19
Select Runtime [ruby18]:
Selected ruby18
Start Command: ruby hello-world.rb
Application Deployed URL [None]:
Memory reservation (128M, 256M, 512M, 1G, 2G) [128M]:
How many instances? [1]:
Create services to bind to 'helloworld_udcp'? [yN]:
Would you like to save this configuration? [yN]: y
Manifest written to manifest.yml.
Creating Application: OK
Uploading Application:
Checking for available resources: OK
Packing application: OK
Uploading (1K): OK
Push Status: OK
Staging Application 'helloworld_udcp': OK
Starting Application 'helloworld_udcp': OK

特にフレームワーク等を使っていない限り、Detected a Standalone Applicationと出るはずです。
違う物と認識された場合、直接Standalone Applicationを指定してあげましょう。

ランタイムは、現在の所Java, Node.js 0.4 or 0.6, Ruby 1.8 or 1.9が選択できるようです。
そして重要なのがStart Command。今回はRubyでhello-world.rbを動かしてやるので
ruby hello-world.rb
と指定しています。

動作確認

さて、先ほどのアプリが動作しているかどうか確認しましょう。

vmc logs helloworld_udcp
====> /logs/stdout.log <====

Hello world
Hello world

順調に動作していることがわかりますね。

インスタンスの増減も簡単

動作するインスタンス数を変更するのも非常に簡単です。

$ vmc instances helloworld_udcp +2
Scaling Application instances up to 3: OK
$ vmc instances helloworld_udcp

+-------+---------+--------------------+
| Index | State   | Start Time         |
+-------+---------+--------------------+
| 0     | RUNNING | 05/02/2012 04:47PM |
| 1     | RUNNING | 05/02/2012 04:48PM |
| 2     | RUNNING | 05/02/2012 04:48PM |
+-------+---------+--------------------+

すばらしい。

動作確認はインスタンス番号を指定してあげればOK。

vmc logs helloworld --instance 0
====> /logs/stdout.log <====
Hello world
Hello world
vmc logs helloworld --instance 1
====> /logs/stdout.log <====
Hello world
Hello world

Standaloneアプリケーションを備えたことで、いよいよCloud Foundryも本格的に使えるようになってきたと言えるのではないでしょうか。ご覧のように、Standaloneアプリケーションを使うのは非常に簡単です。
フロントエンドで処理しきれない重たいタスクは、RabbitMQを使ってキューに入れておき、Standaloneアプリケーションで処理。キューの処理が追いつかない場合は、Standaloneアプリケーションのインスタンス数を増やしてあげれば、容易にスケールさせることができます。キューの処理具合を見ながら、動的にインスタンス数を増減させる仕組みを作ってあげるとより便利そうですね。

Cloud Foundryの可能性を大きく広げるStandaloneアプリケーション。是非触ってみるといいんじゃないでしょうか。

No Comments »

Stackato 1.2リリース

2012年5月2日 | by | cloudfoundry

Cloud Foundryから派生したプロダクトの中でも、活発にアップデートが行われているActive StateのStackatoですが、数日前にv1.2がリリースされたようです。

詳細はこちらから。
Release Notes – Stackato 1.2 documentation

主だった変更点としては
・RubyやNode.jsなどなど、各種ランタイムのバージョンアップ
・HerokuのBuildpackをサポート。Clojure,Go,Java,Play!,PythonのビルトインBuildpackもあり
・stackato push|updateが、同時にstaging.logをtailしてくれるようになった(Herokuみたいにね!)
・ユーザーグループのサポート
・ユーザー単位・グループ単位での制限をサポート
・OpenStackのオートスケーリングをサポート

あたりでしょうか。

あとは細かな改善がいろいろと入っているようです。

HerokuのBuildpackは任意の環境を追加できる仕組みですが、それをサポートしたようです。
マイナー言語のサポート追加というよりは、メジャー言語のバージョン対応を広げるという意味で有用そうですね。たとえばPaaS側がRuby1.9.2までしかサポートしてないけど、どうしても1.9.3が使いたいんだ!というケースは、結構ありそうですし。

ユーザーグループのサポートや、ユーザー・グループ単位での制限追加は、Cloud Foundry本体のほうで追加されたACMコンポーネント(Access Control Manager)によるものと思われます。

OpenStackのオートスケーリングサポートについては、どのような実装になっているのか気になるところです。
誰か調べてくれないかな:p

No Comments »

Cloud Foundry Eclipse Pluginのバージョン1.0リリース

2012年5月1日 | by | cloudfoundry

CLOUD FOUNDRY INTEGRATION FOR ECLIPSE 1.0 RELEASED

というわけで、バージョン1.0が出ていたようです。
STSといえば、以前このblogでも試そうとしました・・・が、そのときは何かが問題だったのか、上手く利用することができませんでした。
EclipseでCloud Foundryにデプロイしようとしてうまくいかなかった

1.0になったことで、おそらくこのあたりの問題も解消されているものと思われます。
改めてこちらでも動作を確認し、レポートしたいと思います。

No Comments »

PHPからServices(MySQL,PostgreSQL,MongoDB,etc…)の情報を取得する方法

2012年4月28日 | by | #cfcrjp, cloudfoundry

こんにちは、jacoです。
GW大更新キャンペーンということで、さっそく。

未だ利用者が非常に多く需要のあるPHPですが、この記事を書いてる現在でもcloudfoundry.comで利用できなかったり、既存のPHPアプリケーションを動かすにあたって必要なとある要素が欠けており(これについてはまた後日)と、Cloud Foundryにおいてはイマイチ扱いがよろしくありません。

そんな不遇なPHPを、このGWを使って何とか使いやすくしていこうと思います。
今回は、PHPでMySQLやPostgreSQLなどの接続方法を書いてみます。

DBのコンフィグはどうやったら取れる?

Cloud FoundryでPHPを使おうと思った時、まず最初につまづくのがDBの情報をどうやって取得するかという点だと思います。
Railsを使う場合、デプロイ時に自動でdatabase.ymlを生成してくれたりと、特に気にすること無くDBを利用できるのですが、PHPの場合はそのような仕組みが用意されていません。
mysql_connectやmysqli_connectを使うにしろ、PDOを使うにしろ、このあたりの情報が分からないと接続できませんよね。

そんなわけで困ったときのphpinfo()を実行してみます。
phpinfo()を記述したPHPファイルをvmc pushし、mysqlをバインド。すると・・・


はい、とれましたー。
このように、DB名からホスト名、ユーザー名、パスワードが取得できます。

もちろんこの情報をコピペしても良いのですが、アプリを作る度にphpinfoするのも手間です。
$_SERVER["VCAP_SERVICES"]に情報が格納されていますので、自動で取ってこれるようにしましょう。

<?php
$services = json_decode($_SERVER["VCAP_SERVICES"],true);
$mysql_config = $services["mysql-5.1"][0]["credentials"];

$username = $mysql_config["username"];
$password = $mysql_config["password"];
$hostname = $mysql_config["hostname"];
$port = $mysql_config["port"];
$db = $mysql_config["name"];

あとは各変数をmysql_connectなりPDOなりに食わせてあげればOK。
MySQLだけでなく、PostgreSQLやMongoDBも同様の手法で取得できます。

関連記事はこちら。
CloudFoundryを使って静的ファイルを公開する2 php利用編
CloudFoundry上のphpアプリの動作の仕組み
CloudFoundryのphpアプリの動作の仕組み2 なぜapache2とmod_phpを使っているのか?

No Comments »

新しいStackatoクライアント:トンネリングとHTTPS(和訳)

2011年12月25日 | by | cloudfoundry

みなさんこんにちは,r_takaishiです.クリスマスは積読していたラノベを読んでいました.さて,本記事はCloudFoundryAdventCalendarの25日目で,New Stackato Client: Tunneling and HTTPS の和訳です.CloudFoundryは新規アプケーションのデプロイ時に何をしているのか(和訳) で自分の担当は終わったものと思っていたら一昨日位に最終日が自分の担当ということを知り,今泣きながら書いています.さて,今回はStackatoの中からDatabaseServiceを使ってみる(和訳) と関係がある内容です.上ではCloudFoundryベースのStackatoからDBを扱う方法について紹介しました.Stackatoでは独自にコマンドを実装していたのですが,本家CloudFoundryがより良いcaldecottというものを実装したため,方針転換しcaldecottと互換性のあるコマンドを実装するよ,と宣言した所でした.今回の記事で実装について紹介しています.互換性があるだけでなく,デフォルトでHTTPSを使ったり,パスワードの入力時の挙動を改善したりしているようです.個人的には,細かい改善よりは,本家CloudFoundryと同じインタフェースでトンネルを扱えるようになった点が一番良い点だと思います.

それでは,以下和訳です.


Troyにより先週投稿されたStackatoでデータベースサービスへの接続についての記事の続報を書くことができ,私はハッピーです.例の記事では,Troyはこう言っていました.

CloudFoundryと互換性のあるAPIにしようとしていて,’vmc tunnel’をエミュレートした’stackato tunnel’を追加するでしょう.

私たちは’tunnel’コマンドを実装したstackatoクライアントの新しいバージョンをリリースしました.これを行う際,私たちはクライアントがどうコミュニケートするか,そうでないならどう操作するかについて調べ,そしてよりよく改良できる場所がどこかを探しました.

パスワード?何のパスワード?

例えば,vmcクライアントは,トンネルの開始時に,認証のためにあなたの入力するパスワードを必要とします.しかし,もしあなたがその後に間違ったパスワードを入力すると,アクセスを弾かれます.もしトンネルがデプロイされないならそれは中断し,存在するトンネルを削除し,新しいパスワードで再デプロイします.

$ vmc tunnel
1: mysql-d05c5
Which service to tunnel to?: 1
Password: *****
Redeploying tunnel application 'caldecott'.
Uploading Application:
Checking for available resources: OK
Packing application: OK
Uploading (1K): OK
Push Status: OK
Binding Service [mysql-d05c5]: OK
...

vmcユーザが前の認証をした後で,致命的なセキュリティホールではありませんが,意図していない動作でしょう.’stackato tunnel’コマンドはこのように,それは行いません:

$ stackato tunnel
1. postgresql-gtd
Which service to tunnel to: 1
Password: *****
Getting tunnel url: OK, at https://tunnel-4r0b6.sandbox.activestate.com
Error: Bad password, authentication to tunnel failed

HTTPS by default…

他の見方は,vmc tunnelはデフォルトでHTTP経由で操作しますが,私たちはHTTPSを使うようにしました.私たちは他のセキュアな操作のためにこれをデフォルトのプロトコルにしました.私たちはさらに一歩進み,’–allow-http’を宣言することでHTTPの接続ができるようにしました.

$ stackato target api.sandbox.activestate.com
Successfully targeted to [https://api.sandbox.activestate.com]

その他

サーバ側では,私たちは’caldecott’というアプリケーション名を’tunnel’に統合し,トンネルを最初に作る時,マップされたURLを指定するための’–url’オプションを提供しました.柔軟でないDNSを扱う場所で,名前を修正したい時により便利になります.

私たちは クライアントとREST APIのディレクトリを活用するシステム向けのテストベースで増大するコードを持ったままでコマンドライン上でパスワードを指定するオプションはバッチモードテストのサポートを追加しました.

もしあなたが既にStackatoのベータ版を開始しているなら,新しいクライアントをダウンロードして試してほしいと思っています.もしまだ開始していないなら,サインアップしてください.私たちはあなたからのフィードバックを愛しています.

和訳ここまで

おわりに

さて,12/1から続いてきたCloudFoundryAdventCalendarも本記事で最後です.最後の記事が翻訳というのは少し寂しいですが,まぁ仕方がないです.AdventCalendarはこれで終わりですが,U1*TBはまだまだ続きますのでこれからもよろしくお願いします.

No Comments »

Cloud Foundryことはじめ最終回 ―データベースを利用するRailsアプリをデプロイする―

2011年12月24日 | by | #cfcrjp, cloudfoundry

どうもこんにちは、jacoです。
Cloud Foundry Advent Calendar 24日目です。まさか12/24の記事を私が担当する事になるなんて。
24日なんてとても忙しいのに・・・こまるわーまじこまるわー

・・・まあご想像の通りなにも予定ないんですけどね。

さて世間一般のイベントはとりあえず置いておいて、Cloud Foundryことはじめ8回目。ひとまず今回で一区切り付けてしまおうとおもいます。

今回は今まであえて触れてこなかった、データベースを使ったアプリケーションをデプロイしてみようと思います。

Cloud Foundryで使えるDB

Cloud Foundryでは
・MySQL
・SQLite
・MongoDB
・PostgreSQL
・Redis
をサポートしています。

WindowsにRails環境を整える

今回はRailsを使ってCloud Foundryにアプリをデプロイします。
これまでのことはじめ同様、Windows環境を前提に話を進めていきますので、WindowsにRails 3.1環境をセットアップしてください。

Rails自体のセットアップ手順はこの記事では省きますので、以下のサイトなどを参考にセットアップを行ってください。
Ruby on Rails 3.1 を Windows にインストールする手順をかなり丁寧に説明してみました

それにしてもWindowsでのRailsセットアップはどんどん面倒くさくなっていくなあ・・・

SQLiteなテストアプリをつくる

それではrailsアプリを作っていきましょう。
今までの例とおなじく、D:ドライブ直下にフォルダを生成していくことにします。特にD:である必要はないので、好きな場所に読み替えて貰って結構です。

C:\Users\jaco>D:
D:\>rails new cf

D:直下に移動したあと、rails newを行っています。これでcfフォルダが作られ、その中にrailsファイルが生成されるはずです。

D:\>cd cf
D:\cf>

cfフォルダに移動します。
今回は簡単なメッセージを残せるアプリを作ってみる事にしましょう。

D:\cf>rails g scaffold message title:string body:text

Railsを使った事ある人には説明は不要かと思いますが、Railsの自動土台生成 scaffoldを使ってモデル、ビュー、コントローラの生成を行います。titleとbodyの2つの項目を持ったものが自動生成されます。

おそらく最初の状態だと、SQLiteを利用するようになっているはずです。
念のため config\database.yml をテキストエディタで開いて確認しておきましょう。
adapter: sqlite3 になっていれば問題ありません。

次に

D:\cf>rake db:migrate

db:migrateを実行。

環境によっては、ここで
rake aborted!
uninitialized constant Rake::DSL
というエラーが出てしまうかもしれません。Rakeのバージョン不一致が原因ですので、この場合

D:\cf>gem install rake -v=0.9.2

を実行してください。

それでは、さっそくRailsをローカルで起動してみましょう。

D:\cf>rails s

エラーなく起動できれば、ブラウザで http://localhost:3000/messages にアクセスしてください。

問題なさそうですね。New Messageを押すとメッセージの投稿ができます。

SQLiteなテストアプリをデプロイする

それでは、作ったアプリをcloudfoundry.comにデプロイしてみましょう。
さっそくvmc target -> vmc loginして・・・といきたいところですが、ちょっと待ち。
実はこのままデプロイしてもうまく動かないところがあります。

詳しくは、u1が書いた
CloudFoundryでRubyOnRails3.0, 3.1アプリを動かす際のまとめ
に書いてありますので、興味のある方は目を通してください。

以下の作業を行っていきます。

assets:precompileの実行

bundle exec rake assets:precompile RAILS_ENV=production

config.serve_static_assetsの設定変更

config/environments/production.rbのconfig.serve_static_assetsをtrueにします。

  config.serve_static_assets = true

jquery-railsの置き換え

Gemfile内の
gem ‘jquery-rails’

gem ‘cloudfoundry-jquery-rails’

に置き換えてください。
そして

bundle install

を実行。

Gemfile.lockの書き換え

Windows環境でのみ必要な作業です。
Windows環境でbundle installした場合、sqlite3のgemのバージョンが
sqlite3 (1.3.5-x86-mingw32)
のようになってしまいます。mingw版が指定されてしまっていますね。
この状態でデプロイすると

You have requested:
  sqlite3 >= 0
  The bundle currently has sqlite3 locked at 1.3.5.
  Try running `bundle update sqlite3`

このように怒られてしまいます。

なので、
sqlite3 (1.3.5-x86-mingw32)

sqlite3 (1.3.5)
のように書き換えてください。なお、bundle installを行うとまたこの記述が巻き戻ってしまいますので注意してください。

デプロイ

ここまで出来たら、cloudfoundry.comにデプロイしてみましょう。
いつものように、Cloud Foundry ことはじめ3を参考に、vmc target->vmc login->vmc pushを行います。

ただ注意しなければいけないのが、今回はRuby1.9環境を前提に作っているRailsアプリですので、Cloud FoundryでもRuby1.9を使うと明示してあげなければいけません。

vmc push --runtime ruby19

–runtime ruby19 をつけてあげることで、Ruby1.9環境でデプロイしてくれます。
付け忘れると1.8で動かそうとするので、エラーがでてしまうはずです。

デプロイに成功したらブラウザ経由でアクセスしてみましょう。
先ほどと同じアプリが使えるはずです。

MySQLなテストアプリをデプロイする

それでは、先ほどのSQLite版をMySQLに置き換えてみましょう。

Gemfileの書き換え

まず、Gemfileをsqlite3からmysql2に書き換えます。
gem ‘mysql2′

そしてbundle install。

Gemfile.lockの書き換え

SQLiteの時と同じように、Gemfile.lockがmingw指定になっているので、書き換えます。
mysql2 (0.3.11-x86-mingw32) → mysql2 (0.3.11)

デプロイ

それではデプロイしましょう。今までと違うところは、vmc push時の設定です。

vmc push --runtime ruby19
Would you like to deploy from the current directory? [Yn]:
Application Name: railsu1tb
Application Deployed URL ["railsu1tb.cloudfoundry.com"]:
Detected a Rails Application, is this correct? [Yn]:
Memory Reservation ("64M", "128M", "256M", "512M", "1G", "2G") ["256M"]:
Creating Application: OK
Would you like to bind any services to 'railsu1tb'? [yN]: y  #ここでyを指定する
The following system services are available
1: mongodb
2: mysql
3: postgresql
4: rabbitmq
5: redis
Please select one you wish to provision: 2  #2を選択
Specify the name of the service ["mysql-a91c4"]:  #サービス名を指定。ひとまずデフォルトでよければEnter
Creating Service: OK
Binding Service [mysql-a91c4]: OK
Uploading Application:
  Checking for available resources: OK
  Processing resources: OK
  Packing application: OK
  Uploading (8K): OK
Push Status: OK

Staging Application: OK

Starting Application: OK

Would you like to bind any services to ‘railsu1tb’ のときに「y」を選択するのがポイントですね。あとはどのサービスを有効にするか聞かれるのでMySQLを選択する感じです。

Railsを触った事がある人ならば、「database.ymlがSQLiteのときのままだけど良いの?」と思ってしまうかもしれませんが、大丈夫です。
デプロイの際、MySQLをbindするように設定した場合、database.ymlの中身がまるごと上書きされるため、こちらで記述したものはすべて無視される形になります。
SQLiteを使うときは、特に何かサービスをbindするわけではないので、きちんとdatabase.ymlの中身を書いておく必要がありますが。

さて、デプロイも成功したのでブラウザでアクセスしてみましょう。問題無く動作しているはずです。

まとめ

ことはじめも8回目になってしまいましたが、いかがでしたでしょうか。

この記事を書いていて、Gemfile.lockのところにはずいぶん苦労させられました。
Gemfile.lockで起こる問題はWindows環境特有なものなので、あまり情報が無かったのですね。
Rails、、もといRuby自体、Windows環境で動かすには少々難アリなため、Cloud Foundryにおいても試している人はあまり多くないようです。

ことはじめの記事の性格上、人口としては一番多いWindowsを前提に話を進めてきたのですが、正直なところLinuxやMacを使ったほうがトラブルは少なくて済むかな・・・と。

それでもWindowsを使いたい、という人達のための参考になれば幸いです。

さて最終回にしてようやくhello worldを抜け出せたのですが、今思うともっと早めにこのDBあたりに触れていたほうが良かったようにも思えます。
また機会があれば分かりやすい形に再編集したいなと思っています。
もし「この記事のココが何を言っているのか良く分からない」や「ここの部分についてもうちょっと説明して欲しい」などのリクエストがあれば、是非コメントや@jacopen宛にご連絡ください。

それでは!

No Comments »

CloudFoundryを使って静的ファイルを公開する2 php利用編

2011年12月23日 | by | cloudfoundry

@u1です。

前回はheroku-staticを使って静的ファイルを公開しましたが、単に静的ファイルを公開するためにアプリを入れるのも面倒くさいです。
そこで今のcloudfoundry.comではまだ実装されていませんが、将来的には実装される可能性が高いphpの実装を利用して、特に何も面倒な事をせずに静的ファイルを公開してみます。

ちなみに2011/12/23現在はapi.cloudfoundry.comはphp実装には対応していません。
なのでphpを動かすためにはappfogを使うか、MicroCloudFoundryを使うか、CloudFoundryをgithubから入れるかのどれかの手が必要です。
本記事はphpを使える環境がある事を前提として書いてあります。

又、本記事はCloudFoundryJP AdventCalendar2011 23日目の記事となっています。

CloudFoundryでのphpの実装

apache2 + mod_php5を利用しています。今回はこれを利用します。
詳しくはCloudFoundry上のphpアプリの動作の仕組みを参照ください。

ファイル公開の仕方

まず公開したいディレクトリの中にファイルを入れます。

$ mkdir u1static
$ cd u1static
$ echo "u1static test" > index.html
$ ls
index.html
$ cat index.html
u1static test

この状態でvmc pushをします。
[WARNING] Can’t determine the Application Type.と出たときに8のphpを選択する事がキモです。

$ vmc frameworks

+-----------+
| Name      |
+-----------+
| otp_rebar |
| php       |
| sinatra   |
| spring    |
| node      |
| rails3    |
| grails    |
| java_web  |
| lift      |

$ vmc push u1static
Would you like to deploy from the current directory? [Yn]:
Application Deployed URL [u1static.vcap.me]:
[WARNING] Can't determine the Application Type.
1: Rails
2: Spring
3: Grails
4: Lift
5: JavaWeb
6: Sinatra
7: Node
8: PHP
9: Erlang/OTP Rebar
10: WSGI
11: Django
Select Application Type: 8
Selected PHP Application
Memory Reservation (64M, 128M, 256M, 512M, 1G, 2G) [128M]:
Creating Application: OK
Would you like to bind any services to 'u1static'? [yN]:
Uploading Application:
  Checking for available resources: OK
  Packing application: OK
  Uploading (0K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK  

これで完了です。
今回の場合であれば、u1staticディレクトリ配下がu1static.vcap.meの中にそのまま公開された状態になります、簡単ですね。

ファイルの更新、利用容量の表示方法はCloudFoundryを使って静的ファイルを公開する1 heroku-static編と同等なので参照ください。

まとめ

静的ファイル専用置き場はObjectStorageが多々出てきている現状ではそこまで利用するシーンは無いとは思いますが、Private CloudにCloudFoundryを打ち込んで使う時など一部のシーンでは将来的に使い道はありそうです。

No Comments »