GSP762

Ringkasan
Di lab ini, Anda akan membangun aplikasi web pengonversi PDF di Cloud Run, yang merupakan layanan serverless, yang otomatis mengonversi file yang disimpan di Google Drive ke PDF yang disimpan di folder Google Drive terpisah.
Tujuan
Dalam lab ini, Anda akan:
- Mengonversi aplikasi Go ke container
- Mempelajari cara membangun container dengan Google Cloud Build
- Membuat layanan Cloud Run yang mengonversi file menjadi file PDF di cloud.
- Memahami cara membuat Akun Layanan dan menambahkan izin
- Menggunakan pemrosesan peristiwa dengan Cloud Storage
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 Google Cloud Console
-
Klik tombol Start Lab. Jika Anda perlu membayar lab, dialog akan terbuka untuk memilih metode pembayaran.
Di sebelah kiri ada panel Lab Details yang berisi hal-hal berikut:
- Tombol Open Google Cloud console
- Waktu tersisa
- Kredensial sementara yang harus Anda gunakan untuk lab ini
- Informasi lain, jika diperlukan, untuk menyelesaikan lab ini
-
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 Details.
-
Klik Next.
-
Salin Password di bawah dan tempel ke dialog Welcome.
{{{user_0.password | "Password"}}}
Anda juga dapat menemukan Password di panel Lab Details.
-
Klik Next.
Penting: Anda harus menggunakan kredensial yang diberikan lab. Jangan menggunakan kredensial akun Google Cloud Anda.
Catatan: Menggunakan akun Google Cloud sendiri untuk lab ini dapat dikenai biaya tambahan.
-
Klik halaman berikutnya:
- Setujui persyaratan dan ketentuan.
- Jangan tambahkan opsi pemulihan atau autentikasi 2 langkah (karena ini akun sementara).
- Jangan mendaftar 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.
Microservice
Di lab ini, Anda akan membantu praktik Pet Theory Veterinary untuk mengonversi invoice mereka menjadi PDF secara otomatis, sehingga pelanggan dapat membukanya dengan andal.

