こんにちは、ECナビ事業本部の新卒エンジニアのブライアンです。
ちょっと前に配属されたと思っていたら、4月には2年目突入です。1年なんてあっという間ですね。

オブジェクト指向やMVCやユニットテストなんてさっぱりな僕でしたが、
入社前は内定者エンジニア向け育成支援や、朝から晩までペアでTDD漬け等々の研修、配属後も優しくマサカリを投げてくれる先輩エンジニア達のおかげで、メキメキと技術力を伸ばしてきました。(自称)

できることも増えてきて、なにか作りたい欲がふつふつ湧いてきましたが、
VPS借りてサービス公開するにも、いかんせんサーバーに関してはまだまだ勉強不足。

ということで、サーバーのことはお任せしてサービスの開発に集中できるPaaSを使ってみることに。

PaaSだとFacebookアプリとかで使われるHerokuが有名ですが、
今回はPHPでサービスを作りたかったので、PHPに特化したPaaSのPagoda Boxを使うことにしました。

Pagoda Boxは無料で、200MB RAMのインスタンス1つと、10MB RAMのMySQLを使うことができるため、無料でさくっと何か作って動かしたいというにはちょうど良い感じですね。もちろん、課金すればスケールアウト、スケールアップもできます。


◆ Pagoda Boxに登録


ということで、早速新規登録から。
トップページの「Try It Free」からメアドとかを入れて登録します。
1


登録すると認証メールがScottさんから飛んでくるので、
Confirm my accountをクリックして認証します。
2

◆ Pagoda Box側でアプリを作成

認証が終わったら、早速ログインして作成開始です。
「New Application」のボタンを押すと、アプリケーションの作成方法を選ぶことができます。
3

アプリケーションの作成には、CakePHPやcodeigniterなどのフレームワークをインストールする方法と、既存のgitリポジトリを利用する方法、とりあえず空のリポジトリを作成する方法が選べます。

今回は、Slimを使おうと目論んでいたのですが、何回やってもインストールに失敗したので、CakePHPをインストールすることにしました。
「Quickstart」をクリックして「delicious-cake」を選択します。
4

「Launch」ボタンを押すと、下のコンソール画面でムニャムニャ動き出し、
しばらくすると、「View Live App」と「Manage Your App」のリンクが出てきます。
5

「View Live App」を見に行ってみると、おーもう動いてる!すごい!
6



◆ ローカルの開発環境に同じものを作る

Pagoda Box側ではあっという間にCakePHPが動き出したので、
今度はローカルの開発環境側で、CakePHPを動かして少しいじってデプロイしてみたいと思います。
今回、開発環境はVirtualBoxにScientifix Linuxをインストールして構築していますが、手軽にやるならXAMPPMAMPでLAMP環境を構築するのも有りだと思います。

デプロイはPagoda Boxのgitリポジトリにpushして行うので、まずはSSHキーの生成と登録から始めます。
SSHキーの生成はこの辺を参考に
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "****@*********"

既にgithub用の公開錠とかが有る場合は、Pagoda Box用の公開錠と秘密錠は、それぞれ、pagoda_box_id_rsa、pagoda_box_id_rsa.pubとかにリネームしてやって、configファイルを作成して使い分けするようにしておくと便利です。
$ touch ~/.ssh/config
$ vim ~/.ssh/config

configファイルはこんな感じで。
Host github.comUser git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa
 
Host git.pagodabox.com
User git
Hostname git.pagodabox.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/pagodabox_id_rsa

configファイルのパーミッションが誰でも見れるようにしていると怒られるので、自分しか見られないように変更します。
$ chmod 600 ~/.ssh/config

公開錠を生成したら、Pagoda Boxのダッシュボードの右上のユーザーネームのところから、「Add a new SSH Key」をクリックしてPublic Key Nameに適当に判別できる名前と、pagodabox_id_rsaの中身を貼付けて「Create Key」をクリックして登録します。
11
何故か、SSH Key is not a valid public keyとか出て焦ったけれど、もう一回作り直してみたらすんなり通った。なんかのバリーデーションに引っかかってたのかな。

