1. Ringkasan
Di codelab pertama, Anda akan mengupload gambar dalam bucket. Tindakan ini akan menghasilkan peristiwa pembuatan file yang akan ditangani oleh suatu fungsi. Fungsi ini akan melakukan panggilan ke Vision API untuk melakukan analisis gambar dan menyimpan hasilnya di datastore.
Yang akan Anda pelajari
- Cloud Storage
- Cloud Functions
- Cloud Vision API
- Cloud Firestore
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.
- Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
- Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak
peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai
PROJECT_ID
). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloud Shell
Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.
Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:
Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.
3. Mengaktifkan API
Untuk lab ini, Anda akan menggunakan Cloud Functions dan Vision API, tetapi Anda harus mengaktifkannya terlebih dahulu di Cloud Console atau dengan gcloud
.
Untuk mengaktifkan Vision API di Cloud Console, telusuri Cloud Vision API
di kotak penelusuran:
Anda akan diarahkan ke halaman Cloud Vision API:
Klik tombol ENABLE
.
Atau, Anda juga dapat mengaktifkannya dengan Cloud Shell menggunakan alat command line gcloud.
Di dalam Cloud Shell, jalankan perintah berikut:
gcloud services enable vision.googleapis.com
Anda akan melihat operasi berhasil diselesaikan:
Operation "operations/acf.12dba18b-106f-4fd2-942d-fea80ecc5c1c" finished successfully.
Aktifkan juga Cloud Functions:
gcloud services enable cloudfunctions.googleapis.com
4. Membuat bucket (konsol)
Buat bucket penyimpanan untuk foto. Anda dapat melakukannya dari konsol Google Cloud Platform ( console.cloud.google.com) atau dengan alat command line gsutil dari Cloud Shell atau lingkungan pengembangan lokal Anda.
Membuka Penyimpanan
Dari "hamburger" (⇧), buka halaman Storage
.
Menamai bucket
Klik tombol CREATE BUCKET
.
Klik CONTINUE
.
Pilih Lokasi
Buat bucket multi-regional di region pilihan Anda (di sini Europe
).
Klik CONTINUE
.
Pilih kelas penyimpanan default
Pilih kelas penyimpanan Standard
untuk data Anda.
Klik CONTINUE
.
Menyetel Kontrol Akses
Saat Anda akan bekerja dengan gambar yang dapat diakses oleh publik, Anda ingin semua foto yang disimpan dalam bucket ini memiliki kontrol akses yang seragam.
Pilih opsi kontrol akses Uniform
.
Klik CONTINUE
.
Menyetel Perlindungan/Enkripsi
Jadikan default (Google-managed key)
, karena Anda tidak akan menggunakan kunci enkripsi Anda sendiri.
Klik CREATE
, untuk menyelesaikan pembuatan bucket.
Menambahkan allUsers sebagai penampil penyimpanan
Buka tab Permissions
:
Tambahkan anggota allUsers
ke bucket, dengan peran Storage > Storage Object Viewer
, sebagai berikut:
Klik SAVE
.
5. Membuat bucket (gsutil)
Anda juga dapat menggunakan alat command line gsutil
di Cloud Shell untuk membuat bucket.
Di Cloud Shell, tetapkan variabel untuk nama bucket yang unik. Cloud Shell sudah memiliki GOOGLE_CLOUD_PROJECT
yang ditetapkan ke project ID unik Anda. Anda dapat menambahkannya ke nama bucket.
Contoh:
export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
Buat zona multi-region standar di Eropa:
gsutil mb -l EU gs://${BUCKET_PICTURES}
Pastikan akses level bucket seragam:
gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES}
Buat bucket menjadi publik.
gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}
Jika Anda membuka bagian Cloud Storage
pada konsol, Anda akan memiliki bucket uploaded-pictures
publik:
Uji apakah Anda dapat mengupload gambar ke bucket dan gambar yang diupload akan tersedia untuk publik, seperti yang dijelaskan pada langkah sebelumnya.
6. Menguji akses publik ke bucket
Kembali ke browser penyimpanan, Anda akan melihat bucket Anda dalam daftar, dengan label "Publik" akses Anda (termasuk tanda peringatan yang mengingatkan Anda bahwa siapa saja memiliki akses ke konten dalam bucket tersebut).
Bucket Anda sekarang siap untuk menerima gambar.
Jika mengklik nama bucket, Anda akan melihat detail bucket.
Di sana, Anda dapat mencoba tombol Upload files
, untuk menguji apakah Anda dapat menambahkan gambar ke bucket. Pop-up pemilih file akan meminta Anda memilih file. Setelah dipilih, akses akan diupload ke bucket Anda, dan Anda akan melihat lagi akses public
yang telah otomatis diatribusikan ke file baru ini.
Di sepanjang label akses Public
, Anda juga akan melihat ikon link kecil. Saat mengkliknya, browser Anda akan membuka URL publik gambar tersebut, yang akan berbentuk:
https://storage.googleapis.com/BUCKET_NAME/PICTURE_FILE.png
Dengan BUCKET_NAME
berupa nama unik global yang telah Anda pilih untuk bucket Anda, kemudian nama file foto Anda.
Dengan mengklik kotak centang di sepanjang nama foto, tombol DELETE
akan diaktifkan, dan Anda dapat menghapus gambar pertama ini.
7. Membuat fungsi
Pada langkah ini, Anda akan membuat fungsi yang bereaksi terhadap peristiwa upload gambar.
Kunjungi bagian Cloud Functions
di Konsol Google Cloud. Dengan mengunjunginya, layanan Cloud Functions akan diaktifkan secara otomatis.
Klik Create function
.
Pilih nama (misalnya, picture-uploaded
) dan Region (ingatlah agar konsisten dengan pilihan region untuk bucket):
Ada dua jenis fungsi:
- fungsi HTTP yang dapat dipanggil melalui URL (yaitu API web),
- Fungsi latar belakang yang dapat dipicu oleh beberapa peristiwa.
Anda ingin membuat fungsi latar belakang yang dipicu saat file baru diupload ke bucket Cloud Storage
:
Anda tertarik dengan jenis peristiwa Finalize/Create
, yaitu peristiwa yang dipicu saat file dibuat atau diperbarui di bucket:
Pilih bucket yang dibuat sebelumnya, untuk memberi tahu Cloud Functions agar diberi tahu saat file dibuat / diupdate di bucket khusus ini:
Klik Select
untuk memilih bucket yang Anda buat sebelumnya, lalu klik Save
Sebelum mengklik Berikutnya, Anda dapat memperluas dan mengubah setelan default (memori 256 MB) di bagian Setelan runtime, build, koneksi, dan keamanan, lalu mengupdatenya ke 1 GB.
Setelah mengklik Next
, Anda dapat menyesuaikan Runtime, Source code, dan titik entri.
Simpan Inline editor
untuk fungsi ini:
Pilih salah satu runtime Node.js:
Kode sumber terdiri dari file JavaScript index.js
, dan file package.json
yang menyediakan berbagai metadata dan dependensi.
Biarkan cuplikan kode default: cuplikan ini mencatat nama file dari gambar yang diupload:
Untuk saat ini, simpan nama fungsi yang akan dieksekusi ke helloGCS
, untuk tujuan pengujian.
Klik Deploy
untuk membuat dan men-deploy fungsi. Setelah deployment berhasil, Anda akan melihat tanda centang dengan lingkaran hijau dalam daftar fungsi:
8. Menguji fungsi
Pada langkah ini, uji apakah fungsi merespons peristiwa penyimpanan.
Dari "hamburger" (⇧), kembali ke halaman Storage
.
Klik bucket gambar, lalu klik Upload files
untuk mengupload gambar.
Buka lagi halaman Logging > Logs Explorer
di dalam konsol cloud.
Di pemilih Log Fields
, pilih Cloud Function
untuk melihat log yang dikhususkan untuk fungsi Anda. Scroll ke bawah pada Kolom Log, dan Anda bahkan dapat memilih fungsi tertentu untuk melihat log terkait fungsi secara lebih mendetail. Pilih fungsi picture-uploaded
.
Anda akan melihat item log yang menyebutkan pembuatan fungsi, waktu mulai dan berakhir fungsi, dan laporan log kita yang sebenarnya:
Laporan log kita bertuliskan: Processing file: pic-a-daily-architecture-events.png
, yang berarti bahwa peristiwa yang terkait dengan pembuatan dan penyimpanan gambar ini telah dipicu seperti yang diharapkan.
9. Menyiapkan database
Anda akan menyimpan informasi tentang gambar yang diberikan oleh Vision API ke dalam database Cloud Firestore, yaitu database dokumen NoSQL yang cepat, terkelola sepenuhnya, serverless, dan berbasis cloud. Siapkan database Anda dengan membuka bagian Firestore
di Konsol Cloud:
Ada dua opsi yang ditawarkan: Native mode
atau Datastore mode
. Gunakan mode native, yang menawarkan fitur tambahan seperti dukungan offline dan sinkronisasi real-time.
Klik SELECT NATIVE MODE
.
Pilih multi-region (di sini di Eropa, tetapi idealnya harus region yang sama dengan bucket penyimpanan dan fungsi Anda).
Klik tombol CREATE DATABASE
.
Setelah database dibuat, Anda akan melihat tampilan berikut:
Buat koleksi baru dengan mengklik tombol + START COLLECTION
.
Koleksi nama pictures
.
Anda tidak perlu membuat dokumen. Anda akan menambahkannya secara terprogram karena gambar baru disimpan di Cloud Storage dan dianalisis oleh Vision API.
Klik Save
.
Firestore membuat dokumen default pertama dalam koleksi yang baru dibuat. Anda dapat menghapus dokumen tersebut dengan aman karena tidak berisi informasi yang berguna:
Dokumen yang akan dibuat secara terprogram dalam koleksi kami akan berisi 4 kolom:
- name (string): nama file gambar yang diupload, yang juga merupakan kunci dokumen
- label (array string): label item yang dikenali oleh Vision API
- color (string): kode warna heksadesimal dari warna dominan (yaitu #ab12ef)
- dibuat (tanggal): stempel waktu saat metadata gambar ini disimpan
- thumbnail (boolean): kolom opsional yang akan ada dan bernilai benar jika gambar thumbnail telah dibuat untuk gambar ini
Karena kita akan menelusuri di Firestore untuk menemukan gambar yang memiliki thumbnail, dan mengurutkan berdasarkan tanggal pembuatan, kita harus membuat indeks penelusuran.
Anda dapat membuat indeks dengan perintah berikut di Cloud Shell:
gcloud firestore indexes composite create \
--collection-group=pictures \
--field-config field-path=thumbnail,order=descending \
--field-config field-path=created,order=descending
Atau, Anda juga dapat melakukannya dari Konsol Cloud, dengan mengklik Indexes
, pada kolom navigasi di sebelah kiri, lalu membuat indeks gabungan seperti yang ditunjukkan di bawah ini:
Klik Create
. Pembuatan indeks dapat memerlukan waktu beberapa menit.
10. Mengupdate fungsi
Kembali ke halaman Functions
, untuk mengupdate fungsi guna memanggil Vision API untuk menganalisis gambar kita, dan untuk menyimpan metadata di Firestore.
Dari "hamburger" (⇧), buka bagian Cloud Functions
, klik nama fungsi, pilih tab Source
, lalu klik tombol EDIT
.
Pertama, edit file package.json
yang mencantumkan dependensi fungsi Node.JS. Update kode untuk menambahkan dependensi NPM Cloud Vision API:
{
"name": "picture-analysis-function",
"version": "0.0.1",
"dependencies": {
"@google-cloud/storage": "^1.6.0",
"@google-cloud/vision": "^1.8.0",
"@google-cloud/firestore": "^3.4.1"
}
}
Setelah dependensi terbaru, Anda akan mengerjakan kode fungsi kita, dengan mengupdate file index.js
.
Ganti kode di index.js
dengan kode di bawah ini. Hal ini akan dijelaskan pada langkah berikutnya.
const vision = require('@google-cloud/vision');
const Storage = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const client = new vision.ImageAnnotatorClient();
exports.vision_analysis = async (event, context) => {
console.log(`Event: ${JSON.stringify(event)}`);
const filename = event.name;
const filebucket = event.bucket;
console.log(`New picture uploaded ${filename} in ${filebucket}`);
const request = {
image: { source: { imageUri: `gs://${filebucket}/${filename}` } },
features: [
{ type: 'LABEL_DETECTION' },
{ type: 'IMAGE_PROPERTIES' },
{ type: 'SAFE_SEARCH_DETECTION' }
]
};
// invoking the Vision API
const [response] = await client.annotateImage(request);
console.log(`Raw vision output for: ${filename}: ${JSON.stringify(response)}`);
if (response.error === null) {
// listing the labels found in the picture
const labels = response.labelAnnotations
.sort((ann1, ann2) => ann2.score - ann1.score)
.map(ann => ann.description)
console.log(`Labels: ${labels.join(', ')}`);
// retrieving the dominant color of the picture
const color = response.imagePropertiesAnnotation.dominantColors.colors
.sort((c1, c2) => c2.score - c1.score)[0].color;
const colorHex = decColorToHex(color.red, color.green, color.blue);
console.log(`Colors: ${colorHex}`);
// determining if the picture is safe to show
const safeSearch = response.safeSearchAnnotation;
const isSafe = ["adult", "spoof", "medical", "violence", "racy"].every(k =>
!['LIKELY', 'VERY_LIKELY'].includes(safeSearch[k]));
console.log(`Safe? ${isSafe}`);
// if the picture is safe to display, store it in Firestore
if (isSafe) {
const pictureStore = new Firestore().collection('pictures');
const doc = pictureStore.doc(filename);
await doc.set({
labels: labels,
color: colorHex,
created: Firestore.Timestamp.now()
}, {merge: true});
console.log("Stored metadata in Firestore");
}
} else {
throw new Error(`Vision API error: code ${response.error.code}, message: "${response.error.message}"`);
}
};
function decColorToHex(r, g, b) {
return '#' + Number(r).toString(16).padStart(2, '0') +
Number(g).toString(16).padStart(2, '0') +
Number(b).toString(16).padStart(2, '0');
}
11. Jelajahi fungsinya
Mari kita lihat lebih dekat berbagai bagian yang menarik.
Pertama, kita memerlukan modul yang diperlukan, untuk Vision, Storage, dan Firestore:
const vision = require('@google-cloud/vision');
const Storage = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
Kemudian, kita menyiapkan klien untuk Vision API:
const client = new vision.ImageAnnotatorClient();
Sekarang masuk ke struktur {i>function<i} kita. Kita menjadikannya fungsi asinkron, karena kita menggunakan kemampuan async / await yang diperkenalkan di Node.js 8:
exports.vision_analysis = async (event, context) => {
...
const filename = event.name;
const filebucket = event.bucket;
...
}
Perhatikan tanda tangan, tetapi juga cara kita mengambil nama file dan bucket yang memicu Cloud Function.
Sebagai referensi, berikut tampilan payload peristiwa:
{
"bucket":"uploaded-pictures",
"contentType":"image/png",
"crc32c":"efhgyA==",
"etag":"CKqB956MmucCEAE=",
"generation":"1579795336773802",
"id":"uploaded-pictures/Screenshot.png/1579795336773802",
"kind":"storage#object",
"md5Hash":"PN8Hukfrt6C7IyhZ8d3gfQ==",
"mediaLink":"https://www.googleapis.com/download/storage/v1/b/uploaded-pictures/o/Screenshot.png?generation=1579795336773802&alt=media",
"metageneration":"1",
"name":"Screenshot.png",
"selfLink":"https://www.googleapis.com/storage/v1/b/uploaded-pictures/o/Screenshot.png",
"size":"173557",
"storageClass":"STANDARD",
"timeCreated":"2020-01-23T16:02:16.773Z",
"timeStorageClassUpdated":"2020-01-23T16:02:16.773Z",
"updated":"2020-01-23T16:02:16.773Z"
}
Kami menyiapkan permintaan untuk dikirim melalui klien Vision:
const request = {
image: { source: { imageUri: `gs://${filebucket}/${filename}` } },
features: [
{ type: 'LABEL_DETECTION' },
{ type: 'IMAGE_PROPERTIES' },
{ type: 'SAFE_SEARCH_DETECTION' }
]
};
Kami meminta 3 kemampuan utama Vision API:
- Deteksi label: untuk memahami isi foto
- Properti gambar: untuk memberikan atribut gambar yang menarik (kami lebih tertarik dengan warna dominan gambar)
- Safe search: untuk mengetahui apakah gambar aman untuk ditampilkan (gambar tidak boleh berisi konten dewasa / medis / tidak pantas / kekerasan)
Pada tahap ini, kita dapat melakukan panggilan ke Vision API:
const [response] = await client.annotateImage(request);
Sebagai referensi, berikut ini tampilan respons dari Vision API:
{
"faceAnnotations": [],
"landmarkAnnotations": [],
"logoAnnotations": [],
"labelAnnotations": [
{
"locations": [],
"properties": [],
"mid": "/m/01yrx",
"locale": "",
"description": "Cat",
"score": 0.9959855675697327,
"confidence": 0,
"topicality": 0.9959855675697327,
"boundingPoly": null
},
✄ - - - ✄
],
"textAnnotations": [],
"localizedObjectAnnotations": [],
"safeSearchAnnotation": {
"adult": "VERY_UNLIKELY",
"spoof": "UNLIKELY",
"medical": "VERY_UNLIKELY",
"violence": "VERY_UNLIKELY",
"racy": "VERY_UNLIKELY",
"adultConfidence": 0,
"spoofConfidence": 0,
"medicalConfidence": 0,
"violenceConfidence": 0,
"racyConfidence": 0,
"nsfwConfidence": 0
},
"imagePropertiesAnnotation": {
"dominantColors": {
"colors": [
{
"color": {
"red": 203,
"green": 201,
"blue": 201,
"alpha": null
},
"score": 0.4175916016101837,
"pixelFraction": 0.44456374645233154
},
✄ - - - ✄
]
}
},
"error": null,
"cropHintsAnnotation": {
"cropHints": [
{
"boundingPoly": {
"vertices": [
{ "x": 0, "y": 118 },
{ "x": 1177, "y": 118 },
{ "x": 1177, "y": 783 },
{ "x": 0, "y": 783 }
],
"normalizedVertices": []
},
"confidence": 0.41695669293403625,
"importanceFraction": 1
}
]
},
"fullTextAnnotation": null,
"webDetection": null,
"productSearchResults": null,
"context": null
}
Jika tidak ada error yang ditampilkan, kita bisa melanjutkan. Jadi, mengapa kita memiliki blok if ini:
if (response.error === null) {
...
} else {
throw new Error(`Vision API error: code ${response.error.code},
message: "${response.error.message}"`);
}
Kita akan mendapatkan label hal-hal, kategori, atau tema yang dikenali dalam gambar:
const labels = response.labelAnnotations
.sort((ann1, ann2) => ann2.score - ann1.score)
.map(ann => ann.description)
Kita mengurutkan label berdasarkan skor tertinggi terlebih dahulu.
Kita tertarik untuk mengetahui warna dominan pada gambar:
const color = response.imagePropertiesAnnotation.dominantColors.colors
.sort((c1, c2) => c2.score - c1.score)[0].color;
const colorHex = decColorToHex(color.red, color.green, color.blue);
Kita mengurutkan warna berdasarkan skor dan mengambil warna pertama.
Kita juga menggunakan sebuah fungsi utilitas untuk mengubah nilai merah / hijau / biru menjadi kode warna heksadesimal yang bisa kita gunakan di stylesheet CSS.
Mari periksa apakah gambar aman untuk ditampilkan:
const safeSearch = response.safeSearchAnnotation;
const isSafe = ["adult", "spoof", "medical", "violence", "racy"]
.every(k => !['LIKELY', 'VERY_LIKELY'].includes(safeSearch[k]));
Kami memeriksa atribut dewasa / spoofing / medis / kekerasan / tidak pantas untuk mengetahui apakah mereka mungkin atau sangat mungkin melakukannya.
Jika tidak ada masalah untuk hasil safe search, kita dapat menyimpan metadata di Firestore:
if (isSafe) {
const pictureStore = new Firestore().collection('pictures');
const doc = pictureStore.doc(filename);
await doc.set({
labels: labels,
color: colorHex,
created: Firestore.Timestamp.now()
}, {merge: true});
}
12. Men-deploy cloud function
Saatnya men-deploy fungsi.
Tekan tombol DEPLOY
dan versi baru akan di-deploy, Anda dapat melihat progresnya:
13. Menguji kembali fungsi
Setelah fungsi berhasil di-deploy, Anda akan memposting gambar ke Cloud Storage, melihat apakah fungsi kita dipanggil, apa yang ditampilkan Vision API, dan apakah metadata disimpan di Firestore.
Kembali ke Cloud Storage
, lalu klik bucket yang telah kita buat di awal lab:
Setelah berada di halaman detail bucket, klik tombol Upload files
untuk mengupload gambar.
Dari "hamburger" (⇧), buka Penjelajah Logging > Logs
.
Di pemilih Log Fields
, pilih Cloud Function
untuk melihat log yang dikhususkan untuk fungsi Anda. Scroll ke bawah pada Kolom Log, dan Anda bahkan dapat memilih fungsi tertentu untuk melihat log terkait fungsi secara lebih mendetail. Pilih fungsi picture-uploaded
.
Memang, dalam daftar log, saya bisa melihat bahwa fungsi kita dipanggil:
Log menunjukkan awal dan akhir eksekusi fungsi. Dan di antaranya, kita bisa melihat log yang kita masukkan ke dalam fungsi dengan pernyataan console.log(). Kita dapat melihat:
- Detail peristiwa yang memicu fungsi kita,
- Hasil mentah dari panggilan Vision API,
- Label yang ditemukan dalam gambar yang kita unggah,
- Informasi tentang warna yang dominan,
- Apakah gambar tersebut aman untuk ditampilkan,
- Dan pada akhirnya, {i>metadata<i} yang berkaitan dengan gambar tersebut telah disimpan di Firestore.
Lagi dari "hamburger" (⇧), buka bagian Firestore
. Di subbagian Data
(ditampilkan secara default), Anda akan melihat koleksi pictures
dengan tambahan dokumen baru, sesuai dengan gambar yang baru saja Anda upload:
14. Pembersihan (Opsional)
Jika tidak ingin melanjutkan lab lain dalam seri ini, Anda dapat menghapus resource untuk menghemat biaya dan menjadi cloud citizen yang baik secara keseluruhan. Anda dapat membersihkan resource satu per satu seperti berikut.
Hapus bucket:
gsutil rb gs://${BUCKET_PICTURES}
Hapus fungsi:
gcloud functions delete picture-uploaded --region europe-west1 -q
Hapus koleksi Firestore dengan memilih Hapus koleksi dari koleksi:
Atau, Anda dapat menghapus seluruh project:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}
15. Selamat!
Selamat! Anda telah berhasil menerapkan layanan kunci enkripsi pertama project.
Yang telah kita bahas
- Cloud Storage
- Cloud Functions
- Cloud Vision API
- Cloud Firestore