こんにちわ。ECナビ事業本部の小林です。
9月からECナビに入社し、先日リリースした「ナビバリュー」の開発に携わってきました。

ナビバリューはECナビのサイト上で実施している人気の商品をどのECサイトよりも安く購入できるサービスです。現在のところ、毎週10種類の商品を数量限定で販売していますので、是非毎週チェックしてみてくださいね!!

さて宣伝はここらへんにしておいて、今回ナビバリューを開発するにあたって twitter、 bitly、Amazon Web Service など様々な外部のサービスを利用しています。
そのなかで今回は Amazon S3 を PHP から利用する方法について簡単に紹介をしていきたいと思います。

Amazon S3 って?
今更説明の必要はないかもしれませんが、Amazon が提供する従量制課金のストレージサービスです。詳しくは公式ページへ→ http://aws.amazon.com/jp/s3/

目的
ナビバリューの開発に合わせてユーザーが商品レビューを投稿する際に画像をアップロードできるようになりました。S3はアップロードされた画像の保管場所兼コンンツ提供サーバとして使用しています。自前でストレージを用意するよりは以下のようなメリットが挙げられます。
  • ディスク容量などの物理的な制限を気にせずに済む
  • 専用サーバを用意するより早い、初期コストが安く済む
実際に使ってみる
まず本格的にアプリケーションに組み込む前にファイルをアップロードする簡単なプログラムで試してみました。
  1. SDK
    PHP から利用するには amazon から提供されている SDK を利用させてもらいます。この SDK には PHP から Amazon S3 や EC2 などを使うのに便利な API が含まれています。
  2. 設定ファイル
    ダウンロードした SDK の中に config-sample.inc.php という名前のファイルが含まれており、これが設定ファイルの雛形になります。これを config.inc.php という名前でコピーして、必要な項目を記述していきます。設定に必要な情報は http://aws.amazon.com/ からアカウント→セキュリティ証明書で確認できます。この config.inc.php と SDK に含まれる sdk.class.php を include します。
    include_once "./sdk-1.0.1/sdk-1.0.1/sdk.class.php";
    include_once "./config.inc.php";
  3. バケットをつくる
    Amazon S3 ではバケットというディレクトリのようなものを作成し、そこにファイルをアップロードしていきます。ただしバケットの中にバケットを作ることはできません。また、バケット名は Amazon S3 のサービス内でユニークでなければなりません。ここでつけたバケット名はアップロードしたファイルを公開したときのURLに使われます。たとえば ecnavi-tech-blog  というバケット内に test.jpg というファイルを作成した場合は
      http://ecnavi-tech-blog.s3.amazon.aws.com/test.jpg
    でアクセスすることができます。 バケットを作成するには AmazonS3 クラスの create_bucket を使います。ここではリージョンやアクセス権の指定もできますが、テストなのでとりあえずデフォルトのままにしておきます。
    $s3 = new AmazonS3();
    $s3->create_bucket("ecnavi-tech-blog");
  4. ファイルをアップロードする
    ファイルをアップロードするには AmazonS3 クラスの create_object で、バケット名、アップロード先のファイル名、第3引数の配列でアップロード元のファイル名やアクセス権などを指定します。ここでは/tmp/foo.jpgという名前のファイルをtest.jpgという名前でアップロードしています。またhttp経由で誰でも見られるようにするために、アクセス権はACL_PUBLICを指定します。
    $s3->create_object("ecnavi-tech-blog", "test.jpg", array('fileUpload' => "/tmp/foo.jpg", 'acl' => AmazonS3::ACL_PUBLIC);
    これで3で書いた URL で画像が表示されると思います。
    TIPS
      公開URLを階層構造にしたい場合、アップロード後のファイル名(2番目の引数)を "testdir/test.jpg" などとすると下記のようなURLで公開できます。
      http://ecnavi-tech-blog.s3.amazon.aws.com/testdir/test.jpg
まとめ
アップロードの触りだけでしたが、ドキュメントとSDKに含まれているサンプルコードを一通りながめればその他の操作も特に難なくできると思います。ソフトウェアの開発期間が短かくなっている昨今、このように便利なAPIが用意されているとRESTやSOAPを直接操作することをしなくて済むので非常に助かります。