Tutorial ini membahas cara membuat aplikasi dua layanan aman yang berjalan di Cloud Run. Aplikasi ini adalah editor Markdown mencakup layanan "frontend" publik yang dapat digunakan siapa pun untuk menulis teks markdown, dan layanan "backend" pribadi yang merender teks Markdown ke HTML.
Layanan backend bersifat pribadi menggunakan bawaan Cloud Run, fitur autentikasi layanan-ke-layanan berbasis IAM Cloud Run, yang membatasi siapa yang dapat memanggil layanan. Kedua layanan dibuat dengan prinsip hak istimewa terendah, tanpa akses ke Google Cloud lainnya kecuali jika diperlukan.
Batasan atau bukan sasaran dari tutorial ini
Tutorial ini tidak menunjukkan autentikasi pengguna akhir, yang menggunakan Identity Platform atau Firebase Authentication untuk membuat token ID pengguna dan memverifikasi identitas pengguna secara manual. Untuk mempelajari autentikasi pengguna akhir lebih lanjut, lihat tutorial Cloud Run untuk autentikasi pengguna akhir.
Tutorial ini tidak menunjukkan penggabungan metode autentikasi berbasis IAM dan token ID karena metode ini tidak didukung.
Tujuan
- Buat akun layanan khusus dengan izin minimal untuk autentikasi layanan ke layanan dan akses layanan keseluruh Google Cloud.
- Menulis, membangun, dan men-deploy dua layanan ke Cloud Run yang berinteraksi.
- Buat permintaan antara layanan Cloud Run publik dan pribadi.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Aktifkan API Cloud Run.
- Instal dan lakukan inisialisasi gcloud CLI.
- Instal curl untuk mencoba layanan
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:
-
Editor Cloud Build (
roles/cloudbuild.builds.editor
) -
Admin Cloud Run (
roles/run.admin
) -
Membuat Akun Layanan (
roles/iam.serviceAccountCreator
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
) [Konsumen Penggunaan Layanan] -
Admin Penyimpanan (
roles/storage.admin
)
Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
Menyiapkan default gcloud
Untuk mengonfigurasi gcloud dengan setelan default untuk layanan Cloud Run Anda:
Setel project default Anda:
gcloud config set project PROJECT_ID
Ganti PROJECT_ID dengan nama project yang Anda buat untuk tutorial ini.
Konfigurasi gcloud untuk region yang Anda pilih:
gcloud config set run/region REGION
Ganti REGION dengan region Cloud Run pilihan Anda yang didukung.
Lokasi Cloud Run
Cloud Run bersifat regional, berarti infrastruktur yang
menjalankan layanan Cloud Run Anda terletak di region tertentu dan
dikelola oleh Google agar tersedia secara redundan di
semua zona dalam region tersebut.
Memenuhi persyaratan latensi, ketersediaan, atau ketahanan adalah faktor utama
untuk memilih region tempat layanan Cloud Run dijalankan.
Pada umumnya, Anda dapat memilih region yang paling dekat dengan pengguna Anda, tetapi Anda harus mempertimbangkan
lokasi dari produk Google Cloud
lain yang digunakan oleh layanan Cloud Run Anda.
Menggunakan produk Google Cloud secara bersamaan di beberapa lokasi dapat memengaruhi
latensi serta biaya layanan Anda.
Cloud Run tersedia di region berikut:
Tergantung harga Tingkat 1
asia-east1
(Taiwan)asia-northeast1
(Tokyo)asia-northeast2
(Osaka)europe-north1
(Finlandia) CO2 Rendaheurope-southwest1
(Madrid)europe-west1
(Belgia) CO2 Rendaheurope-west4
(Belanda)europe-west8
(Milan)europe-west9
(Paris) CO2 Rendahme-west1
(Tel Aviv)us-central1
(Iowa) CO2 rendahus-east1
(South Carolina)us-east4
(North Virginia)us-east5
(Columbus)us-south1
(Dallas)us-west1
(Oregon) CO2 Rendah
Tergantung harga Tingkat 2
africa-south1
(Johannesburg)asia-east2
(Hong Kong)asia-northeast3
(Seoul, Korea Selatan)asia-southeast1
(Singapura)asia-southeast2
(Jakarta)asia-south1
(Mumbai, India)asia-south2
(Delhi, India)australia-southeast1
(Sydney)australia-southeast2
(Melbourne)europe-central2
(Warsawa, Polandia)europe-west10
(Berlin)europe-west12
(Turin)europe-west2
(London, Inggris Raya) CO2 Rendaheurope-west3
(Frankfurt, Jerman) CO2 Rendaheurope-west6
(Zurich, Swiss) CO2 Rendahme-central1
(Doha)me-central2
(Damam)northamerica-northeast1
(Montreal) CO2 Rendahnorthamerica-northeast2
(Toronto) CO2 Rendahsouthamerica-east1
(Sao Paulo, Brasil) CO2 Rendahsouthamerica-west1
(Santiago, Cile) CO2 Rendahus-west2
(Los Angeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Jika sudah membuat layanan Cloud Run, Anda dapat melihat region di dasbor Cloud Run di Konsol Google Cloud.
Mengambil contoh kode
Untuk mengambil contoh kode agar dapat digunakan:
Clone repositori aplikasi contoh tersebut ke Cloud Shel atau mesin lokal Anda:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.
Ubah ke direktori yang memuat kode contoh Cloud Run:
Node.js
cd nodejs-docs-samples/run/markdown-preview/
Python
cd python-docs-samples/run/markdown-preview/
Go
cd golang-samples/run/markdown-preview/
Java
cd java-docs-samples/run/markdown-preview/
C#
cd dotnet-docs-samples/run/markdown-preview/
Meninjau layanan rendering Markdown pribadi
Dari perspektif frontend, ada spesifikasi API sederhana untuk layanan Markdown:
- Satu endpoint di
/
- Mengharapkan permintaan POST
- Isi permintaan POST adalah teks Markdown
Anda mungkin ingin meninjau semua kode untuk menemukan masalah keamanan atau hanya
mempelajarinya lebih lanjut dengan menjelajahi ./renderer/
direktori Perhatikan bahwa
tutorial tidak menjelaskan kode transformasi Markdown.
Mengirimkan layanan rendering Markdown pribadi
Untuk mengirimkan kode Anda, bangun dengan Cloud Build, upload ke Container Registry, dan deploy ke Cloud Run:
Ubah ke direktori
renderer
:Node.js
cd renderer/
Python
cd renderer/
Go
cd renderer/
Java
cd renderer/
C#
cd Samples.Run.MarkdownPreview.Renderer/
Jalankan perintah tersebut untuk mem-build container dan publikasikan di Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/renderer
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
renderer
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/renderer
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
renderer
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/renderer
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
renderer
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Java
Contoh ini menggunakan Jib untuk mem-build image Docker menggunakan alat Java umum. Jib mengoptimalkan build container tanpa memerlukan Dockerfile atau menginstal Docker. Pelajari lebih lanjut cara mem-build container Java dengan Jib.
Gunakan bantuan kredensial gcloud untuk memberi otorisasi Docker agar dikirim ke Container Registry Anda.
gcloud auth configure-docker
Gunakan Plugin Maven Jib untuk mem-build dan mengirim container ke Container Registry.
mvn compile jib:build -Dimage=gcr.io/PROJECT_ID/renderer
Dengan PROJECT_ID sebagai project ID Google Cloud Anda dan
renderer
merupakan nama yang ingin Anda berikan pada layanan Anda.Setelah berhasil, Anda akan melihat pesan BUILD SUCCESS. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
C#
gcloud builds submit --tag gcr.io/PROJECT_ID/renderer
Dengan PROJECT_ID sebagai project ID Google Cloud Anda dan
renderer
merupakan nama yang ingin Anda berikan pada layanan Anda.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Deploy sebagai layanan pribadi dengan akses terbatas.
Cloud Run menyediakan fitur kontrol akses dan layanan identitas siap pakai. Kontrol akses menyediakan lapisan autentikasi yang membatasi pengguna dan layanan lainnya agar tidak memanggil layanan. Identitas layanan memungkinkan pembatasan layanan Anda agar tidak mengakses resource Google Cloud lainnya dengan membuat akun layanan khusus dengan izin terbatas.
Buat akun layanan untuk digunakan sebagai "identitas compute" dari layanan render. Secara default, opsi ini tidak memiliki hak istimewa selain keanggotaan project.
Command line
gcloud iam service-accounts create renderer-identity
Terraform
Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.
Markdown layanan rendering tidak terintegrasi langsung dengan hal lainnya di Google Cloud. Aplikasi ini tidak memerlukan izin lebih lanjut.
Deploy dengan
renderer-identity
akun layanan dan tolak akses yang tidak diautentikasi.Command line
gcloud run deploy renderer \ --image gcr.io/PROJECT_ID/renderer \ --service-account renderer-identity \ --no-allow-unauthenticated
Cloud Run dapat menggunakan nama akun layanan dalam format pendek bukan alamat email lengkap jika akun layanan merupakan bagian dari project yang sama.
Terraform
Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.
Mencoba layanan rendering Markdown pribadi
Layanan pribadi tidak dapat dimuat langsung oleh browser web. Sebagai gantinya, gunakan curl
atau alat CLI permintaan HTTP yang memungkinkan injeksi Authorization
header.
Untuk mengirim beberapa teks tebal ke layanan dan melihatnya mengubah markdown asterisks menjadi
tag <strong>
HTML:
Mendapatkan URL dari output deployment.
Gunakan
gcloud
untuk mendapatkan token identitas khusus pengembangan hanya untuk autentikasi:TOKEN=$(gcloud auth print-identity-token)
Buat permintaan curl yang meneruskan teks Markdown mentah sebagai parameter string kueri yang akan menjadi URL:
curl -H "Authorization: Bearer $TOKEN" \ -H 'Content-Type: text/plain' \ -d '**Hello Bold Text**' \ SERVICE_URL
Responsnya harus berupa cuplikan HTML:
<strong>Hello Bold Text</strong>
Meninjau integrasi antara layanan editor dan rendering
Layanan editor menyediakan UI entri teks yang sederhana dan ruang untuk melihat pratinjau
HTML. Sebelum melanjutkan, tinjau kode yang diambil sebelumnya dengan membuka
direktori ./editor/
.
Selanjutnya, pelajari beberapa bagian kode berikut yang mengintegrasikan kedua layanan tersebut dengan aman.
Node.js
Modul render.js
membuat permintaan terautentikasi ke layanan renderer
pribadi. Ini menggunakan layanan etaata Google Cloud pada
lingkungan Cloud Run untuk membuat token identitas dan menambahkannya
pada permintaan HTTP sebagai bagian dari Authorization
header.
Di lingkungan lain, render.js
menggunakan Kredensial Default Aplikasi untuk meminta token dari server Google.
Mengurai markdown dari JSON dan mengirimkannya ke layanan Renderer untuk diubah menjadi HTML.
Python
Metode new_request
membuat permintaan yang diautentikasi ke layanan pribadi.
ID ini menggunakan server metadata Google Cloud di lingkungan
Cloud Run untuk membuat token identitas dan menambahkannya ke permintaan HTTP
sebagai bagian dari Authorization
header.
Di lingkungan lain, new_request
permintaan token identitas dari server
google menggunakan autentikasi dengan Kredensial Default Aplikasi.
Mengurai markdown dari JSON dan mengirimkannya ke layanan Renderer untuk diubah menjadi HTML.
Go
RenderService
membuat permintaan yang diautentikasi ke layanan pribadi. ID ini menggunakan server metadata Google Cloud di lingkungan
Cloud Run untuk membuat token identitas dan menambahkannya ke permintaan HTTP
sebagai bagian dari Authorization
header.
Di lingkungan lain, RenderService
permintaan token identitas dari server
google menggunakan autentikasi dengan Kredensial Default Aplikasi.
Permintaan dikirim ke Layanan Renderer setelah menambahkan teks markdown untuk ditransformasikan ke dalam HTML. Kesalahan respons ditangani untuk membedakan masalah komunikasi dari fungsi rendering.
Java
makeAuthenticatedRequest
membuat permintaan yang diautentikasi ke layanan pribadi. Ini menggunakan layanan metadata Google Cloud pada
lingkungan Cloud Run untuk membuat token identitas dan menambahkannya
pada permintaan HTTP sebagai bagian dari Authorization
header.
Di lingkungan lain, makeAuthenticatedRequest
permintaan token identitas dari server
google menggunakan autentikasi dengan Kredensial Default Aplikasi.
Mengurai markdown dari JSON dan mengirimkannya ke layanan Renderer untuk diubah menjadi HTML.
C#
GetAuthenticatedPostResponse
membuat permintaan yang diautentikasi ke layanan pribadi. Ini menggunakan layanan metadata Google Cloud pada
lingkungan Cloud Run untuk membuat token identitas dan menambahkannya
pada permintaan HTTP sebagai bagian dari Authorization
header.
Di lingkungan lain, GetAuthenticatedPostResponse
permintaan token identitas dari server
google menggunakan autentikasi dengan Kredensial Default Aplikasi.
Mengurai markdown dari JSON dan mengirimkannya ke layanan Renderer untuk diubah menjadi HTML.
Mengirim layanan editor publik
Untuk mem-build dan men-deploy kode Anda:
Ubah ke direktori
editor
:Node.js
cd ../editor
Python
cd ../editor
Go
cd ../editor
Java
cd ../editor
C#
cd ../Samples.Run.MarkdownPreview.Editor/
Jalankan perintah tersebut untuk mem-build container dan publikasikan di Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/editor
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
editor
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/editor
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
editor
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/editor
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
editor
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Java
Contoh ini menggunakan Jib untuk mem-build image Docker menggunakan alat Java umum. Jib mengoptimalkan build container tanpa memerlukan Dockerfile atau menginstal Docker. Pelajari lebih lanjut cara mem-build container Java dengan Jib.mvn compile jib:build -Dimage=gcr.io/PROJECT_ID/editor
Dengan PROJECT_ID sebagai project ID Google Cloud Anda dan
editor
merupakan nama yang ingin Anda berikan pada layanan Anda.Setelah berhasil, Anda akan melihat pesan BUILD SUCCESS. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
C#
gcloud builds submit --tag gcr.io/PROJECT_ID/editor
Dengan PROJECT_ID sebagai project ID Google Cloud Anda dan
editor
merupakan nama yang ingin Anda berikan pada layanan Anda.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Deploy sebagai layanan pribadi dengan akses khusus ke layanan rendering.
Buat akun layanan untuk digunakan sebagai "identitas compute" dari layanan render. Secara default, opsi ini tidak memiliki hak istimewa selain keanggotaan project.
Command line
gcloud iam service-accounts create editor-identity
Terraform
Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.
Layanan Editor tidak perlu berinteraksi dengan hal lain di Google Cloud selain layanan rendering Markdown.
Memberikan akses ke identitas komputasi
editor-identity
untuk memanggil layanan rendering Markdown. Setiap layanan yang menggunakan identitas ini sebagai identitas komputasi akan memiliki hak istimewa ini.Command line
gcloud run services add-iam-policy-binding renderer \ --member serviceAccount:editor-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/run.invoker
Terraform
Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.
Karena ini diberi perab invoker dalam konteks layanan render, layanan render adalah satu-satunya layanan Cloud Run pribadi yang dapat dipanggil editor.
Deploy dengan akun layanan
editor-identity
dan izinkan akses publik yang tidak diautentikasi.Command line
gcloud run deploy editor --image gcr.io/PROJECT_ID/editor \ --service-account editor-identity \ --set-env-vars EDITOR_UPSTREAM_RENDER_URL=RENDERER_SERVICE_URL \ --allow-unauthenticated
Ganti,
- PROJECT_ID dengan project ID Anda
- RENDERER_SERVICE_URL dengan URL yang diberikan setelah men-deploy layanan rendering Markdown.
Terraform
Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.
Deploy layanan editor:
Memberikan
allUsers
izin untuk memanggil layanan:
Memahami traffic HTTPS
Ada tiga permintaan HTTP yang terlibat dalam rendering markdown menggunakan layanna ini.
Melakukan Percobaan
Untuk mencoba aplikasi dua layanan yang selesai:
Buka browser Anda ke URL yang disediakan pada langkah deployment di atas.
Cobalah edit teks Markdown di sebelah kiri lalu klik tombol untuk melihat pratinjaunya di sebelah kanan.
Kodenya akan terlihat seperti berikut:
Jika Anda memilih untuk terus mengembangkan layanan ini, perlu diingat bahwa layanan tersebut telah membatasi akses Identity and Access Management (IAM) ke bagian lain Google Cloud dan perlu diberi peran IAM tambahan untuk mengakses banyak layanan lainnya.
Pembersihan
Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan ingin mempertahankannya tanpa ada perubahan yang ditambahkan dalam tutorial ini, hapus resource yang dibuat untuk tutorial.
Menghapus project
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
Untuk menghapus project:
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Menghapus resource tutorial
Hapus layanan Cloud Run yang telah Anda deploy dalam tutorial ini:
Command line
gcloud run services delete editor gcloud run services delete renderer
Anda juga dapat menghapus layanan Cloud Run dari Konsol Google Cloud.
Hapus konfigurasi default gcloud yang Anda tambahkan selama penyiapan tutorial.
gcloud config unset run/region
Hapus konfigurasi project:
gcloud config unset project
Hapus resource Google Cloud lain yang dibuat dalam tutorial ini:
- Hapus image container editor yang dinobatkan
gcr.io/PROJECT_ID/editor
dari Container Registry - Hapus image container render yang dinobatkan
gcr.io/PROJECT_ID/renderer
dari Container Registry - Hapus akun layanan editor
editor-identity@PROJECT_ID.iam.gserviceaccount.com
- Hapus akun layanan render
renderer-identity@PROJECT_ID.iam.gserviceaccount.com
- Hapus image container editor yang dinobatkan
Langkah selanjutnya
- Buat project Anda lebih aman dengan mengikuti checklist menggunakan IAM dengan aman
- Perluas aplikasi contoh ini untuk melacak penggunaan Markdown dengan metrik kustom Cloud Monitoring
- Tinjau tutorial Pub/Sub untuk mengetahui pendekatan yang aman terhadap microservice asinkron