Pagoda Boxに公開錠を登録できたら、早速Pagodaさんに挨拶しに行ってみます。
$ ssh git@git.pagodabox.com
Enter passphrase for key '/home/*****/.ssh/pagodabox_id_rsa': PTY allocation request failed on channel 0 :: Hi [USER NAME]! You've successfully authenticated, but Pagoda Box does not provide shell access. Connection to git.pagodabox.com closed.

無事に挨拶が終わったということで、ドキュメントルートにgit cloneしてきます。
cloneするURLはダッシュボードの右上の方にある「Show git Clone URL」をクリックすると表示されます。
$ git clone git@git.pagodabox.com:*****.git

とりあえずブラウザからローカルのドキュメントルート見に行くと動いていますね。
7

ただ、Security.saltとSecurity.cipherSeedを変えろとか、Your database configuration file is NOT present.とかCakePHPセットアップのお決まり文句言ってます。Pagoda BoxのLive Appでは、そんなエラー出てないのに。

なんか、FAQにデプロイする際にBoxfileをむにゃむにゃする的なことが書いてあった気がするので、そいつの中を見てみます。
$ vim Boxfile
web1:
    name: cake
    document_root: app/webroot
    shared_writable_dirs:
        - app/tmp/cache
        - app/tmp/logs
        - app/tmp/sessions
        - app/tmp/tests
        - app/tmp
    php_extensions:
        - mcrypt
        - apc
        - pdo_mysql
        - mysqli
        - mbstring
    after_build:
        - "mv pagoda/database.php app/Config/database.php"
        - "mv pagoda/core.php app/Config/core.php"
db1:
    name: db
    type: mysql

after_buildのところで、database.phpとcore.phpを書き換えてるっぽいですね。
開発環境とデプロイ環境の設定とかはこれでよしなにやるのか。なるほど。

◆ デプロイしてみる

とりあえずapp/Config/core.phpのSecurity.saltとSecurity.cipherSeed書き換えてブラウザで確認してみます。
(CakePHPのセットアップについては、ブログチュートリアルがとても参考になります)
14
とりあえずSecurity.saltとSecurity.cipherSeedの警告は消えたのでコミット・プッシュしてみます。
pagodaboxのリポジトリにプッシュするとデプロイがされます。
$ git add -i
$ git commit -m "core.phpの初期値を変更"
$ git push
Enter passphrase for key '/home/*****/.ssh/pagodabox_id_rsa':
Counting objects: 9, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 485 bytes, done.
Total 5 (delta 4), reused 0 (delta 0)
:: Deploying to c163cf8 on master
:: Parsing Boxfile
 
 _______________________
 BUILDING INFRASTRUCTURE
 """""""""""""""""""""""
   +> Init submodules
   :: Running After Build Hooks
      [ EXECUTING 2 HOOKS ]
 
      :: HOOK 1 ::
      ::  mv pagoda/database.php app/Config/database.php
      ---------------------------------------- OUTPUT:
      ------------------------------------------------
 
      :: HOOK 2 ::
      ::  mv pagoda/core.php app/Config/core.php
      ---------------------------------------- OUTPUT:
      ------------------------------------------------
      HOOKS COMPLETE - 2 Hooks Executed
 
 ______________________
 BOOTING INFRASTRUCTURE
 """"""""""""""""""""""
 + Booting Instances for web1
     web1.1
      - [25-Feb-2014 01:49:08] NOTICE: fpm is running, pid 106
      - [25-Feb-2014 01:49:08] NOTICE: ready to handle connections
 
 _________________________
 INFRASTRUCTURE GOING LIVE
 """""""""""""""""""""""""
 + Rerouting Traffic to new Infrastructure
 << traffic successfully ROUTED
 + Decommisioning Previous Infrastructure
To git@git.pagodabox.com:*****.git
   804a648..c163cf8  master -> master

なんか色々走って終わったみたいです。
設定ファイルをいじっただけなので、見た目は変化ないですがとりあえず簡単にデプロイは成功しました(やった!)

◆ Bakeでアプリのひな形を作る

