1から始めるCakePHP × AWS SDK for PHP2 – 環境構築編

2013.10.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。

PHPでアプリケーションを書いているときに、アプリケーション内からAWSを操作したいことがあります。

  • S3へのファイルアップロード
  • SQSへのキューイング
  • SES経由でのメール送信
  • EC2インスタンスの情報取得

AWSはRESTインターフェースを提供しており、HTTPリクエスト経由でAWSの様々なリソースを扱うことができます。ですが、アプリケーションで一からHTTPリクエストを書くのは非効率的です。

AWSが提供しているSDKを利用すると、こういった操作をするための記述を簡単に書けるようになります。
PHPには、[AWS SDK  for PHP](SDK1) と [AWS SDK for PHP 2](SDK2)が存在します。
が、今から始めるならSDK2の方をお勧めします。

また、PHPには様々なWebアプリケーションフレームワークが存在します。Symfony, CakePHP, FuelPHP, Zend Frameworkなど、パッと思いつくだけで10個近くは出てきそうです。
その中で、私のお気に入りのCakePHPを使用して、AWS SDK for PHP 2を利用したAWS操作の簡単なサンプルアプリケーションを書いていきます。 CakePHP以外のフレームワークでも使えるよう、なるべく汎用的なコードを書いていこうと思います。

今日の記事では、環境を構築して、CakePHPのWelcomeページが表示されるところまで書いていきます。

CakePHPとは?

CakePHPは、オープンソースのPHP用Webアプリケーションフレームワークです。Ruby on Railsに影響を受けて開発され、bakeコマンドによるテンプレート自動生成などの機能を備えています。

更新も活発で、2013年1月に2.3.0が,8月末には2.4.0が登場しました。(2013/10/7現在での最新は2.4.1)

環境構築

前提環境

以下の環境で作成、検証しました。

  • 環境: Amazon EC2
  • Amazon Linux 2013.09 ami
  • PHP5.4
  • IAM Role設定済みインスタンス

PHP5.4を導入していますが、PHP5.2.8以降であればCakePHPを動かすことはできます。 また、一番最後のIAM Roleに関しては、こちらの記事を参考にしてください。権限は必要になったら付与していくので、何も設定しないでOKです。

パッケージインストール

EC2にログインし、まずは必要なパッケージをさくっと入れます。

$ sudo yum install -y php54        \
                    php54-pdo      \
                    php54-mbstring \
                    httpd24        \
                    mysql55-server 
$ sudo service mysqld start
$ sudo service httpd start

composerを利用したインストール

CakePHPとSDKをインストールするには、普通にtar.gzをダウンロードしてきて云々、という方法もありますが、今回はcomposerというツールを利用します。
Composer公式サイト(英語)
composerはRubyでいうBundlerにあたり、インストールするライブラリの依存管理とバージョン管理を引き受けてくれます。 composerの定義ファイルを、/var/www/html下にcomposer.jsonという形で、以下のように記述します。 *1

{
    "name": "aws-cakesample",
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.cakephp.org"
        }
    ],
    "require": {
        "pear-cakephp/cakephp": "2.4.1",
        "aws/aws-sdk-php": "2.*"
    },
    "config": {
        "vendor-dir": "vendor/"
    }
}

"require" に記述してあるのが、アプリケーションから利用するライブラリです。
次に、以下のコマンドを実行します。

# curl -sS https://getcomposer.org/installer | php
# ls -al
total 904
drwxr-xr-x 2 root root   4096 Oct  6 03:29 .
drwxr-xr-x 7 root root   4096 Oct  6 03:22 ..
-rw-r--r-- 1 root root    307 Oct  6 03:26 composer.json
-rwxr-xr-x 1 root root 913318 Oct  6 03:29 composer.phar

composer.pharというファイルが作成されました。その後、以下のコマンドを実行します。

# php composer.phar install
(出力省略)
# ls -al
total 920
drwxr-xr-x 3 root root   4096 Oct  6 03:32 .
drwxr-xr-x 7 root root   4096 Oct  6 03:22 ..
-rw-r--r-- 1 root root    308 Oct  6 03:31 composer.json
-rw-r--r-- 1 root root   9273 Oct  6 03:32 composer.lock
-rwxr-xr-x 1 root root 913318 Oct  6 03:29 composer.phar
drwxr-xr-x 8 root root   4096 Oct  6 03:32 vendor
# ls -al vendor/
total 36
drwxr-xr-x 8 root root 4096 Oct  6 03:32 .
drwxr-xr-x 3 root root 4096 Oct  6 03:32 ..
-rw-r--r-- 1 root root  183 Oct  6 03:32 autoload.php
drwxr-xr-x 3 root root 4096 Oct  6 03:32 aws
drwxr-xr-x 2 root root 4096 Oct  6 03:32 bin
drwxr-xr-x 2 root root 4096 Oct  6 03:32 composer
drwxr-xr-x 3 root root 4096 Oct  6 03:32 guzzle
drwxr-xr-x 3 root root 4096 Oct  6 03:32 pear-pear.cakephp.org
drwxr-xr-x 3 root root 4096 Oct  6 03:32 symfony

依存関係含め、必要なパッケージ群がインストールされました。また.lockファイルも作成されています。

ミドルウェア設定

CakePHPを動作させるために、ミドルウェア群にいくつか設定が必要です。

httpd

CakePHPでは、.htaccessを利用したURLリライトを使うため、.htaccessの利用を許可する必要があります。
httpd.confのAllowOverrideの値を書き換えます。

