Melengkapi Cloud Storage dengan Cloud Functions


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.

Untuk mengetahui contoh kasus penggunaan lainnya, lihat artikel Apa yang dapat saya lakukan dengan Cloud Functions?

Memicu fungsi saat terjadi perubahan Cloud Storage

Gunakan functions.storage untuk membuat fungsi yang menangani peristiwa Cloud Storage. Gunakan salah satu fungsi berikut, tergantung apakah Anda ingin mencakup fungsi ke bucket Cloud Storage tertentu atau menggunakan bucket default:

Misalnya, contoh pembuat thumbnail ini tercakup dalam bucket default project ini:

exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage mendukung peristiwa ini:

  • onArchive 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.
  • onDelete 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.
  • onFinalize 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.
  • onMetadataUpdate Dikirim saat terjadi perubahan terhadap metadata objek yang ada.

Tetapkan peristiwa dalam pengendali peristiwa on seperti yang ditunjukkan di atas untuk onFinalize.

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 = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.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 functions.logger.log('This is not an image.');
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
  return functions.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 functions = require('firebase-functions/v1');
const admin = require('firebase-admin');
admin.initializeApp()
const path = require('path');

//library for resizing images
const sharp = require('sharp');

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, lalu 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 sharp, Anda dapat melakukan manipulasi pada file gambar grafis. Berikut ini adalah contoh cara membuat gambar thumbnail untuk file gambar yang diupload:

// Download file from bucket.
const bucket = admin.storage().bucket(fileBucket);
const metadata = {
  contentType: contentType,
};
const downloadResponse = await bucket.file(filePath).download();
const imageBuffer = downloadResponse[0];
functions.logger.log("Image downloaded!");

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

// Upload the thumbnail with a 'thumb_' prefix.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
await bucket.file(thumbFilePath).save(thumbnailBuffer, {
  metadata: metadata,
});
return functions.logger.log("Thumbnail uploaded!");

Kode ini menghasilkan thumbnail berukuran 200x200 untuk gambar yang disimpan di direktori sementara, lalu menguploadnya kembali ke Cloud Storage.

Mempelajari contoh lainnya

Contoh fungsi transformasi media umum lainnya meliputi transcoding gambar, memoderasi konten, mengekstrak metadata EXIF. Daftar lengkap contoh tersedia di GitHub.