Edited at

【Laravel5】 StorageファサードでS3上のディレクトリを消そうとして詰んだ時の解消方法

More than 3 years have passed since last update.


前提

AWSアカウントでは最大で100個のバケットを作成できます。(デフォルト)


裏を返すと100個までしかバケットを作成することができません。

そのため、各環境ごとにバケットを作成してその下にプロジェクト毎にディレクトリを作って運用しています。

以下の例のようなイメージです。

なお、dev環境で実装中にpro環境のファイルを誤って消去しないようにACCESS KEYは別なものを使用しています。


S3/

├dev/
│ ├-ApplicationA/
│ │ └-year
│ │ └-month
│ │ └-1.jpg
│ └-ApplicationB/

│-stg/
│ ├-ApplicationA/
│ │ └-year
│ │ └-month
│ │ └-1.jpg
│ └-ApplicationB/

└-pro/
├-ApplicationA/
│ └-year
│ └-month
│ └-1.jpg
└-ApplicationB/


StorageファサードでS3へ接続

以下を参考にして実装しています。

【Laravel5】Storageファサードでお手軽S3アップロード


ディレクトリを消す実装

※year/monthは画像がアップロードされた年月ですが、今回は簡易化のためにyear/monthとしています。

$DIR = 'ApplicationA/year/month/';

$disk = Storage::disk('s3');
$result = $s3->deleteDirectory($dir);

これで消えるはずでした。


エラーメッセージ

 local.ERROR: Aws\S3\Exception\NoSuchKeyException: AWS Error Code: NoSuchKey, Status Code: 404, AWS Request ID: XXXXXXXXXX, AWS Error Type: client, AWS Error Message: The specified key does not exist., User-Agent: aws-sdk-php2/2.8.21 Guzzle/3.9.3 curl/7.19.7 PHP/5.5.xx ITR

上記のエラーメッセージが出てしまいました。


原因

単純ミス。

StrorageファサードでS3へ接続する場合


config/filesystems.php

|  'bucket' => env('S3_BUCKET'),


でenvにS3_BUCKETを指定する必要が有ります。

S3_BUCKET = dev/ApplicationA

しかし、上記filesystemsで指定するbucketはkey通りbucketなので

各環境のディレクトリパスを含んではいけません。

つまり

S3_BUCKET = dev

のみの指定となります。

こうすることで実行が可能となりました。


その他の実装方法


aws-sdk-php-laravelを使う。

初期設定をした後

$s3 = \App::make('aws')->get('s3');

$bucket = env('S3_BUCKET');
$folder = 'ApplicationA/year/month/';
$s3->deleteMatchingObjects($bucket, $folder, '/.*/');

deleteMatchingObjectsを使用すればOKです。

参考:AWS SDK for PHP v2 で S3 上の指定文字列にマッチするオブジェクトの削除