AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

Amazon S3 stream wrapper で S3 操作時の注意点

S3を触っていて、これは便利と思った機能。「s3」というプロトコルが使えるようになり、ローカルのファイル操作と同じように、S3上のファイルを触れるようになります。

触って、ちょとだけはまったのが次のポイント。

※2013/08/13に修正・追記

S3のフォルダは is_dir() で判定できないis_dir()で判定できない時ががある

S3バケット中で作れるフォルダは、「フォルダライクなファイル」。その為か、is_dir() でS3のフォルダパス渡しても false が返りました返るケースがありました。

  • ManagementConsoleでS3バケット上にフォルダを作る → is_dir() にはfalseが返る
  • StreamWrapperで作ったフォルダとか、EMR実行の結果作成されたフォルダ → is_dir() にはtrueが返る

いくつかローカルファイルを扱うコードを試して、ここだけ違いがありました。(ただし、バケットそのものは、 is_dir() で判定可能です)

なお作り方によって、ディレクトリ内をreaddir()した結果に違いがありました。このあたりが、結果に反映されてるのかな?

  • ManagementConsoleでS3バケット上にフォルダ → . ファイルが存在する
  • StreamWrapperで作ったフォルダ → . ファイルは存在しない

公式のドキュメントは見つけれらなかったのですが、次のエントリから「/で終わるファイル」をフォルダとして表記しているだけという理解。そのため、上記の反応は、S3の構造上、正しいといえると思います。

S3 stream wrapperの理解

S3 stream wrapperの使い方

S3クライアントから、次のメソッドを呼び出すと使えます。

なお、SDK for PHP の v1でもv2でもサポートされてるようです。(v1では未検証ですが、サンプルコードのポストを目にしました)

stream wrapperって?

もともと、PHPにStreamWrapperという機能があり、その s3:// 版なんですね。

S3 stream wrapperを使う利点

なるほど、テストなどが統一的にかける様になる。なっとくです。テスト時は vfsStream を使って「vfs://」か。