GSP644
Ringkasan
Dua belas tahun lalu, Lily memulai jaringan klinik hewan Pet Theory. Saat ini,
Pet Theory mengirimkan invoice dalam format DOCX kepada klien, tetapi banyak
dari mereka yang mengeluh tidak bisa membuka file tersebut. Untuk meningkatkan
kepuasan pelanggan, Lily meminta Patrick dari bagian IT untuk mencari
alternatif guna mengatasi keluhan tersebut.
Pet Theory hanya memiliki satu staf operasional yang menangani bermacam tugas.
Karena itulah, mereka ingin berinvestasi dalam solusi hemat biaya yang tidak
memerlukan banyak pemeliharaan berkelanjutan. Setelah menganalisis berbagai
opsi pemrosesan, Patrick memutuskan untuk menggunakan
Cloud Run.
Cloud Run bersifat serverless sehingga dapat mengabstraksi semua pengelolaan
infrastruktur dan memungkinkan Anda berfokus pada membangun aplikasi, bukan
memikirkan overhead. Sebagai produk serverless Google, Cloud Run dapat
melakukan penskalaan hingga nol, yang berarti layanan ini tidak akan
menimbulkan biaya jika tidak digunakan. Cloud Run juga memungkinkan Anda
menggunakan paket biner kustom berbasis container, yang berarti sekarang Anda
dapat membangun artefak yang terisolasi dan konsisten.
Dalam lab ini, Anda akan membangun aplikasi web pengonversi PDF di Cloud Run
yang otomatis mengonversi file yang disimpan di Cloud Storage menjadi PDF yang
disimpan di folder terpisah.
Arsitektur
Diagram ini memberikan ringkasan terkait layanan yang akan Anda gunakan dan
bagaimana layanan tersebut terhubung satu sama lain:

