Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 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 上の指定文字列にマッチするオブジェクトの削除

takky
Docker/GKE/GCP/dataflow/wercker/PHP/Laravel/DevOps/Golang 今後はzennをメインに活動します https://zenn.dev/takky
bengo4
「専門家をもっと身近に」を理念として、人々と専門家をつなぐポータルサイト「弁護士ドットコム」「弁護士ドットコムニュース」「税理士ドットコム」を提供。
https://corporate.bengo4.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away