s3バケットのフォルダ存在チェックでハマった事

はじめに

久しぶりの投稿だなー
サボりすぎかwww
今回はAWS SDK for PHPで用意されている関数doesObjectExistを使って、
バケット内にあるフォルダーの存在チェックをやった時にハマった事を書いていきたいと思います。

問題

s3コンソール上で確認するとフォルダはあるにも関わらず、
doesObjectExistで存在チェックするとfalseで返ってくるケースがある!!!

原因

そもそもs3にはフォルダというものがなくて、所謂フォルダもファイルもオブジェクトとして認識している。

では、どんな場合に上記問題が発生するの?

存在しないフォルダに対して、直接ファイルをPUTする場合に発生してしまいます!
例:
プログラムなどでdata/のフォルダがない状態で直接data/abc.txtをPUTした場合
s3内部では以下のような形になります。

data/ #オブジェクトは存在しない!
data/abc.txt #オブジェクトは存在する

上記のような状況でdoesObjectExisを使って、オブジェクトの存在チェックを行うとfalseが返ってきます。

解決方法

では、どうすればいいの!!!

フォルダの存在チェックを行いたい場合はdoesObjectExisを使わずに、listObjectsを使いましょう!

Sample

<?php

$config = array(
    'region'      => "リージョン情報",
    'version'     => 2006-03-01,
    'credentials' => array(
        'key'    => "アクセスキー",
        'secret' => "シークレットキー",
    ),
);
$s3 = new S3Client($config);
$list_objects = $s3->listObjects(array(
        'Bucket'  => "対象バケット",
        'Prefix'  => "確認したいフォルダパス",
        'MaxKeys' => '1'
));
if (is_null($list_objects['Contents'])) {
    return false;
}

listObjectsPrefixを使って、一致するオブジェクトを探す。
対象オブジェクトがあればContentsがセットされたレスポンスデータが返ってくるので、
一個でもあれば、フォルダがあるとみなして良いと思います。

– PR –
– PR –