Tujuan
Dalam lab ini, Anda akan mempelajari cara:
- Mengonversi aplikasi Node JS menjadi container.
- Membangun container dengan Google Cloud Build.
-
Membuat layanan Cloud Run yang mengonversi file menjadi file PDF di cloud.
- Menggunakan pemrosesan peristiwa dengan Cloud Storage
Prasyarat
Ini adalah lab tingkat menengah. Anda dianggap sudah familier
dengan Konsol Cloud dan lingkungan shell. Berpengalaman di bidang Firebase
akan sangat bermanfaat, tetapi tidak wajib. Sebelum mengikuti lab ini,
sebaiknya Anda telah menyelesaikan lab Google Skills berikut:
Setelah Anda siap, scroll ke bawah dan ikuti langkah berikut ini untuk
menyiapkan lingkungan lab Anda.
Penyiapan dan persyaratan
Sebelum mengklik tombol Start Lab
Baca petunjuk ini. Lab memiliki timer dan Anda tidak dapat menjedanya. Timer yang dimulai saat Anda mengklik Start Lab akan menampilkan durasi ketersediaan resource Google Cloud untuk Anda.
Lab interaktif ini dapat Anda gunakan untuk melakukan aktivitas lab di lingkungan cloud sungguhan, bukan di lingkungan demo atau simulasi. Untuk mengakses lab ini, Anda akan diberi kredensial baru yang bersifat sementara dan dapat digunakan untuk login serta mengakses Google Cloud selama durasi lab.
Untuk menyelesaikan lab ini, Anda memerlukan:
- Akses ke browser internet standar (disarankan browser Chrome).
Catatan: Gunakan jendela Samaran (direkomendasikan) atau browser pribadi untuk menjalankan lab ini. Hal ini akan mencegah konflik antara akun pribadi Anda dan akun siswa yang dapat menyebabkan tagihan ekstra pada akun pribadi Anda.
- Waktu untuk menyelesaikan lab. Ingat, setelah dimulai, lab tidak dapat dijeda.
Catatan: Hanya gunakan akun siswa untuk lab ini. Jika Anda menggunakan akun Google Cloud yang berbeda, Anda mungkin akan dikenai tagihan ke akun tersebut.
Cara memulai lab dan login ke Konsol Google Cloud
-
Klik tombol Start Lab. Jika Anda perlu membayar lab, dialog akan terbuka untuk memilih metode pembayaran.
Di sebelah kanan terdapat panel Lab setup and access yang berisi hal-hal berikut:
- Tombol Open Google Cloud console
- Kredensial sementara (nama pengguna dan sandi) yang harus Anda gunakan untuk lab ini
- Informasi lain, jika diperlukan, untuk menyelesaikan lab ini
Perhatikan bahwa timer lab terletak di dekat bagian atas halaman, yang menampilkan waktu yang tersisa.
-
Klik Open Google Cloud console (atau klik kanan dan pilih Open Link in Incognito Window jika Anda menjalankan browser Chrome).
Lab akan menjalankan resource, lalu membuka tab lain yang menampilkan halaman Sign in.
Tips: Atur tab di jendela terpisah secara berdampingan.
Catatan: Jika Anda melihat dialog Choose an account, klik Use Another Account.
-
Jika perlu, salin Username di bawah dan tempel ke dialog Sign in.
{{{user_0.username | "Username"}}}
Anda juga dapat menemukan Username di panel Lab setup and access.
-
Klik Next.
-
Salin Password di bawah dan tempel ke dialog Welcome.
{{{user_0.password | "Password"}}}
Anda juga dapat menemukan Password di panel Lab setup and access.
-
Klik Next.
Penting: Anda harus menggunakan kredensial yang diberikan lab. Jangan menggunakan kredensial akun Google Cloud Anda.
Catatan: Penggunaan akun Google Cloud sendiri untuk lab ini mungkin dikenai biaya tambahan.
-
Klik untuk melanjutkan ke halaman berikutnya:
- Setujui persyaratan dan ketentuan.
- Jangan tambahkan opsi pemulihan atau autentikasi 2 langkah (karena ini akun sementara).
- Jangan daftar uji coba gratis.
Setelah beberapa saat, Konsol Google Cloud akan terbuka di tab ini.
Catatan: Untuk mengakses produk dan layanan Google Cloud, klik Navigation menu atau ketik nama layanan atau produk di kolom Search.
Mengaktifkan Cloud Shell
Cloud Shell adalah mesin virtual yang dilengkapi dengan berbagai alat pengembangan. Mesin virtual ini menawarkan direktori beranda persisten berkapasitas 5 GB dan berjalan di Google Cloud. Cloud Shell menyediakan akses command-line untuk resource Google Cloud Anda.
-
Klik Activate Cloud Shell
di bagian atas Konsol Google Cloud.
-
Klik jendela berikut:
- Lanjutkan melalui jendela informasi Cloud Shell.
- Beri otorisasi ke Cloud Shell untuk menggunakan kredensial Anda guna melakukan panggilan Google Cloud API.
Setelah terhubung, Anda sudah diautentikasi, dan project ditetapkan ke Project_ID, . Output berisi baris yang mendeklarasikan Project_ID untuk sesi ini:
Project Cloud Platform Anda dalam sesi ini disetel ke {{{project_0.project_id | "PROJECT_ID"}}}
gcloud adalah alat command line untuk Google Cloud. Alat ini sudah terinstal di Cloud Shell dan mendukung pelengkapan command line.
- (Opsional) Anda dapat menampilkan daftar nama akun yang aktif dengan perintah ini:
gcloud auth list
- Klik Authorize.
Output:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
Untuk menetapkan akun aktif, jalankan:
$ gcloud config set account `ACCOUNT`
- (Opsional) Anda dapat menampilkan daftar ID project dengan perintah ini:
gcloud config list project
Output:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
Catatan: Untuk mendapatkan dokumentasi gcloud yang lengkap di Google Cloud, baca panduan ringkasan gcloud CLI.
Tugas 1. Memahami tugas
Pet Theory ingin mengonversi invoice mereka menjadi PDF agar dapat dibuka
pelanggan dengan mudah. Tim ingin konversi tersebut berjalan otomatis untuk
mengurangi beban kerja Lisa, manajer kantor mereka.
Ruby, konsultan komputer Pet Theory, menerima pesan dari Patrick di IT...
|
Patrick, Admin IT
|
Halo Ruby,
Setelah saya pelajari, tampaknya
LibreOffice
bagus untuk mengonversi banyak format file menjadi PDF.
Bisakah kita menjalankan LibreOffice di cloud tanpa harus mengelola
server?
Patrick
|
|
Ruby, Konsultan Software
|
Halo Patrick,
Saya sudah menemukan solusi untuk situasi ini.
Saya baru saja menonton video menarik di YouTube dari Next 19 tentang
Cloud Run. Sepertinya kita bisa menjalankan LibreOffice di lingkungan serverless
dengan Cloud Run. Kita tidak perlu memelihara server.
Saya akan mengirimkan beberapa referensi untuk membantu Anda memulai.
Ruby
|
Bantu Patrick menyiapkan dan men-deploy Cloud Run.
Tugas 2. Mengaktifkan Cloud Run API
-
Buka Navigation menu (
) dan klik APIs & Services >
Library. Di kotak penelusuran, ketik "Cloud Run" dan
pilih Cloud Run Admin API dari daftar hasil.
-
Klik Enable jika API belum diaktifkan, lalu klik tombol
kembali di browser dua kali. Konsol Anda akan terlihat seperti
berikut:

