מחיקת אובייקטים

בדף הזה מוסבר איך למחוק אובייקטים מקטגוריות ב-Cloud Storage. סקירה כללית של שיטות למחיקת אובייקטים מופיעה במאמר מידע על מחיקת אובייקטים.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות למחיקת אובייקטים, בקשו מהאדמין לתת לכם את התפקידים הבאים ב-IAM בקטגוריה שמכילה את האובייקטים שאתם רוצים למחוק:

  • מחיקת אובייקטים באמצעות Google Cloud CLI או ממשקי API בארכיטקטורת REST: Storage Object User (roles/storage.objectUser)
  • מחיקת אובייקטים באמצעות מסוף Google Cloud : אדמין של Storage ‏ (roles/storage.admin)
  • לחלופין, כדי למחוק אובייקטים באמצעות מסוף Google Cloud : צפייה (roles/viewer) ו-Storage Object User (roles/storage.objectUser)

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות כדי למחוק אובייקטים. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי למחוק אובייקטים, נדרשות ההרשאות הבאות:

  • מחיקת אובייקטים: storage.objects.delete
  • כדי להציג רשימה של אובייקטים באמצעות מסוף Google Cloud , או באמצעות הדגל --recursive או תווים כלליים ב-Google Cloud CLI: storage.objects.list
  • הצגה של רשימת קטגוריות באמצעות מסוף Google Cloud : storage.buckets.list

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

מחיקת אובייקט אחד

בקטע הזה מוסבר איך למחוק אובייקט אחד בכל פעם.

כדי למחוק אובייקט אחד:

המסוף

  1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. ברשימת הקטגוריות, לוחצים על שם הקטגוריה שמכילה את האובייקטים שרוצים למחוק.

    הדף Bucket details נפתח עם הכרטיסייה Objects שנבחרה.

  3. עוברים אל האובייקט, שאולי יהיה ממוקם בתיקייה.

  4. מסמנים את התיבה שלצד האובייקט שרוצים למחוק.

  5. לוחצים על מחיקה, ואז על מחיקה בתיבת הדו-שיח שמופיעה.

שורת הפקודה

משתמשים בפקודה Google Cloud CLI gcloud storage rm:

gcloud storage rm gs://BUCKET_NAME/OBJECT_NAME

כאשר:

  • ‫BUCKET_NAME הוא שם הקטגוריה שמכילה את האובייקט שרוצים למחוק. לדוגמה, my-bucket.
  • ‫OBJECT_NAME הוא שם האובייקט שרוצים למחוק. לדוגמה, pets/dog.png.

אם הפעולה בוצעה ללא שגיאות, התשובה תיראה כמו בדוגמה הבאה:

Removing objects:
Removing gs://example-bucket/file.txt...
  Completed 1/1

ספריות לקוח

C++

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage C++ API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

namespace gcs = ::google::cloud::storage;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& object_name) {
  google::cloud::Status status =
      client.DeleteObject(bucket_name, object_name);

  if (!status.ok()) throw std::runtime_error(status.message());
  std::cout << "Deleted " << object_name << " in bucket " << bucket_name
            << "\n";
}

C#

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage C# API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.


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

public class DeleteFileSample
{
    public void DeleteFile(
        string bucketName = "your-unique-bucket-name",
        string objectName = "your-object-name")
    {
        var storage = StorageClient.Create();
        storage.DeleteObject(bucketName, objectName);
        Console.WriteLine($"Deleted {objectName}.");
    }
}

Go

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Go API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

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

// deleteFile removes specified object.
func deleteFile(w io.Writer, bucket, object string) error {
	// bucket := "bucket-name"
	// object := "object-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*10)
	defer cancel()

	o := client.Bucket(bucket).Object(object)

	// Optional: set a generation-match precondition to avoid potential race
	// conditions and data corruptions. The request to delete the file is aborted
	// if the object's generation number does not match your precondition.
	attrs, err := o.Attrs(ctx)
	if err != nil {
		return fmt.Errorf("object.Attrs: %w", err)
	}
	o = o.If(storage.Conditions{GenerationMatch: attrs.Generation})

	if err := o.Delete(ctx); err != nil {
		return fmt.Errorf("Object(%q).Delete: %w", object, err)
	}
	fmt.Fprintf(w, "Blob %v deleted.\n", object)
	return nil
}

