שינוי סוג האחסון (storage class) של אובייקטים

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

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

מסוף

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

שורת הפקודה

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

לרשימת ההרשאות הנדרשות לפעולות ספציפיות, קראו את המאמר הרשאות IAM לפקודות gsutil.

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

ספריות לקוח

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

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

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

ממשקי API ל-REST

ב-API מסוג JSON:

על מנת להשלים את המדריך באמצעות API ב-JSON, אתם צריכים הרשאות IAM מתאימות. אם האובייקט שאתם רוצים לקבל גישה אליו נמצא בפרויקט שלא אתם יצרתם, יכול להיות שתצטרכו לבקש מבעלי הפרויקט לתת לכם תפקיד שמכיל את ההרשאות הנדרשות.

לרשימת ההרשאות הדרושות לפעולות ספציפיות, ראו את המאמר הרשאות IAM עבור שיטות JSON.

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

שינוי סיווג אחסון האובייקט

על מנת לשנות את סיווג האחסון של אובייקט, יש לבצע את השלבים הבאים:

מסוף

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

שורת הפקודה

gcloud

השתמש בפקודה gcloud storage objects update עם הדגל --storage-class. לדוגמה:

gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME --storage-class=STORAGE_CLASS

כאשר:

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

‏gsutil

השתמש בדגל -s בפקודה gsutil rewrite. לדוגמה:

gsutil rewrite -s STORAGE_CLASS gs://BUCKET_NAME/OBJECT_NAME

כאשר:

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

ספריות לקוח

C++

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

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

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& object_name, std::string const& storage_class) {
  StatusOr<gcs::ObjectMetadata> object_metadata =
      client.RewriteObjectBlocking(
          bucket_name, object_name, bucket_name, object_name,
          gcs::WithObjectMetadata(
              gcs::ObjectMetadata().set_storage_class(storage_class)));
  if (!object_metadata) throw std::move(object_metadata).status();

  std::cout << "Changed storage class of object " << object_metadata->name()
            << " in bucket " << object_metadata->bucket() << " to "
            << object_metadata->storage_class() << "\n";
}

C#

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

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


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

public class ChangeFileStorageClassSample
{
    public Google.Apis.Storage.v1.Data.Object ChangeFileStorageClass(
        string bucketName = "your-bucket-name",
        string objectName = "your-object-name",
        string storageClass = StorageClasses.Standard)
    {
        var storage = StorageClient.Create();

        // Changing storage class requires a rewrite operation, which can only be done
        // by the underlying service
        var obj = new Google.Apis.Storage.v1.Data.Object { StorageClass = storageClass };
        storage.Service.Objects.Rewrite(obj, bucketName, objectName, bucketName, objectName).Execute();

        var file = storage.GetObject(bucketName, objectName);
        Console.WriteLine($"Object {objectName} in bucket {bucketName} had" +
            $" its storage class set to {storageClass}.");

        return file;
    }
}

Go

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

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

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

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

// changeObjectStorageClass changes the storage class of a single object.
func changeObjectStorageClass(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 copy 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})

	// See the StorageClass documentation for other valid storage classes:
	// https://cloud.google.com/storage/docs/storage-classes
	newStorageClass := "COLDLINE"
	// You can't change an object's storage class directly, the only way is
	// to rewrite the object with the desired storage class.
	copier := o.CopierFrom(o)
	copier.StorageClass = newStorageClass
	if _, err := copier.Run(ctx); err != nil {
		return fmt.Errorf("copier.Run: %w", err)
	}
	fmt.Fprintf(w, "Object %v in bucket %v had its storage class set to %v\n", object, bucket, newStorageClass)
	return nil
}

Java

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

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

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

public class ChangeObjectStorageClass {
  public static void changeObjectStorageClass(
      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();
    BlobId blobId = BlobId.of(bucketName, objectName);
    Blob sourceBlob = storage.get(blobId);
    if (sourceBlob == null) {
      System.out.println("The object " + objectName + " wasn't found in " + bucketName);
      return;
    }

    // See the StorageClass documentation for other valid storage classes:
    // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/storage/StorageClass.html
    StorageClass storageClass = StorageClass.COLDLINE;

    // You can't change an object's storage class directly, the only way is to rewrite the object
    // with the desired storage class

    BlobInfo targetBlob = BlobInfo.newBuilder(blobId).setStorageClass(storageClass).build();

    // Optional: set a generation-match precondition to avoid potential race
    // conditions and data corruptions. The request to upload returns a 412 error if
    // the object's generation number does not match your precondition.
    Storage.BlobSourceOption precondition =
        Storage.BlobSourceOption.generationMatch(sourceBlob.getGeneration());

    Storage.CopyRequest request =
        Storage.CopyRequest.newBuilder()
            .setSource(blobId)
            .setSourceOptions(precondition) // delete this line to run without preconditions
            .setTarget(targetBlob)
            .build();
    Blob updatedBlob = storage.copy(request).getResult();

    System.out.println(
        "Object "
            + objectName
            + " in bucket "
            + bucketName
            + " had its storage class set to "
            + updatedBlob.getStorageClass().name());
  }
}

