AWS SDK for PHP2 に実装されている Amazon S3 stream wrapper で S3 を操作してみました。
Amazon S3 stream wrapper を使うと「s3://bucket/foo/bar.txt」といったパスで mkdir() や file_get_contents() などの標準関数から S3 を操作することができます。
Amazon S3 stream wrapper の使い方
Amazon S3 stream wrapper は AWS SDK for PHP2 に含まれているので、SDK をインストールしておきます。インストール方法などは下記をどうぞ。
AWS SDK for PHP 2 をインストールして AutoScaling の設定を行う
Aws\S3\S3Client の registerStreamWrapper メソッドを実行すると「s3」というプロトコルが有効となります。
あとは通常のファイル操作と同じように mkdir() や file_get_contents() 関数にて操作対象の S3 オブジェクトを操作します。
パス名は以下の形式で指定します。
s3://バケット名/キー(パス)
たとえば bucket1 というバケットの /folder/foo.txt であれば下記のようになります。
s3://bucket1/folder/foo.txt
以下のサンプルでは、東京リージョンに存在するバケットに対して、dir1/dir2 というフォルダを作成して、file1, file2, file3 というファイルをアップロードしています。さらに dir1/dir2 の内容を読み込んで echo しています。
これを実行すると以下のように出力されます。
$ php s3_stream_wrapper.php s3://shin1x1-tokyo/dir1/dir2/file1.txt = file1 s3://shin1x1-tokyo/dir1/dir2/file2.txt = file2 s3://shin1x1-tokyo/dir1/dir2/file3.txt = file3
Management Console でも S3 にオブジェクトが作成されていることが分かります。
Amazon S3 stream wrapper を使う利点
stream wrapper で S3 を操作する利点ですが、まず普段ファイルを操作するのと同じ方法で操作できるのが便利です。
また、スキーマを変更するだけで別のプロトコルで処理ができるので、ユニットテストが書きやすくなります。
具体的には、「s3://」といったパスを引数で渡して処理を実行するように実装しておきます。すると、テスト時は vfsStream を使って「vfs://」からはじまるパス名に渡すように変更すれば、S3 へ通信させることなくテストを実行することができます。
SDK の API を実行するよりも簡単にS3 を操作できるのでおすすめです。
参考
- Amazon S3 stream wrapper
http://docs.aws.amazon.com/aws-sdk-php–2/guide/latest/service-s3.html#amazon-s3-stream-wrapper