前提
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へ接続する場合
| '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 上の指定文字列にマッチするオブジェクトの削除