Node.js

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

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

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

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

/**
 * 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';

// The name of a storage class
// See the StorageClass documentation for other valid storage classes:
// https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/storage/StorageClass.html
// const storageClass = 'coldline';

async function fileChangeStorageClass() {
  // Optional:
  // Set a generation-match precondition to avoid potential race conditions
  // and data corruptions. The request to copy 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 setStorageClassOptions = {
    ifGenerationMatch: generationMatchPrecondition,
  };

  await storage
    .bucket(bucketName)
    .file(fileName)
    .setStorageClass(storageClass, setStorageClassOptions);

  console.log(`${fileName} has been set to ${storageClass}`);
}

fileChangeStorageClass().catch(console.error);

PHP

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

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

use Google\Cloud\Storage\StorageClient;

/**
 * Change the storage class of the given file.
 *
 * @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')
 * @param string $storageClass The storage class of the new object.
 *        (e.g. 'COLDLINE')
 */
function change_file_storage_class(string $bucketName, string $objectName, string $storageClass): void
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);

    // Storage class cannot be changed directly. But we can rewrite the object
    // using the new storage class.

    $newObject = $object->rewrite($bucket, [
        'storageClass' => $storageClass,
    ]);

    printf(
        'Object %s in bucket %s had its storage class set to %s',
        $objectName,
        $bucketName,
        $newObject->info()['storageClass']
    );
}

Python

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

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

from google.cloud import storage

def change_file_storage_class(bucket_name, blob_name):
    """Change the default storage class of the blob"""
    # 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 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.update_storage_class("NEARLINE", if_generation_match=generation_match_precondition)

    print(
        "Blob {} in bucket {} had its storage class set to {}".format(
            blob_name,
            bucket_name,
            blob.storage_class
        )
    )
    return blob

Ruby

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

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

def change_file_storage_class 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.storage_class = "NEARLINE"

  puts "File #{file_name} in bucket #{bucket_name} had its storage class set to #{file.storage_class}"
end

ממשקי API ל-REST

ב-API מסוג JSON:

  1. מקבלים אסימון גישה להרשאה מ-OAuth 2.0 Playground. מגדירים את ה-Playground לשימוש בפרטי כניסה משלכם ל-OAuth. ההוראות מפורטות במאמר אימות API.
  2. ליצור קובץ JSON שמכיל את הפרטים הבאים:

    {
      "storageClass": "STORAGE_CLASS"
    }

    כאשר:

    • STORAGE_CLASS הוא סוג האחסון החדש של האובייקט. לדוגמה, nearline
  3. השתמש ב-cURL על מנת להפעיל אתJSON API עם אובייקט POST, מבקשים:

    curl -X POST --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME/rewriteTo/b/BUCKET_NAME/o/OBJECT_NAME"

    כאשר:

    • JSON_FILE_NAME הוא הנתיב לקובץ ה-JSON שיצרת בשלב 2.
    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
    • BUCKET_NAME זהו שם הקטגוריה שמכילה את האובייקט המקורי. לדוגמה: my-bucket.
    • OBJECT_NAME הוא שם האובייקט עם קידוד כתובת URL. לדוגמה, pets/dog.png, כתובת ה-URL מקודדת בצורה pets%2Fdog.png.

ממשק API בשפת XML

  1. מקבלים אסימון גישה להרשאה מ-OAuth 2.0 Playground. מגדירים את ה-Playground לשימוש בפרטי כניסה משלכם ל-OAuth. ההוראות מפורטות במאמר אימות API.
  2. משתמשים ב-cURL על מנת לקרוא ל-API ב-XML באמצעות בקשת אובייקט PUT:

    curl -X PUT --data-binary @OBJECT \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: OBJECT_CONTENT_TYPE" \
      -H "x-goog-storage-class: STORAGE_CLASS" \
      "https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME"

    כאשר:

    • OBJECT הוא הנתיב המקומי לאובייקט שאת סוג האחסון שלו רוצים לשנות (צריך להעלות מחדש את האובייקט באמצעות ה-API ב-XML כשמשנים את סוג האחסון). למשל, Desktop/dog.png.
    • OAUTH2_TOKEN הוא אסימון הגישה שיצרתם בשלב 1.
    • OBJECT_CONTENT_TYPE הוא סוג התוכן של האובייקט. לדוגמה, image/png
    • STORAGE_CLASS הוא סוג האחסון החדש של האובייקט. לדוגמה, nearline
    • BUCKET_NAME הוא שם הקטגוריה שמכילה את האובייקט שאתם כותבים. לדוגמה, my-bucket.
    • OBJECT_NAME הוא השם עם קידוד כתובת ה-URL של האובייקט שאתם כותבים. לדוגמה, pets/dog.png, כתובת ה-URL מקודדת בצורה pets%2Fdog.png.

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