Java

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Java API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

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

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The ID of your GCS object
    // String objectName = "your-object-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Blob blob = storage.get(bucketName, objectName);
    if (blob == null) {
      System.out.println("The object " + objectName + " wasn't found in " + bucketName);
      return;
    }
    BlobId idWithGeneration = blob.getBlobId();
    // Deletes the blob specified by its id. When the generation is present and non-null it will be
    // specified in the request.
    // If versioning is enabled on the bucket and the generation is present in the delete request,
    // only the version of the object with the matching generation will be deleted.
    // If instead you want to delete the current version, the generation should be dropped by
    // performing the following.
    // BlobId idWithoutGeneration =
    //    BlobId.of(idWithGeneration.getBucket(), idWithGeneration.getName());
    // storage.delete(idWithoutGeneration);
    storage.delete(idWithGeneration);

    System.out.println("Object " + objectName + " was permanently deleted from " + bucketName);
  }
}

Node.js

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Node.js API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

// The ID of your GCS file
// const fileName = 'your-file-name';

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

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

// Optional:
// Set a generation-match precondition to avoid potential race conditions
// and data corruptions. The request to delete is aborted if the object's
// generation number does not match your precondition. For a destination
// object that does not yet exist, set the ifGenerationMatch precondition to 0
// If the destination object already exists in your bucket, set instead a
// generation-match precondition using its generation number.
const deleteOptions = {
  ifGenerationMatch: generationMatchPrecondition,
};
async function deleteFile() {
  await storage.bucket(bucketName).file(fileName).delete(deleteOptions);

  console.log(`gs://${bucketName}/${fileName} deleted`);
}

deleteFile().catch(console.error);

PHP

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage PHP API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

use Google\Cloud\Storage\StorageClient;

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

Python

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Python API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

from google.cloud import storage