Tugas 3. Men-deploy layanan Cloud Run sederhana
Ruby telah mengembangkan prototipe Cloud Run dan ingin Patrick men-deploy-nya
di Google Cloud. Sekarang, bantu Patrick membuat layanan Cloud Run PDF untuk
Pet Theory.
-
Buka sesi Cloud Shell baru dan jalankan perintah berikut untuk meng-clone
repositori Pet Theory:
git clone https://github.com/rosera/pet-theory.git
- Kemudian, ubah direktori kerja saat ini menjadi lab03:
cd pet-theory/lab03
-
Edit
package.json dengan Editor Kode Cloud Shell atau editor
teks pilihan Anda. Di bagian "scripts", tambahkan
"start": "node index.js", seperti terlihat di bawah ini:
...
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
...
-
Sekarang, jalankan perintah berikut di Cloud Shell untuk menginstal paket
yang akan digunakan skrip konversi Anda:
npm install express
npm install body-parser
npm install child_process
npm install @google-cloud/storage
-
Selanjutnya, buka file
lab03/index.js dan tinjau kodenya.
Aplikasi akan di-deploy sebagai layanan Cloud Run yang menerima POST HTTP.
Jika permintaan POST adalah notifikasi Pub/Sub terkait file yang diupload,
layanan akan menuliskan detail file ke log. Jika bukan, layanan akan
menampilkan string "OK".
- Periksa file
lab03/Dockerfile.
File di atas disebut manifes dan berisi urutan langkah perintah Docker untuk
membangun image. Tiap baris dimulai dengan perintah yang memberi tahu Docker
cara memproses informasi berikut:
-
Baris pertama menunjukkan bahwa image dasar harus menggunakan node sebagai
template untuk image yang akan dibuat.
-
Baris terakhir menunjukkan perintah yang harus dijalankan, yang dalam contoh
ini disebut "npm start".
-
Untuk membangun dan men-deploy REST API, gunakan Google Cloud Build.
Jalankan perintah ini untuk memulai proses build:
gcloud builds submit \
--tag gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter
Perintah ini akan membangun container dengan kode Anda dan menempatkannya di
Artifact Registry project Anda.
-
Kembali ke Konsol Cloud, di Navigation menu (
), klik View all products. Di bagian
CI/CD, pilih Artifact Registry >
Repositories. Anda akan melihat container Anda telah
dihosting:
-
Buka repositori gcr.io. Anda akan melihat container Anda
telah dihosting:
Uji tugas yang sudah selesai
Klik Periksa progres saya untuk memastikan Anda telah
melakukan tugas di atas.
Membangun REST API sederhana
-
Kembali ke tab editor kode Anda dan jalankan perintah berikut di Cloud Shell
untuk men-deploy aplikasi Anda:
gcloud run deploy pdf-converter \
--image gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter \
--region {{{ project_0.default_region | Region }}} \
--no-allow-unauthenticated \
--max-instances=1
Setelah deployment selesai, Anda akan melihat pesan seperti ini:
Service [pdf-converter] revision [pdf-converter-00001] has been deployed and is serving 100 percent of traffic at https://pdf-converter-[hash].a.run.app
-
Buat variabel lingkungan
$SERVICE_URL untuk aplikasi ini agar
Anda dapat mengaksesnya dengan mudah:
SERVICE_URL=$(gcloud run services describe pdf-converter --region {{{ project_0.default_region | Lab Region }}} --format="value(status.url)")
echo $SERVICE_URL
Uji tugas yang sudah selesai
Klik Periksa progres saya untuk memastikan Anda telah
melakukan tugas di atas.
Membuat Revisi untuk Cloud Run
- Buat permintaan POST anonim ke layanan baru Anda:
curl -X POST $SERVICE_URL
Perintah ini akan menghasilkan pesan error
"Your client does not have permission to get the URL". Memang ini
yang dikehendaki. Kita tidak menginginkan layanan tersebut dapat dipanggil
oleh pengguna anonim.
-
Sekarang, cobalah memanggil layanan tersebut sebagai pengguna yang
berwenang:
curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
Jika mendapatkan respons "OK", Anda telah berhasil men-deploy
layanan Cloud Run. Selamat!
Tugas 4. Memicu layanan Cloud Run saat file baru diupload
Setelah layanan Cloud Run tersebut berhasil di-deploy, Ruby ingin Patrick
membuat area staging untuk data yang akan dikonversi. Bucket Cloud Storage
akan menggunakan pemicu peristiwa untuk memberi tahu aplikasi saat ada file
yang diupload dan perlu diproses.
-
Jalankan perintah berikut untuk membuat bucket di Cloud Storage untuk
dokumen yang diupload:
gcloud storage buckets create gs://$GOOGLE_CLOUD_PROJECT-upload
- Dan bucket lainnya untuk PDF hasil proses:
gcloud storage buckets create gs://$GOOGLE_CLOUD_PROJECT-processed
-
Sekarang, kembali ke tab Konsol Cloud, buka
Navigation menu, lalu pilih
Cloud Storage > Buckets. Verifikasi bahwa bucket telah
dibuat (akan ada bucket lain di sana, selain bucket yang digunakan oleh
platform.)
Uji tugas yang sudah selesai
Klik Periksa progres saya untuk memastikan Anda telah
melakukan tugas di atas.
Membuat dua bucket Cloud Storage
-
Di Cloud Shell, jalankan perintah berikut untuk memberi tahu Cloud Storage
agar mengirim notifikasi Pub/Sub tiap kali ada file baru yang selesai
diupload ke bucket dokumen:
gcloud storage buckets notifications create -t new-doc -f json -e OBJECT_FINALIZE gs://$GOOGLE_CLOUD_PROJECT-upload
Notifikasi ini akan diberi label dengan topik "new-doc".
Uji tugas yang sudah selesai
Klik Periksa progres saya untuk memastikan Anda telah
melakukan tugas di atas.
Membuat topik Pub/Sub untuk menangani notifikasi dari bucket Cloud Storage
-
Kemudian, buat akun layanan baru yang akan digunakan Pub/Sub untuk memicu
layanan Cloud Run:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"
- Beri akun layanan ini izin untuk memanggil layanan pengonversi PDF:
gcloud run services add-iam-policy-binding pdf-converter --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{ project_0.default_region | Lab Region }}}
- Temukan nomor project Anda dengan menjalankan perintah berikut:
gcloud projects list
Cari project yang namanya diawali dengan "qwiklabs-gcp-". Anda akan
menggunakan nilai Nomor Project di perintah berikutnya.
-
Buat variabel lingkungan
PROJECT_NUMBER, dengan mengganti
[project number] dengan Nomor Project dari perintah terakhir:
PROJECT_NUMBER=[project number]
-
Aktifkan Cloud Pub/Sub API dengan menjalankan perintah ini:
gcloud services enable pubsub.googleapis.com --project={{{ project_0.project_id | Project }}}
-
Kemudian, aktifkan project Anda untuk membuat token autentikasi Cloud
Pub/Sub:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
-
Terakhir, buat langganan Pub/Sub sehingga pengonversi PDF dapat berjalan
tiap kali ada pesan yang dipublikasikan di topik "new-doc".
gcloud beta pubsub subscriptions create pdf-conv-sub --topic new-doc --push-endpoint=$SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
Uji tugas yang sudah selesai
Klik Periksa progres saya untuk memastikan Anda telah
melakukan tugas di atas.
Membuat langganan Pub/Sub
Tugas 5. Melihat apakah layanan Cloud Run dipicu saat file diupload ke Cloud
Storage
Untuk memverifikasi bahwa aplikasi mereka berfungsi sesuai harapan, Ruby
meminta Patrick mengupload beberapa data percobaan ke bucket penyimpanan yang
dimaksud dan kemudian memeriksa Cloud Logging.
- Salin beberapa file pengujian ke bucket upload:
gcloud storage -m cp gs://spls/gsp644/* gs://$GOOGLE_CLOUD_PROJECT-upload
-
Setelah proses upload selesai, kembali ke tab Konsol Cloud, buka
Navigation menu, lalu klik
VIEW ALL PRODUCTS. Pilih Logging di
bagian Observability.
-
Di dropdown All resources, filter hasil ke
Cloud Run Revision, lalu klik Apply.
Kemudian, klik Run Query.
-
Di Query results, temukan entri log yang diawali dengan
file: dan klik entri tersebut. Kumpulan data file yang
dikirim Pub/Sub ke layanan Cloud Run saat file baru diupload akan
ditampilkan.
-
Dapatkah Anda menemukan nama file yang Anda upload di objek ini?