せっかくなので、一つのテーブルを使って、CRUDができるものをCakePHPのBakeで作ってみようと思います。
ローカルの開発環境にデータベースとテーブルを作成して、Bakeを叩きます。
$ app/Console/cake bake

database.phpがないと設定を色々聞かれるので、ぽちぽち答えていきます。

database.phpが作成されたので、一旦コミットしておきます。
$ git add -i
$ git commit -m "database.phpを作成"

データベースの設定もできたのでサクッとBakeします
$ app/Console/cake bake all

焼き上がったらブラウザでアクセスしてみます。良い感じに焼き上がっていますね!
8

早速コミットしてプッシュしてデプロイします。
$ git add -i
$ git commit -m "BakeでCRUDのひな形を作成"
$ git push

この段階で、一旦、Pagoda BoxのLive Appを見に行きます。
9
焼き上がったBakeのひな形はしっかりデプロイできていますが、まだ、Pagoda Box側にはテーブルがないので怒っていますね。

◆ DB周りを触ってみる

ということで次にPagoda Box側のDBに、ローカルに作ったテーブルと同じものを作成します。
Pagoda-BoxのDBに触るには、Pagoda-BoxのターミナルクライアントのRubyGemを使います。(Rubyの1.9.2以上が必要です)
$ gem install pagoda

gemのインストールができたら、Pagoda-BoxのDBに接続してみます。
ローカルのアプリのリポジトリ内のディレクトリで、
$ pagoda tunnel -c db1

を実行します。-cは接続する先を指定していて、アプリ管理画面のダッシュボードの、db-1とかに対応しています。
10

最初にtunnelで接続しようとすると、認証のためにユーザーネームとパスワードの入力を求められるので、ユーザーネームにはダッシュボードの右上に書かれているものと同じものをPagoda-Boxの管理画面にログインするものと同じものを入力します。
$ pagoda tunnel -c db1
it appears this is the first time you have used our client
Username: bryan-f
Password: ******************

無事認証が済むと、Pagoda-BoxのDBとのTunnelが出来上がります。
MySQLに接続している間、このシェルは立ち上げっぱなしにしておきます。
MySQLの接続が必要なくなったら、ctrl-cでTunnelを閉じることができます。
Tunnel Established!  Accepting connections on :
-----------------------------------------------

HOST : 127.0.0.1 (or localhost)
PORT : 3307
USER : (found in pagodabox dashboard)
PASS : (found in pagodabox dashboard)

-----------------------------------------------
(note : ctrl-c To close this tunnel)

Tunnelが出来上がったら別のシェルを一つ立ち上げて、
> HOST : 127.0.0.1 (or localhost)
> PORT : 3307
を使って、Pagoda-BoxのDBに接続します。
$ mysql -h 127.0.0.1 -P 3307 -u [USER] -p

UserとPassは、ダッシュボードのdb-1のShow Credentialsをクリックすると確認することができます。
mysqlへの接続は、普段使っているクライアントを使っても大丈夫です。
12

mysqlに接続できたら、データーベースとか権限とか見てみます。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| test               |
+--------------------+

mysql> SHOW GRANTS FOR current_user();
+--------------------------------------------------------------------------------------------------------+
| Grants for *******@%                                                                          |
+--------------------------------------------------------------------------------------------------------+
| GRANT SUPER ON *.* TO '******'@'%' IDENTIFIED BY PASSWORD '*****************************************' |
| GRANT ALL PRIVILEGES ON `db`.* TO '*******'@'%' WITH GRANT OPTION                                      |
+--------------------------------------------------------------------------------------------------------+
 

dbデータベースに対して、ALL PRIVILEGESのデータベースレベルの権限が付与されているので、
このデータベースに、ローカルで作成したテーブルと同じテーブルを作成します。

テーブルの作成が無事終わったら、再びLive Appを見に行ってみる。
テーブルがないぞっていう文句もなくなり、新規作成、表示、編集、削除もばっちり動いてにっこりですね。
13







いかがでしょうか、こんな感じで簡単にWebサービスの開発・公開することができるPagoda Box。
個人的にはすごく気に入りました!

次回は、今回作ったものをベースに社内で使うちょっとしたサービスを作ってみようと思います!