command line gcloud di dalam tutorial layanan Cloud Run


Dalam tutorial ini, Anda akan membuat inventaris layanan Cloud Run menggunakan gcloud dan gsutil alat command line di dalam layanan Cloud Run Anda dapat menerapkan apa yang Anda pelajari di tutorial ini ke skrip Cloud operations yang ada atau membuat bukti konsep sebelum menggunakan library klien untuk membuat layanan yang lebih andal.

Gunakan alat gcloud dan gsutil seperti skrip shell apa pun di dalam layanan web, misalnya, seperti yang ditunjukkan dalam Panduan memulai shell. Dalam Cloud Run, kedua alat tersebut dapat digunakan dengan layanan Google Cloud dengan mengautentikasi secara otomatis dengan identitas layanan Cloud Run. Setiap izin yang diberikan ke identitas layanan tersedia di gcloud CLI.

gcould CLI sangat mampu mengumpulkan informasi dan pengelolaan resource di seluruh Google Cloud yang menantang menggunakannya dalam layanan web meminimalkan resiko pemanggil menyalahgunakan kemampuan ini. Tanpa kontrol keamanan, Anda dapat menimbulkan resiko ke layanan atau resource lainnya yang berjalan dalam project yang sama dengan mengizinkan aktivitas berbahaya yang disengaja atau tidak disengaja. Contoh risiko ini meliputi:

  • Memungkinkan penemuan alamat IP mesin virtual pribadi
  • Memunginkan akses ke data pribadi dari database di project yang sama
  • Memungkinkan penghapusan layanan lainnya yang sedang berjalan

Beberapa langkah pada tutorial ini menunjukkan cara menerapkan kontrol untuk meminimalkan resiko, seperti menentukan gcloud perintah untuk dijalankan dalam kode, bukan membiarkannya terbuka sebagai input pengguna

Membuat skrip dengan alat command line di dalam layanan Cloud Run sama dengan menggunakan command line secara lokal Perbedaan utamanya adalah pembatasan tambahan yang harus Anda tambahkan di skrip utama.

Tujuan

  • Menulis dan membuat container kustom dengan Dockerfile
  • Menulis, membuat, dan deploy layanan Cloud Run
  • Menggunakan alat gcloud dan gsutil dengan aman di layanan web
  • Membuat laporan layanan Cloud Run dan menyimpannya ke Cloud Storage

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. 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.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Aktifkan API Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage.

    Mengaktifkan API

  7. Instal dan lakukan inisialisasi gcloud CLI.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:

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:

  1. Setel project default Anda:

    gcloud config set project PROJECT_ID

    Ganti PROJECT_ID dengan nama project yang Anda buat untuk tutorial ini.

  2. 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) ikon daun CO2 Rendah
  • europe-southwest1 (Madrid)
  • europe-west1 (Belgia) ikon daun CO2 Rendah
  • europe-west4 (Belanda)
  • europe-west8 (Milan)
  • europe-west9 (Paris) ikon daun CO2 Rendah
  • me-west1 (Tel Aviv)
  • us-central1 (Iowa) ikon daun CO2 rendah
  • us-east1 (South Carolina)
  • us-east4 (North Virginia)
  • us-east5 (Columbus)
  • us-south1 (Dallas)
  • us-west1 (Oregon) ikon daun 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) ikon daun CO2 Rendah
  • europe-west3 (Frankfurt, Jerman) ikon daun CO2 Rendah
  • europe-west6 (Zurich, Swiss) ikon daun CO2 Rendah
  • me-central1 (Doha)
  • me-central2 (Damam)
  • northamerica-northeast1 (Montreal) ikon daun CO2 Rendah
  • northamerica-northeast2 (Toronto) ikon daun CO2 Rendah
  • southamerica-east1 (Sao Paulo, Brasil) ikon daun CO2 Rendah
  • southamerica-west1 (Santiago, Cile) ikon daun CO2 Rendah
  • us-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:

  1. Clone repositori aplikasi contoh ke mesin lokal Anda:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples.git

    Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.

  2. Ubah ke direktori yang memuat kode contoh Cloud Run:

    cd cloud-run-samples/gcloud-report/