def delete_blob(bucket_name, blob_name):
    """Deletes a blob from the bucket."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"

    storage_client = storage.Client()

    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)
    generation_match_precondition = None

    # Optional: set a generation-match precondition to avoid potential race conditions
    # and data corruptions. The request to delete is aborted if the object's
    # generation number does not match your precondition.
    blob.reload()  # Fetch blob metadata to use in generation_match_precondition.
    generation_match_precondition = blob.generation

    blob.delete(if_generation_match=generation_match_precondition)

    print(f"Blob {blob_name} deleted.")

Ruby

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Ruby API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

def delete_file bucket_name:, file_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  # The ID of your GCS object
  # file_name = "your-file-name"

  require "google/cloud/storage"

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

  file.delete

  puts "Deleted #{file.name}"
end

Rust

use google_cloud_storage::client::StorageControl;

pub async fn sample(client: &StorageControl, bucket_id: &str) -> anyhow::Result<()> {
    const NAME: &str = "deleted-object-name";
    client
        .delete_object()
        .set_bucket(format!("projects/_/buckets/{bucket_id}"))
        .set_object(NAME)
        // Consider .set_generation() to make request idempotent
        .send()
        .await?;
    println!("successfully deleted object {NAME} in bucket {bucket_id}");
    Ok(())
}

ממשקי API בארכיטקטורת REST

‫API בפורמט JSON

  1. להתקין ולהפעיל את ה-CLI של gcloud, כדי שתוכלו ליצור אסימון גישה לכותרת Authorization.

  2. משתמשים ב-curl כדי לשלוח קריאה ל-API בפורמט JSON עם בקשת DELETE:

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

    כאשר:

    • ‫BUCKET_NAME הוא שם הקטגוריה שמכילה את האובייקט שרוצים למחוק. לדוגמה, my-bucket.
    • OBJECT_NAME הוא שם האובייקט שרוצים להוריד, מותאם לקידודי התווים שמתאימים לכתובות URL. לדוגמה, pets/dog.png יותאם לקידודי התווים שמתאימים לכתובות URL באופן הבא: pets%2Fdog.png.

‫API בפורמט XML

  1. התקנה והפעלה של ה-CLI של gcloud, שמאפשרות ליצור אסימון גישה לכותרת Authorization.

  2. משתמשים ב-curl כדי לשלוח קריאה ל-API בפורמט XML באמצעות בקשת DELETE Object:

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

    כאשר:

    • ‫BUCKET_NAME הוא שם הקטגוריה שמכילה את האובייקט שרוצים למחוק. לדוגמה, my-bucket.
    • OBJECT_NAME הוא שם האובייקט שרוצים להוריד, מותאם לקידודי התווים שמתאימים לכתובות URL. לדוגמה, pets/dog.png יותאם לקידודי התווים שמתאימים לכתובות URL באופן הבא: pets%2Fdog.png.

מחיקת כמות גדולה של אובייקטים

בקטע הזה מוסבר איך למחוק אובייקטים בכמות גדולה על ידי בחירה שלהם במסוףGoogle Cloud , על ידי מחיקת אובייקטים עם תחילית משותפת באמצעות כלי שורת הפקודה, או על ידי ציון רשימה של אובייקטים בבקשות של API או של ספריית לקוח.

המסוף

  1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. ברשימת הקטגוריות, לוחצים על שם הקטגוריה שמכילה את האובייקטים שרוצים למחוק.

    הדף Bucket details נפתח עם הכרטיסייה Objects שנבחרה.

  3. עוברים אל האובייקטים, שאולי יהיו ממוקמים בתיקייה.

  4. מסמנים את התיבה לצד כל אובייקט שרוצים למחוק.

    אפשר לסמן את התיבה של התיקיות, ובעקבות זאת יימחקו כל האובייקטים שבתיקייה הזו.

  5. לוחצים על מחיקה, ואז על מחיקה בתיבת הדו-שיח שמופיעה.

אם מוחקים מספר אובייקטים בבת אחת, אפשר ללחוץ על הסמל Notifications במסוף Google Cloud כדי לעקוב אחרי התקדמות המחיקה. במסוףGoogle Cloud אפשר למחוק מיליוני אובייקטים בבת אחת, והפעולה הזו מתבצעת ברקע.

במאמר פתרון בעיות מוסבר איך מקבלים מידע מפורט על שגיאות בנושא פעולות ב-Cloud Storage שנכשלו במסוף Google Cloud .

שורת הפקודה

Google Cloud CLI

כדי למחוק קבוצות של אובייקטים שיש להם אותה קידומת, למשל אובייקטים שהשמות שלהם מחקים מבנה של תיקיות, משתמשים בדגל --recursive עם gcloud storage rm:

gcloud storage rm --recursive gs://BUCKET_NAME/PREFIX

כאשר:

  • ‫BUCKET_NAME הוא שם הקטגוריה. לדוגמה, my-bucket.
  • ‫PREFIX הוא קידומת משותפת לאובייקטים שרוצים למחוק. לדוגמה, pets/.

Amazon S3 CLI

כדי למחוק כמה אובייקטים ב-Cloud Storage באמצעות ה-CLI של Amazon S3, משתמשים בפקודה aws s3api delete-objects. כדי להפנות את הבקשה ל-API בפורמט XML למחיקת כמה אובייקטים ב-Cloud Storage, צריך להגדיר את הדגל --endpoint-url לערך storage.googleapis.com. למידע מפורט על הגדרות הפרמטרים וההתנהגות של delete-objects API, קראו את מאמרי העזרה של Amazon S3 CLI delete-objects.

ספריות לקוח

ב-Cloud Storage יש תמיכה ב-API בפורמט XML למחיקת כמה אובייקטים באמצעות הממשק שתואם ל-Amazon S3. כדי להשתמש בספריות לקוח שתואמות ל-Amazon S3 למחיקה של אובייקטים בכמות גדולה, צריך להפנות את הבקשה לנקודת הקצה Google Cloud על ידי הגדרת כתובת ה-URL של נקודת הקצה ל-https://storage.googleapis.com בתצורת הלקוח. הגישה הזו יכולה להיות שימושית אם אתם מבצעים אחת מהמשימות הבאות:

  • שימוש בבסיסי קוד קיימים או בכלים שכבר נוצרו עבור Amazon S3.
  • שמירה על עקביות בסביבות מרובות עננים שכוללות גם Amazon S3 וגם Cloud Storage.

בדוגמה הבאה מוסבר איך להפעיל לקוח באמצעות ספריית Boto3 כדי ליצור אינטראקציה עם Cloud Storage:

  import boto3
  def main():
  # Initialize the S3 client to point to the Google Cloud Storage endpoint
    client = boto3.client(
        service_name='s3',
        endpoint_url='https://storage.googleapis.com',
        aws_access_key_id='YOUR_ACCESS_ID',
        aws_secret_access_key='YOUR_SECRET',
    )
  # Perform delete operations as defined in the library's documentation
  # response = client.delete_objects(Bucket='BUCKET_NAME', Delete={'Objects': [...]})
  

פרטים על חתימות של שיטות ספציפיות והגדרות של פרמטרים מופיעים delete_objects במאמרי העזרה של Boto3.

‫API בפורמט XML

כדי למחוק עד 1,000 אובייקטים בבקשה אחת באמצעות API בפורמט XML, מבצעים את השלבים הבאים:

  1. להתקין ולהפעיל את ה-CLI של gcloud, כדי שתוכלו ליצור אסימון גישה לכותרת Authorization.

  2. יוצרים מסמך XML שמציין את האובייקטים שרוצים למחוק.

    רשימה מלאה של ההגדרות מופיעה במאמר העזרה של ה-API בפורמט XML, בקטע מחיקת כמה אובייקטים. אלו ההגדרות הנפוצות שצריך לכלול בקובץ ה-XML:

    <Delete>
        <Object>
          <Key>OBJECT_NAME</Key>
          <VersionId>VERSION_ID</VersionId>
        </Object>
        ...
        <Quiet>QUIET_RESPONSE_BOOLEAN</Quiet>
      </Delete>

    כאשר:

    • ‫OBJECT_NAME הוא שם האובייקט בקידוד כתובת URL. לדוגמה, pets/dog.png יותאם לקידודי התווים שמתאימים לכתובות URL באופן הבא: pets%2Fdog.png. אפשר לציין עד 1,000 אובייקטים בקובץ ה-XML.
    • ‫VERSION_ID הוא מזהה הגרסה של האובייקט. לדוגמה, 11111.
    • ‫QUIET_RESPONSE_BOOLEAN שולט ברמת הפירוט של התגובה של ה-API:
      • כדי לקבל תשובה מפורטת, מגדירים את הערך False. התשובה כוללת פרטים לגבי כל אובייקט, בין אם הוא נמחק בהצלחה ובין אם לא. פעולת המחיקה של כמה אובייקטים באמצעות ה-API בפורמט XML היא לא אטומית. אם בקשה מסוימת נכשלת באופן חלקי, יכול להיות שחלק מהאובייקטים יימחקו אבל אחרים לא. לכן מומלץ להשתמש בתגובה המפורטת כדי לזהות את כל האובייקטים שנמחקו. אם הפעלתם את יומני הביקורת של גישה לנתונים, אתם יכולים גם לבדוק את יומני הביקורת כדי לקבל פרטים על הכישלון.
      • הגדרתם את התשובה ל-True כדי שהיא תהיה שקטה. גוף התגובה לא כולל מידע על האובייקטים שנמחקו.
  3. משתמשים ב-curl כדי לשלוח בקשת קטגוריה POST ל-API בפורמט XML עם פרמטר השאילתה ?delete וקובץ ה-XML:

    curl -X POST --data-binary @XML_FILE_NAME \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      "https://storage.googleapis.com/BUCKET_NAME?delete"

    כאשר:

    • ‫XML_FILE_NAME הוא השם של קובץ ה-XML שיצרתם.
    • ‫BUCKET_NAME הוא שם הקטגוריה שמכילה את האובייקטים שרוצים למחוק.

      אם מצב Quiet מושבת, תגובה מפורטת עשויה להיראות כך:

      <DeleteResult>
      <Deleted>
        <Key>images/photo1.jpg</Key>
        <VersionId>11111</VersionId>
      </Deleted>
      <Deleted>
        <Key>documents/report.pdf</Key>
        <VersionId>22222</VersionId>
      </Deleted>
      <Error>
        <Code>AccessDenied</Code>
        <Key>private/financial_data.xlsx</Key>
        <Message>Access Denied. You don't have permission to delete this object.</Message>
        <VersionId>33333</VersionId>
      </Error>
      </DeleteResult>
      

      אם מצב Quiet מופעל, בתגובה מפורטים רק אובייקטים שנמחקו. אם כל האובייקטים נמחקו, מוחזר תג <DeleteResult/> ריק. זוהי דוגמה לתשובה שקטה שבה אירעה שגיאה:

      <DeleteResult>
      <Error>
        <Code>AccessDenied</Code>
        <Key>private/financial_data.xlsx</Key>
        <Message>Access Denied. You don't have permission to delete this object.</Message>
        <VersionId>33333</VersionId>
      </Error>
      </DeleteResult>

מחיקה של עד מיליארדי אובייקטים

כדי למחוק מיליוני או מיליארדי אובייקטים במשימה אחת, משתמשים בפעולות רבות על פריטי אחסון. כדי ליצור משימה, צריך לציין את האובייקטים שרוצים למחוק. אפשר לעשות את זה באמצעות רשימת אובייקטים בקובץ מניפסט או באמצעות תחיליות של אובייקטים. אחרי שמציינים את רשימת האובייקטים, יוצרים משימה של פעולת אצווה כדי למחוק את האובייקטים.

מחיקה אוטומטית של אובייקטים באמצעות כללים של מחזור החיים של אובייקטים

אם אתם רוצים שאובייקטים יימחקו באופן אוטומטי כשהם עומדים בקריטריונים שאתם מציינים, כמו גיל או סוג אחסון, אתם יכולים להשתמש בניהול מחזור חיים של אובייקטים. לדוגמה, אפשר להגדיר כלל מחזור חיים למחיקת יומנים שנוצרו לפני יותר מ-30 יום.

בקשות למחיקת אובייקטים באצווה באמצעות API בפורמט JSON

כדי לצמצם את מספר חיבורי ה-HTTP שנדרשים כשמוחקים הרבה אובייקטים באמצעות API בפורמט JSON, משתמשים בבקשת Batch ב-API בפורמט JSON. כדי לצמצם את התקורה של הרשת, אפשר לקבץ עד 100 קריאות ל-API בבקשת HTTP אחת.

המאמרים הבאים