Pemicu Cloud Storage

Anda dapat memicu fungsi sebagai respons terhadap upload, pembaruan, atau penghapusan file dan folder di Cloud Storage.

Contoh di halaman ini didasarkan pada fungsi contoh yang dipicu saat file gambar diupload ke Cloud Storage. Fungsi contoh ini menunjukkan cara mengakses atribut peristiwa, cara mendownload file ke instance Cloud Functions, dan hal mendasar lainnya terkait penanganan peristiwa Cloud Storage.

Memicu fungsi saat terjadi perubahan di Cloud Storage

Gunakan subpaket firebase-functions/v2/storage untuk membuat fungsi yang menangani peristiwa Cloud Storage. Gunakan salah satu pola berikut, tergantung apakah Anda ingin mencakupkan fungsi ke bucket Cloud Storage tertentu atau menggunakan bucket default:

// scope handler to a specific bucket, using a string parameter
export archivedbucket = onObjectArchived("myBucket", (event) => {
  //…
});

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

Sebaliknya, fungsi generator thumbnail ini dicakupkan ke bucket default untuk project:

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

Menetapkan lokasi fungsi

Jarak antara lokasi bucket Cloud Storage dan lokasi fungsi dapat menghasilkan latensi jaringan yang signifikan. Selain itu, ketidakcocokan antara lokasi dapat mengakibatkan kegagalan deployment. Untuk menghindari situasi tersebut, tentukan lokasi fungsi sehingga cocok dengan lokasi bucket/pemicu melalui salah satu cara berikut:

  • Lokasi fungsi sama dengan lokasi pemicu
  • Lokasi fungsi berada di dalam lokasi pemicu (saat region pemicu berupa region ganda/multiregion)
  • Fungsi dapat berada di lokasi mana pun jika region pemicu ditetapkan ke us-central1

Menangani peristiwa Cloud Storage

Cloud Storage mendukung peristiwa ini:

Pengendali berikut untuk merespons peristiwa Cloud Storage tersedia:

  • onObjectArchived Hanya dikirim saat bucket telah mengaktifkan pembuatan versi objek. Peristiwa ini menunjukkan bahwa versi aktif sebuah objek telah menjadi versi yang diarsipkan, baik karena versi tersebut memang telah diarsipkan maupun karena sudah ditimpa oleh objek yang diupload dengan nama yang sama.
  • onObjectDeleted Dikirim saat sebuah objek telah dihapus secara permanen. Ini mencakup objek yang ditimpa atau dihapus sebagai bagian dari konfigurasi siklus proses bucket. Untuk bucket yang telah mengaktifkan pembuatan versi objek, peristiwa ini tidak akan dikirim saat objek diarsipkan (lihat onArchive), meskipun pengarsipan terjadi melalui metode storage.objects.delete.
  • onObjectFinalized Dikirim saat objek baru (atau pembuatan ulang objek yang sudah ada) berhasil dibuat dalam bucket. Hal ini meliputi penyalinan atau penulisan ulang objek yang sudah ada. Peristiwa ini tidak akan terpicu oleh upload yang gagal.
  • onMetadataUpdated Dikirim saat terjadi perubahan terhadap metadata objek yang ada.

Mengakses atribut objek Cloud Storage

Cloud Functions menampilkan sejumlah atribut objek Cloud Storage, seperti size dan contentType, untuk file yang diperbarui. Atribut metageneration bertambah setiap kali terjadi perubahan pada metadata objek. Untuk objek baru, nilai metageneration adalah 1.

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.

Contoh pembuatan thumbnail ini menggunakan sejumlah atribut tersebut untuk mendeteksi kasus keluar. Dalam kasus tersebut, fungsi menampilkan:

// 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.");
}

Mendownload, mentransformasi, dan mengupload file

Untuk beberapa kasus, mendownload file dari Cloud Storage mungkin tidak diperlukan. Namun, untuk melakukan tugas intensif, seperti membuat gambar thumbnail dari file yang disimpan di Cloud Storage, Anda harus mendownload file ke instance fungsi—yakni, mesin virtual yang menjalankan kode Anda.

Untuk mendownload dan mengupload ulang objek ke Cloud Storage dengan mudah, instal paket Google Cloud Storage menggunakan npm install --save @google-cloud/storage, lalu impor paket tersebut. Untuk menggunakan promise JavaScript yang akan menangani proses eksternal, seperti tugas pemrosesan thumbnail dalam contoh, impor juga child-process-promise:

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

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();

Gunakan gcs.bucket.file(filePath).download untuk mendownload file ke direktori sementara pada instance Cloud Functions Anda. Di lokasi ini, Anda dapat memproses file sesuai kebutuhan, kemudian menguploadnya ke Cloud Storage. Saat melakukan tugas asinkron, pastikan untuk menampilkan promise JavaScript di callback Anda.

Contoh: transformasi gambar

Dengan menggunakan Cloud Functions bersama dengan program pemrosesan gambar, seperti ImageMagick, Anda dapat melakukan manipulasi pada file gambar grafis. Berikut ini adalah contoh cara membuat gambar thumbnail untuk file gambar yang diupload:

// 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!");

Kode ini mengeksekusi program command line ImageMagick, yaitu convert, untuk membuat thumbnail berukuran 200x200 untuk gambar yang disimpan dalam direktori sementara, lalu menguploadnya kembali ke Cloud Storage.

Baca dokumentasi lengkap pemicu Google Cloud Storage untuk mengetahui informasi lebih lanjut.