工場長のブログ

日々思ったことを書いてます。

Elastic BeanstalkでFuelPHPを動かしてみた。

2012/12時点で、Elastic BeanstalkのPHPコンテナが新しくなっているので、この記事通りに動かないかもしれません。



PHPを書く機会があったのでElastic Beanstalkを使ってみた。
gitからpushでデプロイできるので便利ですね。

使い方のイメージは下記の感じ。(内容はほぼ下記のとおり)
http://docs.amazonwebservices.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_PHP_eb.sdlc.html

必要なもの

手順

1. ディレクトリ構成を確認

repo/
  public/
    index.php
  fuel/
    app/
      bootstrap.php
      classes/
      ...
    core/
      bootstrap.php
      classes/
      ...
  ...

2. repo直下でgit initする。

$ cd repo
$ git init

3. 次にElastic Beanstalkのツールでリポジトリをinitする。

$ eb init
  • 途中でいろいろ聞かれます。AccessKeyとSecretKey以外はすべて選択肢が提示されますのでとても簡単です。
    • AWSのAccessKey
    • AWSのSecretKey
    • 今回利用するリージョン
    • ElasticBeanstalk上で識別するためのアプリケーション名
    • ElasticBeanstalk上で識別するための環境名
    • 今回アプリケーションサーバーに利用するEC2のインスタンスタイプ

4. 環境を作成してアプリケーションを開始する。

$ eb start
  • このコマンドが完了した時点でEC2やELBが立ち上がってくる。アプリケーションに関してはAWSで用意しているPHPのサンプルアプリケーションがデプロイされた状態。

5. FuelPHPのアプリをデプロイする

git aws.push
  • これで手もとのリポジトリのコードがEC2にデプロイされる。

6. 動作確認!

  • あとは環境が立ち上がってきてmanagement console上からこんなふうに見えるようになっていればOK!なんだだけど、この状態だと残念ながらそうはならない。緑ではなく赤い四角が見えてる状態。いくつかapacheのconfigの修正が必要。

f:id:imai-factory:20121010200111j:plain

7. EC2にログインしてhttpd.confを修正

  • Elastic Beanstalkでは、'/var/www/html'にgitからpushされたコードをデプロイしてくれるんだけど、FuelPHPでは'リポジトリルート/public'がDocumentRootになるので、ここが問題になっている。
  • 修正の方法としては、立ち上がっているEC2にログインしてhttpd.confを修正するこ。まずはElastic Beanstalkの環境の設定画面から下記の用にログイン用のKey Pairを登録(Existing Key Pairのところ)。これはすでに自分の持っているSecurity Key Pairの名前を入力すればOK。

f:id:imai-factory:20121010200635j:plain

  • Apply Changesするとサーバーが再起動してくるので、再起動が終わったらEC2にログイン。再起動の状況やEC2のIPアドレスなどはEC2の管理画面から確認可能です。
  • ログインしたら"/etc/httpd/sites/application(中身はこのアプリケーション用のVirtualHostの設定)というファイルのDocumentRootを/var/www/htmlから/var/www/html/publicに修正
<VirtualHost *:80>
    #DocumentRoot /var/www/html 旧設定
    DocumentRoot /var/www/html/public
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
    SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
    CustomLog "/var/log/httpd/application-access_log" combined env=!forwarded
    CustomLog "/var/log/httpd/application-access_log" proxy env=forwarded
    ErrorLog /var/log/httpd/application-error_log

    #<Directory "/var/www/html"> 旧設定
    <Directory "/var/www/html/public">
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
  • これでapacheを再起動してやれば無事に立ち上がってきます。

8. AMIを登録しておく

  • 上記で編集したhttpd.confの設定を永続化するためにEC2のイメージ(AMI)を作成しておく。やりかたはEC2の管理画面からインスタンスを右クリックして"Create Image(EBS AMI)"をすればOK.
  • 作成されたAMIのIDをElastic Beanstalkの設定画面から、起動イメージ(Custom AMI ID)のところに設定してやれば次回以降はこのイメージからマシンが立ち上がってくる。

f:id:imai-factory:20121010200635j:plain


あとは開発環境で開発したコードをgit aws.pushしてやればそのたびにコードをデプロイして環境を再起動してくれます!

注意点

  • 注意すべき点として、EC2がロードバランサーからのヘルスチェックに200を返せる状態にしておかないとロードバランサー側でバランス対象から自動で外されてしまうこと。同じく環境設定画面の"Load Balancer"のタブの中でヘルスチェックの設定ができるのでここを適宜設定する感じで。

f:id:imai-factory:20121010202054j:plain

まとめ

  • Elastic BeanstalkはAWSをPaasっぽく使えるようにしてくれるラッパーっぽいもの。
  • デフォルトでは、コードは/var/www/htmlにデプロイされて、apacheのDocumentRootがそこを向いてる環境が立ち上がってくるので、好みにあわせてサーバーの設定をいじって、再度AMIにかためておく。

という感じ。