Menggunakan Google API
Di lab ini, Anda akan menggunakan Google API. API berikut sudah diaktifkan untuk Anda:
Nama |
API |
Cloud Build |
cloudbuild.googleapis.com |
Cloud Storage |
storage-component.googleapis.com |
Cloud Run |
run.googleapis.com |
Tugas 1. Mendapatkan kode sumber
Mulailah dengan mendownload kode yang diperlukan untuk lab ini.
-
Aktifkan akun lab Anda:
gcloud auth list --filter=status:ACTIVE --format="value(account)"
-
Jalankan perintah berikut untuk membuat clone repositori Pet Theory:
git clone https://github.com/Deleplace/pet-theory.git
-
Pindah ke direktori yang benar:
cd pet-theory/lab03
Tugas 2. Membuat microservice invoice
Di bagian ini, Anda akan membuat aplikasi Go untuk memproses permintaan. Sebagaimana diuraikan dalam diagram arsitektur, Anda akan mengintegrasikan Cloud Storage sebagai bagian dari solusi.
-
Klik ikon Open Editor, lalu klik Open in a new window.
-
Buka pet-theory > lab03 > server.go
-
Buka kode sumber server.go
, lalu edit untuk dicocokkan dengan teks di bawah:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"regexp"
"strings"
)
func main() {
http.HandleFunc("/", process)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
log.Printf("Defaulting to port %s", port)
}
log.Printf("Listening on port %s", port)
err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil)
log.Fatal(err)
}
func process(w http.ResponseWriter, r *http.Request) {
log.Println("Serving request")
if r.Method == "GET" {
fmt.Fprintln(w, "Ready to process POST requests from Cloud Storage trigger")
return
}
//
// Read request body containing Cloud Storage object metadata
//
gcsInputFile, err1 := readBody(r)
if err1 != nil {
log.Printf("Error reading POST data: %v", err1)
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, "Problem with POST data: %v \n", err1)
return
}
//
// Working directory (concurrency-safe)
//
localDir, errDir := ioutil.TempDir("", "")
if errDir != nil {
log.Printf("Error creating local temp dir: %v", errDir)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Could not create a temp directory on server. \n")
return
}
defer os.RemoveAll(localDir)
//
// Download input file from Cloud Storage
//
localInputFile, err2 := download(gcsInputFile, localDir)
if err2 != nil {
log.Printf("Error downloading Cloud Storage file [%s] from bucket [%s]: %v",
gcsInputFile.Name, gcsInputFile.Bucket, err2)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error downloading Cloud Storage file [%s] from bucket [%s]",
gcsInputFile.Name, gcsInputFile.Bucket)
return
}
//
// Use LibreOffice to convert local input file to local PDF file.
//
localPDFFilePath, err3 := convertToPDF(localInputFile.Name(), localDir)
if err3 != nil {
log.Printf("Error converting to PDF: %v", err3)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error converting to PDF.")
return
}
//
// Upload the freshly generated PDF to Cloud Storage
//
targetBucket := os.Getenv("PDF_BUCKET")
err4 := upload(localPDFFilePath, targetBucket)
if err4 != nil {
log.Printf("Error uploading PDF file to bucket [%s]: %v", targetBucket, err4)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintf(w, "Error downloading Cloud Storage file [%s] from bucket [%s]",
gcsInputFile.Name, gcsInputFile.Bucket)
return
}
//
// Delete the original input file from Cloud Storage.
//
err5 := deleteGCSFile(gcsInputFile.Bucket, gcsInputFile.Name)
if err5 != nil {
log.Printf("Error deleting file [%s] from bucket [%s]: %v", gcsInputFile.Name,
gcsInputFile.Bucket, err5)
// This is not a blocking error.
// The PDF was successfully generated and uploaded.
}
log.Println("Successfully produced PDF")
fmt.Fprintln(w, "Successfully produced PDF")
}
func convertToPDF(localFilePath string, localDir string) (resultFilePath string, err error) {
log.Printf("Converting [%s] to PDF", localFilePath)
cmd := exec.Command("libreoffice", "--headless", "--convert-to", "pdf",
"--outdir", localDir,
localFilePath)
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
log.Println(cmd)
err = cmd.Run()
if err != nil {
return "", err
}
pdfFilePath := regexp.MustCompile(`\.\w+$`).ReplaceAllString(localFilePath, ".pdf")
if !strings.HasSuffix(pdfFilePath, ".pdf") {
pdfFilePath += ".pdf"
}
log.Printf("Converted %s to %s", localFilePath, pdfFilePath)
return pdfFilePath, nil
}
-
Sekarang, jalankan perintah berikut untuk membangun aplikasi:
go build -o server
Output yang Diharapkan:
go: downloading cloud.google.com/go/storage v1.6.0
go: downloading cloud.google.com/go v0.53.0
go: downloading github.com/googleapis/gax-go/v2 v2.0.5
go: downloading google.golang.org/api v0.18.0
go: downloading google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63
go: downloading google.golang.org/grpc v1.27.1
go: downloading go.opencensus.io v0.22.3
go: downloading golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
go: downloading github.com/golang/protobuf v1.3.3
go: downloading golang.org/x/net v0.0.0-20200222125558-5a598a2470a0
go: downloading github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
go: downloading golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae
go: downloading golang.org/x/text v0.3.2
Fungsi yang dipanggil oleh kode tingkat atas ini ada di file sumber:
- server.go
- notification.go
- gcs.go
Dengan aplikasi yang berhasil dibangun, Anda dapat membuat layanan konversi pdf.
Tugas 3. Membuat layanan konversi pdf
Layanan PDF akan menggunakan Cloud Run dan Cloud Storage untuk memulai proses setiap kali file diupload ke penyimpanan yang ditentukan.
Untuk mencapai hal ini, Anda akan menggunakan pola umum notifikasi peristiwa bersama dengan Cloud Pub/Sub. Tindakan ini akan memungkinkan aplikasi untuk berkonsentrasi hanya pada pemrosesan informasi. Pengiriman dan penyampaian informasi dilakukan oleh layanan lain, sehingga Anda dapat membuat aplikasi tetap sederhana.
Membangun modul invoice memerlukan integrasi dua komponen:

