AWS BeanstalkにCakePHPのサンプルをGitでデプロイした

BeanstalkでPHPをGitでデプロイできるそうなのでどんなことができるのかやってみました。

背景

以下のことを調査したかった

  • BeanstalkでPHPフレームワークの利用
  • 利用した時の感触
  • Gitでのデプロイによって開発のサイクルを回しやすくしたい

CakePHPでのサンプルアプリ作成手順

環境の設定などはこちらのブログを参考にしながら、以下の手順で行いました。
http://d.hatena.ne.jp/j3tm0t0/20120404/1333531368

ちょこちょこつまづきながらも、できました。Gitデプロイ便利ですね。
f:id:xeder:20120418165306p:plain

確認/少し工夫したこと

Gitでの開発→テストを簡単にしたい

開発→開発環境でのテスト→ステージング環境でのテスト→本番へのデプロイ というサイクルを回しやすくしたい。
つまり、↓を回しやすくしたいということです。
f:id:xeder:20120418165411p:plain
出典: http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/create_deploy_PHP.sdlc.html

リンク先の開設の中でも、以下のように述べられているわけですが、どのように実現できるのか確認してみました。

The following diagram illustrates a typical software development life cycle including deploying your application to AWS Elastic Beanstalk.

手順
  • ステージングと本番環境の用意
    • RDSもステージングと本番で二つ用意
    • アプリケーションの中に二つの環境を作成
      • ステージングはもったいないのでWebサーバーは1台にしておく (Actions->Edit/Load Configuration)

f:id:xeder:20120418170043p:plain

  • テスト環境と本番環境でアプリの設定を変更するようにアプリを変更
    • 今回は環境によって接続先DBを変更させるようにした
      • Consoleで環境にごとにオプションの値を変更 (Actions->Edit/Load Configuration)
      • app/AppModelの中でオプションの値によって接続先DBを変更するように修正

f:id:xeder:20120418173410p:plain

public function __construct($id = false, $table = null, $ds = null) {
     parent::__construct($id, $table, $ds);
     if (!get_cfg_var('aws.param1')) {
         $this->useDbConfig = 'development';
     } else {
         if (get_cfg_var('aws.param1') == 'production') {
             $this->useDbConfig = 'default';
         } else {
             $this->useDbConfig = 'test';
         }
     }
}
  • test 環境にだけ push する
  • テスト環境でOKであることが確認できたら、本番にデプロイ
    • 本番にデプロイするときにはセレクトボックスからリビジョンを選ぶだけなので、非常に簡単でした。

f:id:xeder:20120418171505p:plain

エラーログの確認

デプロイ後、テスト環境で正常に表示されなかったため、CakePHPのログを確認しました。
以下のように、-e の後ろに環境名を付けて コマンドを実行すると、その環境のWebサーバーが返ってくるので、そのIDに対してSSHログインしました。

$ elastic-beanstalk-describe-environment-resources -e XXXXXX
AutoScalingGroups | EnvironmentName | Instances | LaunchConfigurations | LoadBalancers | Triggers
-------------------------------------------------------------------------------------------------
awseb-XXXXX-zbLQ9Yk4kG | XXXXX | i-06980XXX, i-509e0XXX | awseb-XXXXX-5Cc71hQOwh | awseb-XXXXX | awseb-XXXXX-zbLQ9Yk4kG

デプロイしたファイルは/var/www 以下に配置されるようです。

Gitで誰がデプロイするか

git aws.push は git push -f ....へのエイリアスなので、複数の開発者がpushすれば、親子関係などを無視してpushできてしまいます。開発者は共通のレポジトリにpushするだけにして、Beanstalkにpushする際には注意を払ってmasterのHEADが必ず上がるようにした方がいいのですかね。

Auto Scaleするか確認してみたいですね。

*1:http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog/blog.html