๋ฒ„ํ‚ท ์‚ญ์ œ

์ด ํŽ˜์ด์ง€๋Š” Cloud Storage ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋ฉด ๊ฐ์ฒด, ๊ด€๋ฆฌํ˜• ํด๋” ๋“ฑ ๋ฒ„ํ‚ท ๋‚ด ๋ฆฌ์†Œ์Šค๋„ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ ์‚ญ์ œ๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋ฉด ์†Œํ”„ํŠธ ์‚ญ์ œ ์ •์ฑ…์— ์ง€์ •๋œ ๋ณด๊ด€ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ฒ„ํ‚ท ๋˜๋Š” ๋ฒ„ํ‚ท์˜ ๊ฐœ๋ณ„ ๊ฐ์ฒด๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท์— ์†Œํ”„ํŠธ ์‚ญ์ œ๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์–ด๋„ ๊ด€๋ฆฌํ˜• ํด๋”๋Š” ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

Cloud Storage ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ์ž(roles/storage.admin) IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”.

์ด ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์—๋Š” ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ •ํ™•ํ•œ ๊ถŒํ•œ์„ ๋ณด๋ ค๋ฉด ํ•„์ˆ˜ ๊ถŒํ•œ ์„น์…˜์„ ํ™•์žฅํ•˜์„ธ์š”.

ํ•„์ˆ˜ ๊ถŒํ•œ

  • storage.buckets.delete
  • storage.buckets.list
    • ์ด ๊ถŒํ•œ์€ Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•  ๋•Œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • storage.objects.delete
    • ์ด ๊ถŒํ•œ์€ ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œํ•˜๋ ค๋Š” ๋ฒ„ํ‚ท ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • storage.objects.list
    • ์ด ๊ถŒํ•œ์€ Google Cloud ์ฝ˜์†”์ด๋‚˜ Google Cloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ปค์Šคํ…€ ์—ญํ• ์ด๋‚˜ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์—ญํ•  ๋ถ€์—ฌ ๋ฐฉ๋ฒ•์€ ๋ฒ„ํ‚ท์— IAM ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฒ„ํ‚ท ์‚ญ์ œ

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud Storage ๋ฒ„ํ‚ท ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฒ„ํ‚ท์œผ๋กœ ์ด๋™

  2. ์‚ญ์ œํ•  ๋ฒ„ํ‚ท์˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ํ‘œ์‹œ๋˜๋Š” ์˜ค๋ฒ„๋ ˆ์ด ์ฐฝ์—์„œ ๋ฒ„ํ‚ท๊ณผ ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  5. ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Google Cloud ์ฝ˜์†”์—์„œ ์‹คํŒจํ•œ Cloud Storage ์ž‘์—…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ช…๋ น์ค„

๋ฒ„ํ‚ท ๋‚ด์˜ ๋ชจ๋“  ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋ ค๋ฉด Google Cloud CLI ๋ช…๋ น์–ด gcloud storage rm์„ --recursive ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud storage rm --recursive gs://BUCKET_NAME

์—ฌ๊ธฐ์„œ BUCKET_NAME์€ ์‚ญ์ œํ•  ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด my-bucket์ž…๋‹ˆ๋‹ค.

์„ฑ๊ณตํ•˜๋ฉด ์‘๋‹ต์€ ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Removing gs://my-bucket/...

๊ฐ์ฒด ๋˜๋Š” ๊ด€๋ฆฌํ˜• ํด๋”๋ฅผ ์‹ค์ˆ˜๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ฒ„ํ‚ท์ด ๋น„์–ด ์žˆ์„ ๋•Œ๋งŒ ๋ฒ„ํ‚ท์„ ์‚ญ์ œํ•˜๋Š” gcloud storage buckets delete ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

C++

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage C++ API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

namespace gcs = ::google::cloud::storage;
[](gcs::Client client, std::string const& bucket_name) {
  google::cloud::Status status = client.DeleteBucket(bucket_name);
  if (!status.ok()) throw std::runtime_error(status.message());

  std::cout << "The bucket " << bucket_name << " was deleted successfully.\n";
}

C#

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage C# API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.


using Google.Cloud.Storage.V1;
using System;

public class DeleteBucketSample
{
    public void DeleteBucket(string bucketName = "your-unique-bucket-name")
    {
        var storage = StorageClient.Create();
        storage.DeleteBucket(bucketName);
        Console.WriteLine($"The bucket {bucketName} was deleted.");
    }
}

Go

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage Go API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/storage"
)

// deleteBucket deletes the bucket.
func deleteBucket(w io.Writer, bucketName string) error {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*30)
	defer cancel()

	bucket := client.Bucket(bucketName)
	if err := bucket.Delete(ctx); err != nil {
		return fmt.Errorf("Bucket(%q).Delete: %w", bucketName, err)
	}
	fmt.Fprintf(w, "Bucket %v deleted\n", bucketName)
	return nil
}

Java

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage Java API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class DeleteBucket {
  public static void deleteBucket(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of the bucket to delete
    // String bucketName = "your-unique-bucket-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Bucket bucket = storage.get(bucketName);
    bucket.delete();

    System.out.println("Bucket " + bucket.getName() + " was deleted");
  }
}

Node.js

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage Node.js API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function deleteBucket() {
  await storage.bucket(bucketName).delete();
  console.log(`Bucket ${bucketName} deleted`);
}

deleteBucket().catch(console.error);

PHP

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage PHP API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

use Google\Cloud\Storage\StorageClient;

/**
 * Delete a Cloud Storage Bucket.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 */
function delete_bucket(string $bucketName): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $bucket->delete();
    printf('Bucket deleted: %s' . PHP_EOL, $bucket->name());
}

Python

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage Python API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

from google.cloud import storage


def delete_bucket(bucket_name):
    """Deletes a bucket. The bucket must be empty."""
    # bucket_name = "your-bucket-name"

    storage_client = storage.Client()

    bucket = storage_client.get_bucket(bucket_name)
    bucket.delete()

    print(f"Bucket {bucket.name} deleted")

Ruby

์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Storage Ruby API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

Cloud Storage์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์ฆ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

def delete_bucket bucket_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket  = storage.bucket bucket_name, skip_lookup: true

  bucket.delete

  puts "Deleted bucket: #{bucket.name}"
end

REST API

JSON API

  1. Authorization ํ—ค๋”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด gcloud CLI๊ฐ€ ์„ค์น˜ ๋ฐ ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. cURL์„ ์‚ฌ์šฉํ•ด์„œ DELETE ๋ฒ„ํ‚ท ์š”์ฒญ์„ ํฌํ•จํ•˜์—ฌ JSON API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME"

    ์—ฌ๊ธฐ์„œ BUCKET_NAME์€ ์‚ญ์ œํ•  ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด my-bucket์ž…๋‹ˆ๋‹ค.

์„ฑ๊ณตํ•˜๋ฉด ์‘๋‹ต์— 204 ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

XML API

  1. Authorization ํ—ค๋”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด gcloud CLI๊ฐ€ ์„ค์น˜ ๋ฐ ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. cURL์„ ์‚ฌ์šฉํ•ด์„œ DELETE ๋ฒ„ํ‚ท ์š”์ฒญ์„ ํฌํ•จํ•˜์—ฌ XML API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      "https://storage.googleapis.com/BUCKET_NAME"

    ์—ฌ๊ธฐ์„œ BUCKET_NAME์€ ์‚ญ์ œํ•  ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด my-bucket์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„