Paket LibreOffice ditambahkan agar dapat digunakan di aplikasi Anda.
-
Di Open editor, buka manifes Dockerfile
dan perbarui file seperti yang ditunjukkan di bawah ini:
FROM amd64/debian
RUN apt-get update -y \
&& apt-get install -y libreoffice \
&& apt-get clean
WORKDIR /usr/src/app
COPY server .
CMD [ "./server" ]
-
Simpan Dockerfile
yang sudah diperbarui.
-
Mulai bangun ulang image pdf-converter
dengan menggunakan Cloud Build:
gcloud builds submit \
--tag gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter
Klik Check my progress untuk memastikan Anda telah menjalankan tugas di atas.
Membangun image dengan Cloud Build
-
Deploy layanan pengonversi pdf yang diperbarui.
Catatan: Sebaiknya berikan LibreOffice RAM sebesar 2 GB untuk digunakan. Lihat baris yang terdapat opsi --memory
.
-
Jalankan perintah berikut untuk membangun container dan men-deploy-nya:
gcloud run deploy pdf-converter \
--image gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter \
--platform managed \
--region {{{ project_0.default_region | "REGION" }}} \
--memory=2Gi \
--no-allow-unauthenticated \
--set-env-vars PDF_BUCKET=$GOOGLE_CLOUD_PROJECT-processed \
--max-instances=3
Klik Check my progress untuk memastikan Anda telah menjalankan tugas di atas.
Layanan Pengonversi PDF sudah di-deploy
Layanan Cloud Run kini berhasil di-deploy. Namun, aplikasi yang di-deploy memerlukan izin yang benar untuk mengaksesnya.
Tugas 4. Membuat Akun Layanan
Akun Layanan adalah jenis akun khusus dengan akses ke Google API.
Di lab ini, gunakan Akun Layanan untuk mengakses Cloud Run saat peristiwa Cloud Storage diproses. Cloud Storage mendukung beragam notifikasi yang dapat digunakan untuk memicu peristiwa.
Berikutnya, update kode untuk memberi tahu aplikasi jika file sudah diupload.
-
Klik Navigation menu > Cloud Storage, dan pastikan kedua bucket telah dibuat. Anda akan melihat:
-
Buat notifikasi Pub/Sub untuk menunjukkan bahwa file baru telah diupload ke bucket dokumen ("uploaded"). Notifikasi ini akan diberi label dengan topik "new-doc".
gsutil notification create -t new-doc -f json -e OBJECT_FINALIZE gs://$GOOGLE_CLOUD_PROJECT-upload
Output yang Diharapkan:
Created Cloud Pub/Sub topic projects/{{{project_0.project_id | "PROJECT_ID"}}}/topics/new-doc
Created notification config projects/_/buckets/{{{project_0.project_id | "PROJECT_ID"}}}-upload/notificationConfigs/1
-
Buat akun layanan baru untuk memicu layanan Cloud Run:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"
Output yang Diharapkan:
Created service account [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 | "REGION" }}} \
--platform managed
Output yang Diharapkan:
Updated IAM policy for service [pdf-converter].
bindings:
- members:
- serviceAccount:pubsub-cloud-run-invoker@{{{project_0.project_id | "PROJECT_ID"}}}.iam.gserviceaccount.com
role: roles/run.invoker
etag: BwYYfbXS240=
version: 1
-
Temukan nomor project Anda dengan menjalankan perintah berikut:
PROJECT_NUMBER=$(gcloud projects list \
--format="value(PROJECT_NUMBER)" \
--filter="$GOOGLE_CLOUD_PROJECT")
-
Aktifkan project Anda untuk membuat token autentikasi Cloud Pub/Sub:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member=serviceAccount:{{{ project_0.project_id | "PROJECT_ID" }}}@{{{ project_0.project_id | "PROJECT_ID" }}}.iam.gserviceaccount.com \
--role=roles/iam.serviceAccountTokenCreator
Klik Check my progress untuk memastikan Anda telah menjalankan tugas di atas.
Akun Layanan dibuat
Akun Layanan yang sudah dibuat dapat digunakan untuk memanggil Layanan Cloud Run.
Tugas 5. Menguji layanan Cloud Run
Sebelum melanjutkan lebih jauh, uji layanan yang di-deploy. Ingatlah bahwa layanan ini memerlukan autentikasi, jadi ujilah untuk memastikan layanan tersebut benar-benar bersifat pribadi.
-
Simpan URL layanan Anda di variabel lingkungan $SERVICE_URL:
SERVICE_URL=$(gcloud run services describe pdf-converter \
--platform managed \
--region {{{ project_0.default_region | "REGION" }}} \
--format "value(status.url)")
-
Tampilkan URL LAYANAN:
echo $SERVICE_URL
-
Buat permintaan GET anonim ke layanan baru Anda:
curl -X GET $SERVICE_URL
Output yang Diharapkan:
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/</code> from this server.</h2>
<h2></h2>
CATATAN:
Permintaan GET anonim akan menghasilkan pesan error:
"Your client does not have permission to get URL"
.
Memang ini yang dikehendaki. Kita tidak menginginkan layanan tersebut dapat dipanggil oleh pengguna anonim.
-
Sekarang, cobalah memanggil layanan tersebut sebagai pengguna yang diizinkan:
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
Output yang Diharapkan:
Ready to process POST requests from Cloud Storage trigger
Bagus sekali, Anda telah berhasil men-deploy layanan Cloud Run yang diautentikasi.
Tugas 6. Pemicu Cloud Storage
Untuk memulai notifikasi saat konten baru diupload ke Cloud Storage, tambahkan langganan ke Topik Pub/Sub Anda yang ada.
Catatan: Notifikasi Cloud Storage otomatis akan mengirimkan pesan ke antrean Topik Anda saat konten baru diupload. Dengan menggunakan notifikasi, Anda dapat membuat aplikasi canggih yang merespons peristiwa tanpa perlu menulis kode tambahan.
Sekarang, setiap kali file diupload, langganan Pub/Sub akan berinteraksi dengan Akun Layanan Anda. Kemudian, Akun Layanan akan memulai layanan Cloud Run Pengonversi PDF.
Tugas 7. Menguji notifikasi Cloud Storage
Untuk menguji layanan Cloud Run, gunakan contoh file yang tersedia.
-
Salin file pengujian ke bucket upload:
gsutil -m cp -r gs://spls/gsp762/* gs://$GOOGLE_CLOUD_PROJECT-upload
Output yang Diharapkan:
Copying gs://spls/gsp762/cat-and-mouse.jpg [Content-Type=image/jpeg]...
Copying gs://spls/gsp762/file-sample_100kB.doc [Content-Type=application/msword]...
Copying gs://spls/gsp762/file-sample_500kB.docx [Content-Type=application/vnd.openxmlformats-officedocument.wordprocessingml.document]...
Copying gs://spls/gsp762/file_example_XLS_10.xls [Content-Type=application/vnd.ms-excel]...
Copying gs://spls/gsp762/file-sample_1MB.docx [Content-Type=application/vnd.openxmlformats-officedocument.wordprocessingml.document]...
Copying gs://spls/gsp762/file_example_XLSX_50.xlsx [Content-Type=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]...
Copying gs://spls/gsp762/file_example_XLS_100.xls [Content-Type=application/vnd.ms-excel]...
Copying gs://spls/gsp762/file_example_XLS_50.xls [Content-Type=application/vnd.ms-excel]...
Copying gs://spls/gsp762//Copy of cat-and-mouse.jpg [Content-Type=image/jpeg]...
-
Di Konsol Cloud, klik Cloud Storage > Buckets yang diikuti dengan nama bucket yang diakhiri dengan "-upload"
-
Klik tombol Refresh beberapa kali dan lihat cara file dihapus, satu per satu, saat dikonversi menjadi PDF.
-
Kemudian, klik Buckets, lalu klik bucket yang namanya diakhiri dengan "-processed". Bucket tersebut akan menampung versi PDF dari semua file.
CATATAN:
Diperlukan waktu beberapa menit untuk memproses file.
Gunakan opsi refresh Bucket untuk memeriksa status penyelesaian pemrosesan.
-
Silakan buka file PDF tersebut untuk memastikan konversinya diproses dengan benar.
-
Jika file sudah diupload, klik Navigation menu > Cloud Run, lalu klik layanan pdf-converter.
-
Pilih tab LOGS dan tambahkan filter "Converting" untuk melihat file yang dikonversi.
-
Buka Navigation menu > Cloud Storage, lalu buka nama bucket yang namanya diakhiri dengan "-upload" untuk mengonfirmasi bahwa semua file yang diupload sudah diproses.
Bagus, Anda berhasil membangun layanan baru untuk membuat PDF menggunakan file yang telah diupload ke Cloud Storage.
Selamat!
Di lab ini, Anda telah mempelajari cara mengonversi aplikasi Go menjadi container, mempelajari cara membuat container dengan menggunakan Google Cloud Build, dan meluncurkan layanan Cloud Run.
Anda juga mendapat keterampilan dalam mengaktifkan izin melalui Akun Layanan dan memanfaatkan pemrosesan peristiwa Cloud Storage, yang semuanya merupakan bagian dari pengoperasian layanan pengonversi pdf yang mengubah dokumen menjadi PDF dan menyimpannya dalam bucket "processed".
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 15 Mei 2024
Lab Terakhir Diuji pada 15 Mei 2024
Hak cipta 2025 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.