Cloud Storage tetikleyicileri


Cloud Storage'da dosya ve klasörlerin yüklenmesi, güncellenmesi veya silinmesi üzerine bir işlevi tetikleyebilirsiniz.

Bu sayfadaki örnekler, resim dosyaları Cloud Storage'ya yüklendiğinde tetiklenen örnek bir işleme dayanmaktadır. Bu örnek işlev, etkinlik özelliklerine nasıl erişileceğini, Cloud Functions örneğine nasıl dosya indirileceğini ve Cloud Storage etkinliklerinin işlenmesiyle ilgili diğer temel bilgileri gösterir.

Gerekli modülleri içe aktarın.

Başlamak için Cloud Storage etkinliklerinin işlenmesi için gereken modülü içe aktarın:

Node.js

 const {onObjectFinalized} = require("firebase-functions/v2/storage");

Python

 from firebase_functions import storage_fn

Tam örneği oluşturmak için Firebase Admin SDK ve görüntü işleme araçlarının bağımlılıklarını da ekleyin:

Node.js

 const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");
const logger = require("firebase-functions/logger");
const path = require("path");

// library for image resizing
const sharp = require("sharp");

initializeApp();

Python

 import io
import pathlib

from PIL import Image

from firebase_admin import initialize_app

initialize_app()
from firebase_admin import storage

Cloud Storage işlevinin kapsamını belirleme

İşlevinizin kapsamını belirli bir Cloud Storage paketiyle sınırlamak ve istediğiniz seçenekleri ayarlamak için aşağıdaki kalıbı kullanın:

Node.js

// scope handler to a specific bucket, using storage options parameter
export archivedopts = onObjectArchived({ bucket: "myBucket" }, (event) => {
  //…
});

Python

# Scope handler to a specific bucket using storage options parameter
@storage_fn.on_object_archived(bucket="myBucket")
def archived_bucket(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

Buna karşılık, örnek küçük resim oluşturucu işlevi, projenin varsayılan paketiyle sınırlıdır:

Node.js

exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {
// ...
});

Python

@storage_fn.on_object_archived()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    # ...

İşlevin konumunu ayarlama

Konumlar arasındaki uyuşmazlık dağıtımın başarısız olmasına neden olabilir. Ayrıca, Cloud Storage grubu konumunun ve işlevin konumu arasındaki mesafe önemli bir ağ gecikmesine neden olabilir. Bu durumları önlemek için işlev konumunu aşağıdaki yöntemlerden biriyle bucket/tetikleyici konumuyla eşleşecek şekilde belirtin:

  • İşlev konumu, tetikleyici konumla aynıdır.
  • İşlev konumu, tetikleyici konumun içindedir (tetikleyici bölge, çift/çoklu bölge olduğunda).
  • Tetikleme bölgesi us-central1 olarak ayarlanmışsa işlev herhangi bir konumda olabilir.

Cloud Storage etkinliklerini işleme

Cloud Storage etkinliklerine yanıt vermek için şu işleyiciler kullanılabilir:

Node.js

  • onObjectArchived Yalnızca, bir pakette nesnede sürüm oluşturma etkinleştirildiğinde gönderilir. Bu etkinlik, bir nesnenin canlı sürümünün, ya arşivlendiği ya da aynı ada sahip bir nesne yüklemesi ile üzerine yazıldığı için arşivlenmiş bir sürüm haline geldiğini belirtir.
  • onObjectDeleted Bir nesne kalıcı olarak silindiğinde gönderilir. Bu, üzerine yazılan veya paketin yaşam döngüsü yapılandırması kapsamında silinen nesneleri içerir. Nesnede sürüm oluşturma özelliğinin etkinleştirildiği paketlerde, arşivleme işlemi storage.objects.delete yöntemiyle gerçekleşse bile bir nesne arşivlendiğinde bu gönderilmez (bkz. onArchive).
  • onObjectFinalized Pakette yeni bir nesne (veya mevcut bir nesnenin yeni nesli) başarıyla oluşturulduğunda gönderilir. Bu, mevcut bir nesnenin kopyalanmasını veya yeniden yazılmasını içerir. Başarısız olan bir yükleme, bu etkinliği tetiklemez.
  • onMetadataUpdated Mevcut bir nesnenin meta verileri değiştiğinde gönderilir.

Python

  • on_object_archived Yalnızca, bir pakette nesnede sürüm oluşturma etkinleştirildiğinde gönderilir. Bu etkinlik, bir nesnenin canlı sürümünün, ya arşivlendiği ya da aynı ada sahip bir nesne yüklemesi ile üzerine yazıldığı için arşivlenmiş bir sürüm haline geldiğini belirtir.
  • on_object_deleted Bir nesne kalıcı olarak silindiğinde gönderilir. Bu, üzerine yazılan veya paketin yaşam döngüsü yapılandırması kapsamında silinen nesneleri içerir. Nesnede sürüm oluşturma özelliğinin etkinleştirildiği paketlerde, arşivleme işlemi storage.objects.delete yöntemiyle gerçekleşse bile bir nesne arşivlendiğinde bu gönderilmez (bkz. onArchive).
  • on_object_finalized Pakette yeni bir nesne (veya mevcut bir nesnenin yeni nesli) başarıyla oluşturulduğunda gönderilir. Bu, mevcut bir nesnenin kopyalanmasını veya yeniden yazılmasını içerir. Başarısız olan bir yükleme, bu etkinliği tetiklemez.
  • on_metadata_updated Mevcut bir nesnenin meta verileri değiştiğinde gönderilir.