Meninjau kode

Bagian ini menyertakan informasi tentang contoh kode yang Anda ambil.

Membuat laporan dan menguploadnya ke Cloud Storage

Skrip shell ini menghasilkan laporan layanan Cloud Run di project dan region saat ini, serta mengupload hasilnya ke Cloud Storage. Laporan ini mencantumkan layanan yang namanya berisi argumen string search yang disediakan.

Skrip ini menggunakan gcloud run services list perintah, gcloud opsi format lanjutan, dan mode salin gsutil transfer streaming.

set -eo pipefail

# Check for required environment variables.
requireEnv() {
  test "${!1}" || (echo "gcloud-report: '$1' not found" >&2 && exit 1)
}
requireEnv GCLOUD_REPORT_BUCKET

# Prepare formatting: Default search term to include all services.
search=${1:-'.'}
limits='spec.template.spec.containers.resources.limits.flatten("", "", " ")'
format='table[box, title="Cloud Run Services"](name,status.url,metadata.annotations.[serving.knative.dev/creator],'${limits}')'

# Create a specific object name that will not be overridden in the future.
obj="gs://${GCLOUD_REPORT_BUCKET}/report-${search}-$(date +%s).txt"

# Write a report containing the service name, service URL, service account or user that
# deployed it, and any explicitly configured service "limits" such as CPU or Memory.
gcloud run services list \
  --format "${format}" \
  --filter "metadata.name~${search}" | gsutil -q cp -J - "${obj}"

# /dev/stderr is sent to Cloud Logging.
echo "gcloud-report: wrote to ${obj}" >&2
echo "Wrote report to ${obj}"

Skrip ini aman untuk digunakan sebagai layanan karena pemanggilan berulang pada skrip ini akan memperbarui laporan tanpa memakan biaya lebih lanjut. Skrip lain yang menggunakan gcloud CLI dapat lebih memakan biaya saat terjadi pemanggilan berulang, seperti membuat resource Cloud baru atau melakukan tugas yang mahal. Skrip idempotent, yang memberikan yang sama pada pemanggilan berulang, lebih aman untuk dijalankan sebagai layanan.

Memanggil skrip pada permintaan HTTP

Kode Go ini menyiapkan layanan web yang menjalankan skrip shell untuk membuat laporan. Karena kueri penelusuran adalah input pengguna, kode akan memvalidasinya untuk memastikan bahwa kueri tersebut hanya berisi huruf, angka, atau tanda hubung untuk mencegah perintah berbahaya sebagai input. Kumpulan karakter ini cukup sempit untuk mencegah serangan injection peraturan.

Layanan web meneruskan parameter penelusuran sebagai argumen ke skrip shell.


// Service gcloud-report is a Cloud Run shell-script-as-a-service.
package main

import (
	"log"
	"net/http"
	"os"
	"os/exec"
	"regexp"
)