Catatan:
Jika entri log yang diawali dengan "file" tidak terlihat, coba klik tombol "load newer logs" di dekat bagian bawah halaman.
-
Sekarang, kembali ke tab editor kode dan jalankan perintah berikut di Cloud
Shell untuk membersihkan direktori
upload dengan menghapus file
yang ada di dalamnya:
gcloud storage -m rm gs://$GOOGLE_CLOUD_PROJECT-upload/*
Tugas 6. Container
Patrick perlu mengonversi tumpukan invoice menjadi PDF agar pelanggan dapat
membukanya. Ia mengirim email kepada Ruby untuk meminta bantuan...
|
Patrick, Admin IT
|
Halo Ruby
Sesuai temuan Anda, saya rasa kita bisa mengotomatiskan proses ini,
sekaligus beralih ke penggunaan PDF sebagai format invoice.
Kemarin saya sempat meluangkan waktu menulis kode dan membuat skrip
Node.js untuk keperluan tersebut. Bisakah Anda memeriksanya?
Patrick
|
Patrick mengirimi Ruby fragmen kode yang ia tulis untuk menghasilkan PDF dari
file:
const {promisify} = require('util');
const exec = promisify(require('child_process').exec);
const cmd = 'libreoffice --headless --convert-to pdf --outdir ' +
`/tmp "/tmp/${fileName}"`;
const { stdout, stderr } = await exec(cmd);
if (stderr) {
throw stderr;
}
Ruby membalas pesan Patrick...
|
Ruby, Konsultan Software
|
Halo Patrick
Cloud Run menggunakan container, jadi kita perlu menyediakan aplikasi
dalam format ini. Untuk langkah selanjutnya, kita perlu membuat
manifes Dockerfile
untuk aplikasi itu.
Kode Anda menggunakan LibreOffice. Bisakah Anda mengirimi saya perintah
untuk menginstal software tersebut? Saya perlu menyertakannya dalam
container.
Ruby
|
|
Patrick, Admin IT
|
Halo Ruby
Bagus. Biasanya saya menginstal LibreOffice pada server di kantor dengan
perintah ini:
apt-get update -y && apt-get install -y libreoffice
&& apt-get clean
Beri tahu saya jika perlu informasi lainnya.
Patrick
|
Untuk membangun container, sejumlah komponen harus berintegrasi:
Mengupdate Manifes
Setelah semua file diidentifikasi, manifes dapat dibuat. Bantu Ruby menyiapkan
dan men-deploy container.
Paket untuk LibreOffice sebelumnya tidak disertakan dalam container, yang
berarti paket tersebut sekarang harus ditambahkan. Ruby sudah menerima
perintah yang digunakan Patrick untuk membangun aplikasi dan akan
menambahkannya sebagai perintah RUN dalam Dockerfile.
Men-deploy layanan pdf-conversion versi baru
-
Buka file index.js dan tambahkan persyaratan paket berikut di
bagian atas file:
const {promisify} = require('util');
const {Storage} = require('@google-cloud/storage');
const exec = promisify(require('child_process').exec);
const storage = new Storage();
-
Ganti app.post('/', async (req, res) dengan
kode berikut:
app.post('/', async (req, res) => {
try {
const file = decodeBase64Json(req.body.message.data);
await downloadFile(file.bucket, file.name);
const pdfFileName = await convertFile(file.name);
await uploadFile(process.env.PDF_BUCKET, pdfFileName);
await deleteFile(file.bucket, file.name);
}
catch (ex) {
console.log(`Error: ${ex}`);
}
res.set('Content-Type', 'text/plain');
res.send('\n\nOK\n\n');
})
-
Sekarang, tambahkan kode berikut, yang akan memproses dokumen LibreOffice,
ke bagian bawah file:
// Helper function to check file existence (using fs.promises for async)
async function fileExists(filePath) {
try {
await fs.promises.access(filePath); // Throws an error if the file doesn't exist
return true;
} catch (err) {
return false;
}
}
async function downloadFile(bucketName, fileName) {
// 1. Check if the file exists
const fileExistsLocally = await fileExists(`/tmp/${fileName}`);
// 2. Delete if present
if (fileExistsLocally) {
console.log(`File exists locally. Deleting: ${fileName}`);
await fs.promises.unlink(`/tmp/${fileName}`); // Use fs.promises for async file operations
console.log(`File deleted.`);
} else {
console.log(`File does not exist locally: ${fileName}`);
}
// 3. Download from the storage bucket
const options = { destination: `/tmp/${fileName}` };
await storage.bucket(bucketName).file(fileName).download(options);
console.log(`File downloaded: ${fileName}`);
}
async function convertFile(fileName) {
const cmd = 'libreoffice --headless --convert-to pdf --outdir /tmp ' +
`"/tmp/${fileName}"`;
console.log(cmd);
const { stdout, stderr } = await exec(cmd);
if (stderr) {
throw stderr;
}
console.log(stdout);
pdfFileName = fileName.replace(/\.\w+$/, '.pdf');
return pdfFileName;
}
async function deleteFile(bucketName, fileName) {
await storage.bucket(bucketName).file(fileName).delete();
}
async function uploadFile(bucketName, fileName) {
await storage.bucket(bucketName).upload(`/tmp/${fileName}`);
}
-
Pastikan file index.js Anda terlihat seperti berikut:
Catatan:
Untuk menghindari error format, sebaiknya ganti semua kode dalam file index.js Anda dengan kode contoh ini.
const {promisify} = require('util');
const {Storage} = require('@google-cloud/storage');
const exec = promisify(require('child_process').exec);
const storage = new Storage();
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log('Listening on port', port);
});
app.post('/', async (req, res) => {
try {
const file = decodeBase64Json(req.body.message.data);
await downloadFile(file.bucket, file.name);
const pdfFileName = await convertFile(file.name);
await uploadFile(process.env.PDF_BUCKET, pdfFileName);
await deleteFile(file.bucket, file.name);
}
catch (ex) {
console.log(`Error: ${ex}`);
}
res.set('Content-Type', 'text/plain');
res.send('\n\nOK\n\n');
})
function decodeBase64Json(data) {
return JSON.parse(Buffer.from(data, 'base64').toString());
}
// Helper function to check file existence (using fs.promises for async)
async function fileExists(filePath) {
try {
await fs.promises.access(filePath); // Throws an error if the file doesn't exist
return true;
} catch (err) {
return false;
}
}
async function downloadFile(bucketName, fileName) {
// 1. Check if the file exists
const fileExistsLocally = await fileExists(`/tmp/${fileName}`);
// 2. Delete if present
if (fileExistsLocally) {
console.log(`File exists locally. Deleting: ${fileName}`);
await fs.promises.unlink(`/tmp/${fileName}`); // Use fs.promises for async file operations
console.log(`File deleted.`);
} else {
console.log(`File does not exist locally: ${fileName}`);
}
// 3. Download from the storage bucket
const options = { destination: `/tmp/${fileName}` };
await storage.bucket(bucketName).file(fileName).download(options);
console.log(`File downloaded: ${fileName}`);
}
async function convertFile(fileName) {
const cmd = 'libreoffice --headless --convert-to pdf --outdir /tmp ' +
`"/tmp/${fileName}"`;
console.log(cmd);
const { stdout, stderr } = await exec(cmd);
if (stderr) {
console.log(`Conversion Failed: ${stderr}`);
throw stderr;
}
console.log(`Conversion Success: ${stdout}`);
pdfFileName = fileName.replace(/\.\w+$/, '.pdf');
return pdfFileName;
}
async function deleteFile(bucketName, fileName) {
await storage.bucket(bucketName).file(fileName).delete();
}
async function uploadFile(bucketName, fileName) {
await storage.bucket(bucketName).upload(`/tmp/${fileName}`);
}
Tiap kali ada file yang diupload, layanan ini akan dipicu. Layanan menjalankan
tugas berikut, satu tugas per baris perintah di atas:
- Mengekstrak detail file dari notifikasi Pub/Sub.
-
Mendownload file dari Cloud Storage ke hard drive lokal. Ini sebenarnya
bukan disk fisik, melainkan bagian dari memori virtual yang berperilaku
seperti disk.
- Mengonversi file yang sudah didownload menjadi PDF.
-
Mengupload file PDF ke Cloud Storage. Variabel lingkungan
process.env.PDF_BUCKET berisi nama bucket Cloud Storage tempat
menuliskan PDF. Anda akan menetapkan nilai ke variabel ini saat men-deploy
layanan di bawah.
- Menghapus file asli dari Cloud Storage.
Isi file index.js sisanya mengimplementasikan fungsi yang
dipanggil oleh kode tingkat atas ini.
Sekarang, saatnya men-deploy layanan dan menetapkan variabel lingkungan
PDF_BUCKET. Ada baiknya juga Anda mengalokasi 2 GB RAM untuk
digunakan LibreOffice (lihat baris dengan opsi --memory).
-
Jalankan perintah berikut untuk membangun container:
gcloud builds submit \
--tag gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter
Catatan:
Ketik Y jika Anda menerima pop-up untuk mengaktifkan Cloud Build API
Uji tugas yang sudah selesai
Klik Periksa progres saya untuk memastikan Anda telah
melakukan tugas di atas.
Membuat build lain untuk REST API
-
Sekarang, deploy versi terakhir aplikasi Anda:
gcloud run deploy pdf-converter \
--image gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter \
--region {{{ project_0.default_region | Lab Region }}} \
--memory=2Gi \
--no-allow-unauthenticated \
--max-instances=1 \
--set-env-vars PDF_BUCKET=$GOOGLE_CLOUD_PROJECT-processed
Setelah LibreOffice menjadi bagian container, deployment build ini akan
memerlukan waktu lebih lama daripada build sebelumnya. Manfaatkan untuk
berdiri dan meregangkan otot selama beberapa menit.
Klik Check my progress untuk memverifikasi tujuan.
Membuat Revisi baru
Tugas 7. Menguji layanan pdf-conversion
-
Begitu perintah deployment selesai, pastikan layanan di-deploy dengan
benar dengan menjalankan:
curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
-
Jika mendapatkan respons "OK", Anda berhasil men-deploy
layanan Cloud Run yang telah diupdate. LibreOffice dapat mengonversi
banyak jenis file menjadi PDF: DOCX, XLSX, JPG, PNG, GIF, dll.
-
Buat skrip untuk melakukan upload
cat <<'EOF' > copy_files.sh
#!/bin/bash
SOURCE_BUCKET="gs://spls/gsp644"
DESTINATION_BUCKET="gs://${GOOGLE_CLOUD_PROJECT}-upload" # Replace with your actual bucket name
DELAY=5
# Get a list of files in the source bucket
files=$(gcloud storage ls "$SOURCE_BUCKET")
# Loop through the files
for file in $files; do
# Construct the full path of the source file
source_file_path="$file"
# Copy the file to the destination bucket
gcloud storage cp "$source_file_path" "$DESTINATION_BUCKET"
# Check if the copy was successful
if [ $? -eq 0 ]; then # $? is the exit status of the previous command
echo "Copied: $source_file_path to $DESTINATION_BUCKET"
else
echo "Failed to copy: $source_file_path"
fi
# Sleep for 5 seconds
sleep $DELAY
done
echo "All files copied!"
EOF
-
Jalankan perintah berikut untuk mengupload beberapa file contoh:
bash copy_files.sh
-
Kembali ke Konsol Cloud, buka Navigation menu, lalu pilih
Cloud Storage > Buckets. Buka bucket
-upload dan klik tombol Refresh beberapa
kali untuk melihat cara file dihapus, satu per satu, saat dikonversi
menjadi PDF.
-
Kemudian, klik Buckets dari menu kiri dan klik bucket
yang namanya diakhiri dengan "-processed". Bucket tersebut akan menampung
versi PDF dari semua file. Buka file-file PDF tersebut untuk memastikan
konversinya diproses dengan benar:
Catatan:
Jalankan kembali perintah jika Anda tidak melihat semua file PDF hasil konversi di bucket -processed.
Selamat!
Pet Theory sekarang memiliki sistem untuk mengonversi arsip file lama mereka
menjadi PDF. Cukup dengan mengupload file lama ke bucket "upload", layanan
pengonversi pdf akan mengonversi file tersebut dan menuliskannya ke bucket
"processed" sebagai PDF.
Lanjutkan perjalanan serverless Anda dalam kursus
Pengembangan Cloud Run Serverless. Anda akan membaca skenario bisnis fiktif dan membantu para karakter
menerapkan rencana migrasi serverless mereka.
Sertifikasi dan pelatihan Google Cloud
...membantu Anda mengoptimalkan teknologi Google Cloud. Kelas kami mencakup keterampilan teknis dan praktik terbaik untuk membantu Anda memahami dengan cepat dan melanjutkan proses pembelajaran. Kami menawarkan pelatihan tingkat dasar hingga lanjutan dengan opsi on demand, live, dan virtual untuk menyesuaikan dengan jadwal Anda yang sibuk. Sertifikasi membantu Anda memvalidasi dan membuktikan keterampilan serta keahlian Anda dalam teknologi Google Cloud.
Manual Terakhir Diperbarui pada 4 Februari 2026
Lab Terakhir Diuji pada 4 Februari 2026
Hak cipta 2026 Google LLC. Semua hak dilindungi undang-undang. Google dan logo Google adalah merek dagang dari Google LLC. Semua nama perusahaan dan produk lain mungkin adalah merek dagang masing-masing perusahaan yang bersangkutan.