$ diff -u /etc/httpd/conf/httpd.conf.orig /etc/httpd/conf/httpd.conf
--- /etc/httpd/conf/httpd.conf.orig	2013-10-05 10:14:41.094487436 +0000
+++ /etc/httpd/conf/httpd.conf	2013-10-05 10:15:10.841296014 +0000
@@ -148,7 +148,7 @@
     # It can be "All", "None", or any combination of the keywords:
     #   Options FileInfo AuthConfig Limit
     #
-    AllowOverride None
+    AllowOverride All
 
     #
     # Controls who can get stuff from this server.

$ sudo service httpd restart

httpdの再起動をお忘れなく。

PHP

PHPの設定内容は適宜変える必要がありますが、必ず変えて置かなければならない箇所が一箇所あります。
それがタイムゾーンの設定です。パッケージでインストールすると、デフォルトでは無指定(コメントアウトされている)ので、明示的に値を設定してあげましょう。

$ diff -u /etc/php.ini.orig /etc/php.ini
--- /etc/php.ini.orig	2013-10-05 09:56:28.151362646 +0000
+++ /etc/php.ini	2013-10-05 09:56:39.591377941 +0000
@@ -875,7 +875,7 @@
 [Date]
 ; Defines the default timezone used by the date functions
 ; http://php.net/date.timezone
-;date.timezone =
+date.timezone = Asia/Tokyo
 
 ; http://php.net/date.default-latitude
 ;date.default_latitude = 31.7667

$ sudo service httpd restart

PHPの設定変更後も、httpdの再起動が必要になります。

アプリケーションの雛形作成

長かったですが、ようやくアプリケーション作成に移ります。
雛形の作成には、CakePHPの付属コマンドである[bake]を利用します。

$ cd /var/www/html
$ sudo mkdir aws-cakesample
$ sudo vendor/bin/cake bake project aws-cakesample/

Welcome to CakePHP v2.4.1 Console
---------------------------------------------------------------
App : html
Path: /var/www/html/
---------------------------------------------------------------
Skel Directory: /var/www/html/vendor/pear-pear.cakephp.org/CakePHP/Cake/Console/Templates/skel
Will be copied to: /var/www/html/aws-cakesample/
---------------------------------------------------------------
Look okay? (y/n/q) 
[y] > y
---------------------------------------------------------------
Created: aws-cakesample in /var/www/html/aws-cakesample/
---------------------------------------------------------------
 * Random hash key created for 'Security.salt'
 * Random seed created for 'Security.cipherSeed'
 * Cache prefix set
 * app/Console/cake.php path set.
CakePHP is not on your `include_path`, CAKE_CORE_INCLUDE_PATH will be hard coded.
You can fix this by adding CakePHP to your `include_path`.
 * CAKE_CORE_INCLUDE_PATH set to /var/www/html/vendor/pear-pear.cakephp.org/CakePHP in webroot/index.php
 * CAKE_CORE_INCLUDE_PATH set to /var/www/html/vendor/pear-pear.cakephp.org/CakePHP in webroot/test.php
   * Remember to check these values after moving to production server
Project baked successfully!
$ sudo chown -R apache:apache aws-cakesample/
$ ls -al aws-cakesample/
合計 64
drwxr-xr-x 14 apache apache 4096 10月  6 03:48 2013 .
drwxr-xr-x  4 root   root   4096 10月  6 03:46 2013 ..
-rwxr-xr-x  1 apache apache  140 10月  6 03:32 2013 .htaccess
drwxr-xr-x  3 apache apache 4096 10月  6 03:48 2013 Config
drwxr-xr-x  4 apache apache 4096 10月  6 03:48 2013 Console
drwxr-xr-x  3 apache apache 4096 10月  6 03:48 2013 Controller
drwxr-xr-x  2 apache apache 4096 10月  6 03:48 2013 Lib
drwxr-xr-x  3 apache apache 4096 10月  6 03:48 2013 Locale
drwxr-xr-x  4 apache apache 4096 10月  6 03:48 2013 Model
drwxr-xr-x  2 apache apache 4096 10月  6 03:48 2013 Plugin
drwxr-xr-x  4 apache apache 4096 10月  6 03:48 2013 Test
drwxr-xr-x  2 apache apache 4096 10月  6 03:48 2013 Vendor
drwxr-xr-x  9 apache apache 4096 10月  6 03:48 2013 View
-rwxr-xr-x  1 apache apache  205 10月  6 03:32 2013 index.php
drwxrwxrwx  6 apache apache 4096 10月  6 03:48 2013 tmp
drwxr-xr-x  6 apache apache 4096 10月  6 03:48 2013 webroot

aws-cakesample/以下が、アプリケーションの本体で、vendor以下に入っている部分はCakePHPのコア部分です。
ここまでくれば、ブラウザでアクセスするとCakePHPのデフォルトWelcomeページが表示されるはずです。
http://<IP or Hostname>/aws-cakesample にアクセスしてみましょう。

2013-10-06_1253

データベース設定がない、と警告が出ていますが、そこは次回修正します。

まとめ

今回は環境構築だけで終わってしまいました。SDKを期待されていた方は、次回以降にご期待ください。
また、冒頭でPHPのSDKには2種類あると書きましたが、そちらの比較等もいずれまとめていこうと思います。

脚注

  1. 今回は実験環境なので、簡易化のため/var/www/htmlに置いていますが、ここはDocumentRoot以下のためHTTPでアクセスできてしまいます。
    本来は/usr/localや/opt以下などに作成しましょう。