半農半エンジニアの記録

関西在住エンジニア。個人で勉強・開発したこと、その他趣味のことを書いてます。農業してます。

【GCP】バケットを削除するときは中身を先に削除しないといけない

GCPのバケットをAPIから削除する場合、中身をまず消さないとダメ、という話。

中身が残ってる場合

PHPですが、単純にバケットを消そうとするとこんな感じ。

$storage = new StorageClient();
$bucket = $storage->bucket("name");
$bucket->delete();

バケットが空っぽだと大丈夫ですが、ファイルやフォルダがあると…

======================================================================
   The application has thrown an exception!
======================================================================
 Google\Cloud\Core\Exception\ConflictException
 {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conflict",
    "message": "The bucket you tried to delete was not empty."
   }
  ],
  "code": 409,
  "message": "The bucket you tried to delete was not empty."
 }
}

エラーになります。

空っぽじゃないよ、というエラー。

バケットの中身を消してやる

なのでバケットの中身を消してやります。

$storage = new StorageClient();
$bucket = $storage->bucket("name");
// バケットの中身を削除してからバケットを削除する
$objects = $bucket->objects();
foreach ($objects as $object)
{
  $object->delete();
}
$bucket->delete();

いちいち中身を1つずつ消すというダサいコードです。 とりあえずこれでバケットは削除できます。

一括削除したい場合

APIから

ライブラリのコード確認しましたが、とりあえずPHPではバケットの中身全削除とか、バケットの中身入ってても削除、みたいな方法はありませんでした。。

コンソール

GCPコンソールからは、バケット選択して削除すると、中身ごと消えます。

うーん、やはりAPIはあって、自分の調査不足なのか?

なんかありそうな気もするので、見つけたら追記します。