func main() {
	http.HandleFunc("/", scriptHandler)

	// Determine port for HTTP service.
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("defaulting to port %s", port)
	}

	// Start HTTP server.
	log.Printf("listening on port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}

func scriptHandler(w http.ResponseWriter, r *http.Request) {
	search := r.URL.Query().Get("search")
	re := regexp.MustCompile(`^[a-z]+[a-z0-9\-]*$`)
	if !re.MatchString(search) {
		log.Printf("invalid search criteria %q, using default", search)
		search = "."
	}

	cmd := exec.CommandContext(r.Context(), "/bin/bash", "script.sh", search)
	cmd.Stderr = os.Stderr
	out, err := cmd.Output()
	if err != nil {
		log.Printf("Command.Output: %v", err)
		http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
		return
	}
	w.Write(out)
}

File go.mod mendeklarasikan dependensi aplikasi dalam modul go:

module github.com/GoogleCloudPlatform/cloud-run-samples/gcloud-report

go 1.19

Menentukan lingkungan container

Dockerfile menentukan cara lingkungan disusun bersama untuk layanan. Dockerfile ini mirip dengan Dockerfile dari panduan memulai helloworld-shell, kecuali bahwa image container berdasarkan gcloud image Google Cloud CLI. Dengan begitu layanan kami diizinkan untuk menggunakan gcloud dan gsutil tanpa penginstalan kustom dan langkah konfigurasi untuk Google Cloud CLI.


# Use the official golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.20-buster as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY invoke.go ./

# Build the binary.
RUN go build -mod=readonly -v -o server

# Use a gcloud image based on debian:buster-slim for a lean production container.
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM gcr.io/google.com/cloudsdktool/cloud-sdk:slim

WORKDIR /app

# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server
COPY *.sh /app/
RUN chmod +x /app/*.sh

# Run the web service on container startup.
CMD ["/app/server"]

Membuat repositori standar Artifact Registry

Buat repositori standar Artifact Registry untuk menyimpan image container:

gcloud artifacts repositories create REPOSITORY \
    --repository-format=docker \
    --location=REGION

Ganti:

  • REPOSITORY dengan nama unik untuk repositori.
  • REGION dengan region Google Cloud dari Artifact Registry.

Menyiapkan bucket Cloud Storage

Buat bucket Cloud Storage untuk mengupload laporan:

gsutil mb gs://REPORT_ARCHIVE_BUCKET

Ganti REPORT_ARCHIVE_BUCKET dengan nama bucket yang unik secara global.

Menyiapkan identitas layanan

Untuk membatasi hak istimewa yang dimiliki layanan ke infrastruktur lain, Anda perlu membuat identitas layanan dan menyesuaikan izin IAM tertentu yang diperlukan untuk melakukan pekerjaan.

Dalam kasus ini, hak istimewa yang diperlukan adalah izin untuk membaca layanan Cloud Run serta izin untuk membaca dari, dan menulis untuk bucket Cloud Storage.

  1. Membuat akun layanan:

    gcloud iam service-accounts create gcloud-report-identity

  2. Beri izin akun layanan untuk membaca layanan Cloud Run:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:gcloud-report-identity@PROJECT_ID.iam.gserviceaccount.com \
      --role roles/run.viewer
  3. Beri izin akun layanan untuk membaca dari dan menulis ke bucket Cloud Storage:

    gsutil iam ch \
      serviceAccount:gcloud-report-identity@PROJECT_ID.iam.gserviceaccount.com:objectViewer,objectCreator \
      gs://REPORT_ARCHIVE_BUCKET

Akses terbatas atas identitas layanan yang disesuaikan ini untuk mencegah layanan dari akses resource Google Cloud lainnya.

Mengirimkan layanan

Kode pengiriman terdiri dari tiga langkah:

  • Membangun image container dengan Cloud Build
  • Mengupload image container ke Artifact Registry
  • Men-deploy image container ke Cloud Run.

Untuk kode pengiriman Anda:

  1. Bangun container Anda dan publikasikan di Artifact Registry:

    gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/gcloud-report

    Ganti:

    • PROJECT_ID dengan project ID Google Cloud Anda
    • REPOSITORY dengan nama repositori Artifact Registry.
    • REGION dengan region Google Cloud dari Artifact Registry.

    gcloud-report adalah nama layanan Anda.

    Setelah berhasil, pesan BERHASIL akan menampilkan ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Artifact Registry dan dapat digunakan kembali jika perlu.

  2. Jalankan perintah berikut ini untuk menggunakan layanan Anda:

    gcloud run deploy gcloud-report \
       --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/gcloud-report \
       --update-env-vars GCLOUD_REPORT_BUCKET=REPORT_ARCHIVE_BUCKET \
       --service-account gcloud-report-identity \
       --no-allow-unauthenticated

    Ganti:

    • PROJECT_ID dengan project ID Google Cloud Anda.
    • REPOSITORY dengan nama repositori Artifact Registry.
    • REGION dengan region layanan Google Cloud.

    gcloud-report adalah bagian dari nama container dan nama layanan. Image container di-deploy ke layanan dan region (Cloud Run) yang Anda konfigurasi sebelumnya di bagian Menyiapkan gcloud.

    Flag --no-allow-unauthenticated membatasi akses yang tidak diautentikasi ke layanan. Dengan menjaga layanan pribadi, Anda dapat mengandalkan autentikasi bawaan Cloud Run untuk memblokir permintaan yang tidak sah. Untuk detail selengkapnya tentang autentikasi yang didasarkan pada Identity and Access Management IAM, lihat Mengelola akses menggunakan IAM.

    Tunggu hingga deployment selesai. Proses ini dapat memakan waktu sekitar setengah menit. Jika berhasil, command line akan menampilkan URL layanan.

  3. Jika Anda ingin men-deploy pembaruan kode ke layanan, ulangi langkah-langkah sebelumnya. Setiap deployment ke layanan membuat revisi baru dan otomatis melayani lalu lintas jika sudah siap.

Lihat Mengelola akses menggunakan IAM untuk mengetahui cara memberikan akses kepada pengguna Google Cloud untuk memanggil layanan ini. Editor dan pemilik project secara otomatis memiliki akses ini.

Membuat laporan

Untuk membuat laporan layanan Cloud Run:

  1. Gunakan curl untuk mengirim permintaan yang sudah diautentikasi:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

    Ganti SERVICE_URL dengan URL yang disediakan oleh Cloud Run setelah menyelesaikan deployment.

    Jika Anda akan membuat project baru dan mengikuti tutorial ini, output-nya akan mirip dengan:

    Wrote report to gs://REPORT_ARCHIVE_BUCKET/report-.-DATE.txt

    . dalam nama file adalah argumen penelusuran default seperti yang disebutkan dalam kode sumber.

    Untuk menggunakan fitur penelusuran, tambahkan search argumen ke permintaan:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL?search=gcloud

    Kueri ini akan mengembalikan output yang sama dengan:

    Wrote report to gs://REPORT_ARCHIVE_BUCKET/report-gcloud-DATE.txt
  2. Ambil file menggunakan alat gsutil secara lokal:

    gsutil cp gs://REPORT_FILE_NAME .

    . dalam perintah berarti direktori kerja saat ini.

    Ganti REPORT_FILE_NAME dengan output nama objek Cloud Storage di langkah sebelumnya.

Buka file untuk melihat laporan. Kodenya akan terlihat seperti berikut:

Screenshot daftar Cloud Run di project dengan kolom untuk empat atribut layanan.
Keempat kolom diambil dari deskripsi layanan. Kolom tersebut mencakup Nama layanan, URL yang ditetapkan saat deployment pertama, inisial Kreator layanan, dan Batas maksimum CPU dan memori layanan.

Meningkatkan keandalan untuk masa depan

Jika Anda ingin mengembangkan layanan ini lebih lanjut, pertimbangkan untuk menulis ulang dalam bahasa pemrograman yang lebih andal dan menggunakan Cloud Run Admin API serta library klien Cloud Storage.

Anda dapat memeriksa panggilan API yang dilakukan (dan melihat beberapa detail autentikasi) dengan menambahkan --log-http ke perintah gcloud dan -D ke perintah gsutil.

Otomatiskan operasi ini

Setelah laporan layanan Cloud Run dapat dipicu oleh permintaan HTTP , gunakan otomatisasi untuk membuat laporan waktu Anda memerlukannya:

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:

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource tutorial

  1. Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini:

    gcloud run services delete SERVICE-NAME

    Dengan SERVICE-NAME adalah nama layanan pilihan Anda.

    Anda juga dapat menghapus layanan Cloud Run dari Konsol Google Cloud.

  2. Hapus konfigurasi region default gcloud yang Anda tambahkan selama penyiapan tutorial:

     gcloud config unset run/region
    
  3. Hapus konfigurasi project:

     gcloud config unset project
    
  4. Hapus resource Google Cloud lain yang dibuat dalam tutorial ini:

Langkah selanjutnya