Memperluas dengan Cloud Functions (generasi ke-2)
Dengan Cloud Functions, Anda dapat men-deploy kode untuk menangani peristiwa yang dipicu oleh perubahan pada database Firestore. Dengan begitu, Anda dapat menambahkan fungsi sisi server tanpa harus menjalankan server Anda sendiri.
Memperluas fungsi Firestore dengan Cloud Functions (generasi ke-2)
Cloud Functions (generasi ke-2) mendukung pemicu peristiwa Firestore berikut sehingga Anda dapat membuat pengendali yang terkait dengan peristiwa Firestore:
Jenis Peristiwa | Pemicu |
---|---|
google.cloud.firestore.document.v1.created |
Dipicu saat dokumen ditulisi untuk pertama kalinya. |
google.cloud.firestore.document.v1.updated |
Dipicu saat dokumen sudah ada dan nilainya berubah. |
google.cloud.firestore.document.v1.deleted |
Dipicu saat dokumen dihapus. |
google.cloud.firestore.document.v1.written |
Dipicu saat created , updated , atau deleted dipicu. |
google.cloud.firestore.document.v1.created.withAuthContext |
Sama seperti created tetapi menambahkan informasi autentikasi. |
google.cloud.firestore.document.v1.updated.withAuthContext |
Sama seperti updated tetapi menambahkan informasi autentikasi. |
google.cloud.firestore.document.v1.deleted.withAuthContext |
Sama seperti deleted tetapi menambahkan informasi autentikasi. |
google.cloud.firestore.document.v1.written.withAuthContext |
Sama seperti written tetapi menambahkan informasi autentikasi. |
Peristiwa Firestore hanya dipicu jika ada perubahan dokumen. Pembaruan terhadap dokumen Firestore yang tidak mengubah data (penulisan tanpa pengoperasian), tidak menghasilkan peristiwa penulisan atau pembaruan. Peristiwa tidak dapat ditambahkan ke kolom tertentu.
Sertakan konteks autentikasi dalam peristiwa
Untuk menyertakan informasi autentikasi tambahan tentang peristiwa, gunakan pemicu peristiwa dengan ekstensi withAuthContext
. Ekstensi ini menambahkan informasi tambahan tentang akun utama yang memicu peristiwa. Metode ini menambahkan
atribut authtype
dan authid
, selain informasi yang ditampilkan dalam
peristiwa dasar. Lihat referensi
authcontext
untuk mengetahui informasi selengkapnya tentang nilai atribut.
Menulis fungsi yang dipicu Firestore
Untuk menulis fungsi yang merespons peristiwa Firestore, siapkan untuk menentukan hal berikut selama deployment:
- jenis peristiwa pemicu
- filter peristiwa pemicu untuk memilih dokumen yang terkait dengan fungsi tersebut
- kode fungsi untuk menjalankan
Filter peristiwa pemicu
Saat menentukan filter peristiwa, Anda dapat menentukan kecocokan dokumen yang tepat atau pola jalur. Gunakan pola jalur untuk mencocokkan beberapa dokumen dengan karakter pengganti, *
atau **
.
Misalnya, Anda dapat merespons perubahan pada dokumen berikut:
users/marie
Gunakan karakter pengganti, *
atau **
, untuk merespons perubahan dalam dokumen yang cocok dengan pola. *
karakter pengganti cocok dengan satu segmen dan
**
karakter pengganti multi-segmen cocok dengan nol atau beberapa segmen dalam pola.
Untuk pencocokan segmen tunggal (*
), Anda juga dapat menggunakan grup tangkapan bernama. Misalnya,
users/{userId}
.
Contoh:
Pola | Deskripsi |
---|---|
/users/* atau /users/{userId} |
Mencocokkan semua dokumen di koleksi /users . Tidak cocok dengan dokumen di subkoleksi seperti /users/marie/messages/33e2IxYBD9enzS50SJ68 |
/users/** |
Mencocokkan semua dokumen dalam koleksi /users dan dokumen di subkoleksi seperti /users/marie/messages/33e2IxYBD9enzS50SJ68 |
Untuk mempelajari pola jalur lebih lanjut, lihat Pola jalur Eventarc.
Pemicu Anda harus selalu menunjuk ke sebuah dokumen, meskipun Anda menggunakan karakter pengganti.
Misalnya, users/{userId=*}/{messageCollectionId=*}
tidak valid karena {messageCollectionId=*}
adalah sebuah koleksi. Namun, users/{userId=*}/{messageCollectionId}/{messageId=*}
valid
karena {messageId=*}
akan selalu mengarah ke dokumen.
Contoh fungsi
Contoh berikut menunjukkan cara menerima peristiwa Firestore.
Untuk menggunakan data dokumen yang terlibat dalam suatu peristiwa, lihat kolom value
dan old_value
.
value
: ObjekDocument
yang berisi snapshot dokumen pascaoperasi. Kolom ini tidak diisi untuk peristiwa penghapusan.old_value
: ObjekDocument
yang berisi snapshot dokumen pra-operasi. Kolom ini hanya diisi untuk peristiwa pembaruan dan penghapusan.
Go
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Java
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Node.js
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Gunakan protobufjs untuk mendekode data peristiwa. Sertakangoogle.events.cloud.firestore.v1
data.proto
dalam sumber Anda.
Python
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
C#
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Contoh berikut mengonversi string yang ditambahkan ke kolom original
dari dokumen yang terpengaruh menjadi huruf kapital dan menulis nilai baru ke dokumen yang sama:
Go
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Java
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Node.js
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Gunakan protobufjs untuk mendekode data peristiwa. Sertakangoogle.events.cloud.firestore.v1
data.proto
dalam sumber Anda.
Python
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
C#
Untuk mengautentikasi ke Firestore, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.
Menyertakan dependensi proto di sumber Anda
Anda harus menyertakan file data.proto
Firestore di direktori sumber untuk fungsi Anda. File ini mengimpor proto berikut
yang juga harus Anda sertakan dalam direktori sumber:
Gunakan struktur direktori yang sama untuk dependensi. Misalnya, tempatkan
struct.proto
dalam google/protobuf
.
File ini diperlukan untuk mendekode data peristiwa. Jika sumber fungsi Anda tidak menyertakan file ini, sumber fungsi akan menampilkan error saat dijalankan.
Atribut peristiwa
Setiap peristiwa menyertakan atribut data yang menyertakan informasi tentang peristiwa, seperti waktu peristiwa dipicu. Firestore menambahkan data tambahan tentang database dan dokumen yang terlibat dalam peristiwa. Anda dapat mengakses atribut ini sebagai berikut:
Java
logger.info("Function triggered by event on: " + event.getSource()); logger.info("Event type: " + event.getType()); logger.info("Event time " + event.getTime()); logger.info("Event project: " + event.getExtension("project")); logger.info("Event location: " + event.getExtension("location")); logger.info("Database name: " + event.getExtension("database")); logger.info("Database document: " + event.getExtension("document")); // For withAuthContext events logger.info("Auth information: " + event.getExtension("authid")); logger.info("Auth information: " + event.getExtension("authtype"));
Node.js
console.log(`Function triggered by event on: ${cloudEvent.source}`); console.log(`Event type: ${cloudEvent.type}`); console.log(`Event time: ${cloudEvent.time}`); console.log(`Event project: ${cloudEvent.project}`); console.log(`Event location: ${cloudEvent.location}`); console.log(`Database name: ${cloudEvent.database}`); console.log(`Document name: ${cloudEvent.document}`); // For withAuthContext events console.log(`Auth information: ${cloudEvent.authid}`); console.log(`Auth information: ${cloudEvent.authtype}`);
Python
print(f"Function triggered by change to: {cloud_event['source']}") print(f"Event type: {cloud_event['type']}") print(f"Event time: {cloud_event['time']}") print(f"Event project: {cloud_event['project']}") print(f"Location: {cloud_event['location']}") print(f"Database name: {cloud_event['database']}") print(f"Document: {cloud_event['document']}") // For withAuthContext events print(f"Auth information: {cloud_event['authid']}") print(f"Auth information: {cloud_event['authtype']}")
Men-deploy fungsi
Pengguna yang men-deploy Cloud Functions harus memiliki peran IAM Developer Cloud Functions atau peran yang mencakup izin yang sama. Lihat juga Konfigurasi tambahan untuk deployment.
Anda dapat men-deploy fungsi menggunakan gcloud CLI atau Konsol Google Cloud. Contoh di bawah ini menunjukkan deployment dengan gcloud CLI. Untuk mengetahui detail tentang deployment dengan Konsol Google Cloud, lihat Men-deploy Cloud Functions
gcloud
-
Di konsol Google Cloud, aktifkan Cloud Shell.
Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.
Gunakan perintah
gcloud functions deploy
untuk men-deploy fungsi:gcloud functions deploy YOUR_FUNCTION_NAME \ --gen2 \ --region=FUNCTION_LOCATION \ --trigger-location=TRIGGER_LOCATION \ --runtime=YOUR_RUNTIME \ --source=YOUR_SOURCE_LOCATION \ --entry-point=YOUR_CODE_ENTRYPOINT \ --trigger-event-filters="type=EVENT_FILTER_TYPE" \ --trigger-event-filters="database=DATABASE" \ --trigger-event-filters-path-pattern="document=DOCUMENT" \
Argumen pertama,
YOUR_FUNCTION_NAME
, adalah nama untuk fungsi yang di-deploy. Nama fungsi harus dimulai dengan huruf yang diikuti dengan maksimal 62 huruf, angka, tanda hubung, atau garis bawah, dan harus diakhiri dengan huruf atau angka.Flag
--gen2
menentukan bahwa Anda ingin men-deploy ke Cloud Functions (generasi ke-2). Jika flag ini tidak ada, deployment ke Cloud Functions (generasi ke-1) akan terjadi.Flag
--region
menentukan region tempat men-deploy fungsi Anda.Untuk memaksimalkan kedekatan, tetapkan ke region yang dekat dengan database Firestore Anda. Jika database Firestore Anda berada di lokasi multi-region, tetapkan ke
us-central1
untuk database dinam5
dan keeurope-west4
untuk database dieur3
. Untuk lokasi Firestore regional, tetapkan ke region yang sama.Flag
--trigger-location
menentukan lokasi pemicu. Anda harus menetapkan flag ini ke lokasi database Firestore.Flag
--runtime
menentukan runtime bahasa yang digunakan fungsi Anda. Cloud Functions mendukung beberapa runtime. Lihat Runtime untuk mengetahui informasi lebih lanjut.Flag
--source
menentukan lokasi kode sumber fungsi Anda. Lihat informasi berikut untuk mengetahui detailnya:Flag
--entry-point
menentukan titik masuk ke fungsi Anda dalam kode sumber. Ini adalah kode yang akan dijalankan saat fungsi Anda berjalan. Nilai flag ini harus berupa nama fungsi atau nama class yang sepenuhnya memenuhi syarat yang ada dalam kode sumber Anda. Lihat Titik entri fungsi untuk informasi selengkapnya.EVENT_FILTER_TYPE
: Firestore mendukung jenis peristiwa berikut.google.cloud.firestore.document.v1.created
: peristiwa dikirim saat dokumen ditulis untuk pertama kalinya.google.cloud.firestore.document.v1.updated
: peristiwa dikirim saat dokumen sudah ada dan nilainya berubah.google.cloud.firestore.document.v1.deleted
: peristiwa dikirim saat dokumen dihapus.google.cloud.firestore.document.v1.written
: peristiwa dikirim saat dokumen dibuat, diperbarui, atau dihapus.google.cloud.firestore.document.v1.created.withAuthContext
: peristiwa dikirim saat dokumen ditulis untuk pertama kalinya dan peristiwa tersebut menyertakan informasi autentikasi tambahangoogle.cloud.firestore.document.v1.updated.withAuthContext
: peristiwa dikirim saat dokumen sudah ada dan nilainya berubah. Menyertakan informasi autentikasi tambahangoogle.cloud.firestore.document.v1.deleted.withAuthContext
: peristiwa dikirim saat dokumen dihapus. Menyertakan informasi autentikasi tambahangoogle.cloud.firestore.document.v1.written.withAuthContext
: peristiwa dikirim saat dokumen dibuat, diperbarui, atau dihapus dan peristiwa. Menyertakan informasi autentikasi tambahan
DATABASE
: database Firestore. Untuk nama database default, gunakan(default)
.DOCUMENT
: jalur database yang memicu peristiwa saat data dibuat, diperbarui, atau dihapus. Operator dapat berupa salah satu dari hal berikut:- Sama; misalnya,
--trigger-event-filters=document='users/marie'
- Pola jalur; misalnya,
--trigger-event-filters-path-pattern=document='users/*'
. Untuk mengetahui informasi selengkapnya, lihat Memahami pola jalur.
- Sama; misalnya,
Secara opsional, Anda dapat menentukan opsi konfigurasi, jaringan, dan keamanan tambahan saat men-deploy fungsi.
Untuk referensi lengkap tentang perintah deployment dan flag-nya, lihat dokumentasi
gcloud functions deploy
.
Contoh deployment
Contoh berikut menunjukkan deployment dengan Google Cloud CLI.
Deploy fungsi untuk database di region us-west2
:
gcloud functions deploy gcfv2-trigger-firestore-node \
--gen2 \
--region=us-west2 \
--trigger-location=us-west2 \
--runtime=nodejs18 \
--source=gs://CLOUD_STORAGE_BUCKET/firestoreEventFunction.zip \
--entry-point=makeUpperCase \
--trigger-event-filters=type=google.cloud.firestore.document.v1.written \
--trigger-event-filters=database='(default)' \
--trigger-event-filters-path-pattern=document='messages/{pushId}'
Deploy fungsi untuk database di multi-region nam5
:
gcloud functions deploy gcfv2-trigger-firestore-python \
--gen2 \
--region=us-central1 \
--trigger-location=nam5 \
--runtime=python311 \
--source=gs://CLOUD_STORAGE_BUCKET/firestoreEventFunction.zip \
--entry-point=make_upper_case \
--trigger-event-filters=type=google.cloud.firestore.document.v1.written.withAuthContext \
--trigger-event-filters=database='(default)' \
--trigger-event-filters-path-pattern=document='messages/{pushId}'
Batasan
Perhatikan batasan berikut untuk pemicu Firestore untuk Cloud Functions:
- Pengurutan tidak dijamin. Perubahan cepat dapat memicu pemanggilan fungsi dalam urutan yang tidak terduga.
- Peristiwa dikirim setidaknya satu kali, tetapi satu peristiwa dapat menghasilkan beberapa pemanggilan fungsi. Hindari mengandalkan mekanisme tepat satu kali, dan tulis fungsi idempoten.
- Firestore dalam mode Datastore memerlukan Cloud Functions (generasi ke-2). Cloud Functions (generasi ke-1) tidak mendukung mode Datastore.
- Cloud Functions (generasi ke-1) hanya berfungsi dengan database "(default)" dan tidak mendukung database bernama Firestore. Gunakan Cloud Functions (generasi ke-2) untuk mengonfigurasi peristiwa untuk database bernama.
- Pemicu dikaitkan dengan satu database. Anda tidak dapat membuat pemicu yang cocok dengan beberapa database.
- Menghapus database tidak secara otomatis menghapus pemicu untuk database tersebut. Pemicu berhenti mengirim peristiwa, tetapi akan tetap ada sampai Anda menghapus pemicu.
- Jika peristiwa yang cocok melebihi ukuran permintaan maksimum, peristiwa tersebut mungkin tidak akan dikirim ke Cloud Functions (generasi ke-1).
- Peristiwa yang tidak terkirim karena ukuran permintaan akan dicatat ke dalam log dalam log platform dan akan diperhitungkan dalam penggunaan log untuk project.
- Anda dapat menemukan log ini di Logs Explorer dengan pesan "Event dapat mengirim ke
Cloud function karena ukuran melebihi batas untuk generasi ke-1..." dengan tingkat keparahan
error
. Anda dapat menemukan nama fungsi di bawah kolomfunctionName
. Jika kolomreceiveTimestamp
masih berada dalam waktu satu jam dari sekarang, Anda dapat menyimpulkan konten peristiwa yang sebenarnya dengan membaca dokumen yang dimaksud menggunakan snapshot sebelum dan setelah stempel waktu. - Untuk menghindari peristiwa seperti ini, Anda dapat:
- Melakukan migrasi dan upgrade ke Cloud Functions (generasi ke-2)
- Memperkecil dokumen
- Menghapus Cloud Functions yang dimaksud
- Anda dapat menonaktifkan logging itu sendiri menggunakan pengecualian, tetapi perhatikan bahwa peristiwa yang melanggar tetap tidak akan dikirim.
Lokasi Eventarc dan Firestore
Eventarc tidak mendukung multi-region untuk pemicu peristiwa Firestore, tetapi Anda masih dapat membuat pemicu untuk database Firestore di lokasi multi-region. Eventarc memetakan lokasi multi-region Firestore ke region Eventarc berikut:
Firestore multi-region | Wilayah Eventarc |
---|---|
nam5 |
us-central1 |
eur3 |
europe-west4 |
Perbedaan antara Cloud Functions generasi ke-2 dan generasi ke-1
Cloud Functions (generasi ke-2) menggunakan peristiwa Eventarc untuk semua runtime. Sebelumnya, Cloud Functions (generasi ke-1) menggunakan peristiwa Eventarc hanya untuk beberapa runtime. Peristiwa Eventarc memperkenalkan perbedaan berikut dengan Cloud Functions (generasi ke-1).
Pemicu Firestore untuk Eventarc mendukung tujuan tambahan selain Cloud Functions. Anda dapat merutekan
CloudEvents
ke sejumlah tujuan termasuk, tetapi tidak terbatas pada Cloud Run, GKE, dan Alur kerja.Pemicu Firestore untuk Eventarc mengambil definisi pemicu di awal operasi tulis database dan menggunakan definisi tersebut untuk menentukan apakah Firestore harus memunculkan peristiwa. Operasi tulis tidak memperhitungkan perubahan apa pun untuk memicu definisi yang mungkin terjadi saat berjalan.
Cloud Functions (generasi ke-1) mengambil definisi pemicu selama evaluasi penulisan database, dan perubahan pada pemicu selama evaluasi dapat memengaruhi apakah Firestore memunculkan suatu peristiwa atau tidak.
Untuk mengetahui detail selengkapnya, lihat Perbandingan versi Cloud Functions.