APPFogにFuelPHPで作ったアプリをデプロイする

PHPFogが今年でサービス提供を終了するのでAPPFogに乗り換えようと思います。

乗り換えるのは今現在PHPFogにデプロイされている「はてなダイアリーキーワードBot

サインアップとアプリケーション作成

まずはAPPFogにアカウントを作ってアプリケーションを作成します。

  • Step 1: Choose an application

 PHPを選択します。Java, Groovy, Python, Ruby, Nodeとか色々あって嬉しくなりますね。
 ちなみにフリープランだと10Apps作成可能みたいです。フリーでRAMが2GBもあるので結構遊べそうです。

  • Step 2: Choose an infrastructure

 多分どれでもいいと思うんだけど、とりあえずAWSで一番距離的に近そうなシンガポールを選択。

  • Step 3: Choose a subdomain:

 アプリのドメイン。xxx.ap01.aws.af.cm。サブドメインがダサい

データベースの作成

アプリケーションコンソールの「Service」から、MySQLとDB名を指定してCreateします。
DB接続はphpMyAdminとかもできるみたいなのですが、PagodaBoxのようにクライアントからSSHトンネリングしてDBに直繋ぎできるみたいなので今回はそっちでやってみます。

APP Fogコマンドラインツールのインストール

afツールはgemでinstall後、コマンドラインからAPPFogにログインします。
gemはMacOS X Lionなら気にせずafをインストールできます。
https://docs.appfog.com/getting-started/af-cli#max-os-x-linux

$ sudo gem install af
$ af login
$ Attempting login to [https://api.appfog.com]
Email: <登録したemail>
Password: <パスワード>
Successfully logged into [https://api.appfog.com] 

SSHトンネリング

$ af tunnel
To use `af tunnel', you must first install Caldecott:

	gem install caldecott

Note that you'll need a C compiler. If you're on OS X, Xcode
will provide one. If you're on Windows, try DevKit.

This manual step will be removed in the future.

Error: Caldecott is not installed.

ありゃ。caldecottってなんだ。
調べてみたらVMCトンネリングのgem プラグインらしい。うん必要だね。ってことでcaldecottをインストールして再チャレンジ。

$ af tunnel
1: hateda-db
2: hateda-db2
Which service to tunnel to?: 1 
Getting tunnel connection info: OK

Service connection info: 
  username : <内緒>
  password : <内緒>
  name     : <内緒>
  infra    : ap-aws

Starting tunnel to hateda-db on port 10000.
1: none
2: mysqldump
3: mysql
Which client would you like to start?: 1 
Open another shell to run command-line clients or
use a UI tool to connect using the displayed information.
Press Ctrl-C to exit...

最初に使用するDBを聞かれますので対象のDBを選択します。
その後どういった形で使用するか聞かれます。それぞれ、

  1. トンネリングだけ
  2. 接続したMysqlのdumpを取得
  3. mysqlコマンドラインで接続

になります。今回はクライアントの「Sequel Pro」から接続しますので1:noneを選択します。
接続されたらlocalhostのポート10000、コンソールに表示されたusernameとかを入力してDB接続します。
接続できたのでPHPFogのphpMyAdminからdumpを取得してAPPFogのDBに流し込んで移行完了。

環境変数の設定

アプリケーションコンソールの「Env. Variables」から設定します。お決まりのFUEL_ENVやTwitterのコンシューマキーなどをファイルに書きたくないものを設定。
ここで注意したいのは、コンソールから設定した環境変数は$_SERVER変数で参照できません。(ここで嵌りました)
環境変数を参照する際はgetenvで参照する必要があります。
fuel/app/bootstrap.phpも$_SERVER変数見てますので、productionモードでデプロイしたい場合は、アプリケーションコンソールでFUEL_ENVを設定し、かつfuel/app/bootstrap.phpの27行目を以下のように修正する必要があります。

<?php
・・・省略
Fuel::$env = getenv('FUEL_ENV') ? getenv('FUEL_ENV') : Fuel::DEVELOPMENT;

fuel/app/config/production/db.phpの変更

変更前

<?php
/**
 * The production database settings.
 */
return array(
    'default' => array(
        'connection'  => array(
            'dsn'        => "mysql:host=".$_SERVER['MYSQL_DB_HOST'].";dbname=".$_SERVER['MYSQL_DB_NAME'],
            'username'   => $_SERVER['MYSQL_USERNAME'],
            'password'   => $_SERVER['MYSQL_PASSWORD'],
        ),
    ),
);

APPFogだとDBの接続情報に関する扱いがちょっと変わっているのでこれに対応する必要があります。
https://docs.appfog.com/services/mysql
変更後

<?php
/**
 * The production database settings.
 */
$services_json = json_decode(getenv("VCAP_SERVICES"),true);
$mysql_config = $services_json["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"];

return array(
    'default' => array(
        'connection'  => array(
            'dsn'        => "mysql:host=".$hostname.";port=".$port.";dbname=".$db,
            'username'   => $username,
            'password'   => $password,
        ),
    ),
);

デプロイ

これは簡単です。アプリケーションのルートディレクトリで

$ af update <app_name>

すればおk。コマンドを実行する際のカレントディレクトリのソースをアップロードするみたいで別のディレクトリで上記コマンド叩くとデプロイに失敗しますのでご注意を。(分かり易いといえば分かり易いですが)
移行後のURLはこちらになりましたー
http://hateda-bot.ap01.aws.af.cm

その他雑感

PHPFogと比べると格段に使い易さが向上した気がします。
プランの範囲内ならアプリケーションのインスタンスもRAMも自由に調節できたり、
SSHトンネリングでDBアクセスできたり(phpMyAdmin使わなくてもよいのはデカいと思う)
そこそこいい感じのPaaSです。
PagodaBoxも悪くはないですけど、デプロイできるアプリケーションが無料で1インスタンスなのでAPPFogの方が色々使い勝手がよいかもしれません。