Cloud Storage nesne özelliklerine erişme

Cloud Functions, güncellenen dosyanın boyutu ve içerik türü gibi bir dizi Cloud Storage nesne özelliğini kullanıma sunar. metageneration özelliği, nesnenin meta verilerinde değişiklik olduğunda artırılır. Yeni nesneler için metageneration değeri 1'dir.

Node.js

const fileBucket = event.data.bucket; // Storage bucket containing the file.
const filePath = event.data.name; // File path in the bucket.
const contentType = event.data.contentType; // File content type.

Python

bucket_name = event.data.bucket
file_path = pathlib.PurePath(event.data.name)
content_type = event.data.content_type

Küçük resim oluşturma örneği, işlevin döndürdüğü çıkış durumlarını algılamak için bu özelliklerden bazılarını kullanır:

Node.js

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith("image/")) {
  return logger.log("This is not an image.");
}
// Exit if the image is already a thumbnail.
const fileName = path.basename(filePath);
if (fileName.startsWith("thumb_")) {
  return logger.log("Already a Thumbnail.");
}

Python

# Exit if this is triggered on a file that is not an image.
if not content_type or not content_type.startswith("image/"):
    print(f"This is not an image. ({content_type})")
    return

# Exit if the image is already a thumbnail.
if file_path.name.startswith("thumb_"):
    print("Already a thumbnail.")
    return

Dosya indirme, dönüştürme ve yükleme

Bazı durumlarda, dosyaları Cloud Storage adresinden indirmeniz gerekmeyebilir. Ancak Cloud Storage'da depolanan bir dosyadan küçük resim oluşturma gibi yoğun görevleri gerçekleştirmek için dosyaları işlev örneğine (yani kodunuzu çalıştıran sanal makineye) indirmeniz gerekir.

Cloud Functions'ı Node.js için sharp ve Python için Pillow gibi görüntü işleme programlarıyla birlikte kullanarak grafik görüntü dosyalarında değişiklikler yapabilirsiniz. Aşağıda, yüklenen bir resim dosyası için küçük resim oluşturma örneği verilmiştir:

Node.js

/**
 * When an image is uploaded in the Storage bucket,
 * generate a thumbnail automatically using sharp.
 */
exports.generateThumbnail = onObjectFinalized({cpu: 2}, async (event) => {

  const fileBucket = event.data.bucket; // Storage bucket containing the file.
  const filePath = event.data.name; // File path in the bucket.
  const contentType = event.data.contentType; // File content type.

  // Exit if this is triggered on a file that is not an image.
  if (!contentType.startsWith("image/")) {
    return logger.log("This is not an image.");
  }
  // Exit if the image is already a thumbnail.
  const fileName = path.basename(filePath);
  if (fileName.startsWith("thumb_")) {
    return logger.log("Already a Thumbnail.");
  }

  // Download file into memory from bucket.
  const bucket = getStorage().bucket(fileBucket);
  const downloadResponse = await bucket.file(filePath).download();
  const imageBuffer = downloadResponse[0];
  logger.log("Image downloaded!");

  // Generate a thumbnail using sharp.
  const thumbnailBuffer = await sharp(imageBuffer).resize({
    width: 200,
    height: 200,
    withoutEnlargement: true,
  }).toBuffer();
  logger.log("Thumbnail created");

  // Prefix 'thumb_' to file name.
  const thumbFileName = `thumb_${fileName}`;
  const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);

  // Upload the thumbnail.
  const metadata = {contentType: contentType};
  await bucket.file(thumbFilePath).save(thumbnailBuffer, {
    metadata: metadata,
  });
  return logger.log("Thumbnail uploaded!");
});

Dosyayı Cloud Functions örneğinizdeki geçici bir dizine indirin. Bu konumda dosyayı gerektiği gibi işleyebilir ve ardından Cloud Storage'ya yükleyebilirsiniz. Eşzamansız görevleri yürütürken geri çağırma işlevinizde bir JavaScript sözü döndürdüğünüzden emin olun.

Python

@storage_fn.on_object_finalized()
def generatethumbnail(event: storage_fn.CloudEvent[storage_fn.StorageObjectData]):
    """When an image is uploaded in the Storage bucket, generate a thumbnail
    automatically using Pillow."""

    bucket_name = event.data.bucket
    file_path = pathlib.PurePath(event.data.name)
    content_type = event.data.content_type

    # Exit if this is triggered on a file that is not an image.
    if not content_type or not content_type.startswith("image/"):
        print(f"This is not an image. ({content_type})")
        return

    # Exit if the image is already a thumbnail.
    if file_path.name.startswith("thumb_"):
        print("Already a thumbnail.")
        return

    bucket = storage.bucket(bucket_name)

    image_blob = bucket.blob(str(file_path))
    image_bytes = image_blob.download_as_bytes()
    image = Image.open(io.BytesIO(image_bytes))

    image.thumbnail((200, 200))
    thumbnail_io = io.BytesIO()
    image.save(thumbnail_io, format="png")
    thumbnail_path = file_path.parent / pathlib.PurePath(f"thumb_{file_path.stem}.png")
    thumbnail_blob = bucket.blob(str(thumbnail_path))
    thumbnail_blob.upload_from_string(thumbnail_io.getvalue(), content_type="image/png")

Bu kod, geçici bir dizine kaydedilen resim için 200x200 boyutunda bir küçük resim oluşturur ve ardından bu resmi Cloud Storage'ya geri yükler.