Membuat dan men-deploy fungsi Cloud Run HTTP dengan Go

Pengantar

Panduan ini akan memandu Anda dalam proses penulisan fungsi Cloud Run menggunakan runtime Go. Ada dua jenis fungsi Cloud Run:

  • Fungsi HTTP, yang Anda panggil dari permintaan HTTP standar.
  • Fungsi berbasis peristiwa, yang dipicu oleh peristiwa di infrastruktur Cloud Anda, seperti pesan pada topik Pub/Sub atau perubahan dalam bucket Cloud Storage.

Untuk mengetahui detail selengkapnya, baca artikel tentang menulis fungsi HTTP dan menulis fungsi berbasis peristiwa.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Functions, Cloud Build, Artifact Registry, Cloud Run, and Cloud Logging APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Functions, Cloud Build, Artifact Registry, Cloud Run, and Cloud Logging APIs.

    Enable the APIs

  8. Instal dan lakukan inisialisasi gcloud CLI.
  9. Update dan instal komponen gcloud dengan perintah berikut.
    gcloud components update
  10. Menyiapkan lingkungan pengembangan.

    Buka panduan penyiapan Go

Buat fungsi

  1. Buat direktori di sistem lokal Anda untuk kode fungsi:

    Linux atau Mac OS X

    mkdir ~/helloworld
    cd ~/helloworld
    

    Windows

    mkdir %HOMEPATH%\helloworld
    cd %HOMEPATH%\helloworld
    
  2. Buat file bernama hello_http.go di direktori helloworld dengan konten berikut:

    
    // Package helloworld provides a set of Cloud Functions samples.
    package helloworld
    
    import (
    	"encoding/json"
    	"fmt"
    	"html"
    	"net/http"
    
    	"github.com/GoogleCloudPlatform/functions-framework-go/functions"
    )
    
    func init() {
    	functions.HTTP("HelloHTTP", HelloHTTP)
    }
    
    // HelloHTTP is an HTTP Cloud Function with a request parameter.
    func HelloHTTP(w http.ResponseWriter, r *http.Request) {
    	var d struct {
    		Name string `json:"name"`
    	}
    	if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
    		fmt.Fprint(w, "Hello, World!")
    		return
    	}
    	if d.Name == "" {
    		fmt.Fprint(w, "Hello, World!")
    		return
    	}
    	fmt.Fprintf(w, "Hello, %s!", html.EscapeString(d.Name))
    }
    

    Fungsi contoh ini mengambil nama yang diberikan dalam permintaan HTTP dan menampilkan salam, atau "Halo Dunia!" jika tidak ada nama yang diberikan.

Menentukan dependensi

Buat file go.mod untuk melacak dependensi Anda:

cd ~/helloworld
go mod init example.com/hello
go mod tidy

Jika fungsi Anda memiliki dependensi di luar library Functions Framework, edit file go.mod untuk menambahkannya. Anda juga dapat menentukan dependensi dengan direktori Go vendor. Untuk detail selengkapnya, baca Menentukan dependensi di Go.

Membangun dan menguji fungsi secara lokal

Anda dapat memilih untuk mem-build dan menguji fungsi secara lokal tanpa men-deploy-nya. Caranya, buat modul main.go lokal untuk memanggil fungsi Anda.

  1. Buat subdirektori cmd:

    mkdir ~/helloworld/cmd
    cd ~/helloworld/cmd
    
  2. Buat modul go utama untuk memanggil fungsi Anda dengan menyalin cuplikan kode berikut ke dalam file bernama main.go di direktori ~/helloworld/cmd:

    package main
    
    import (
      "log"
      "os"
    
      // Blank-import the function package so the init() runs
      _ "example.com/hello"
      "github.com/GoogleCloudPlatform/functions-framework-go/funcframework"
    )
    
    func main() {
      // Use PORT environment variable, or default to 8080.
      port := "8080"
      if envPort := os.Getenv("PORT"); envPort != "" {
        port = envPort
      }
      if err := funcframework.Start(port); err != nil {
        log.Fatalf("funcframework.Start: %v\n", err)
      }
    }
    
  3. Selesaikan dependensi Anda yang tersisa dengan perintah go mod tidy:

    go mod tidy
    
  4. Jalankan fungsi Anda secara lokal dengan perintah berikut:

    export FUNCTION_TARGET=HelloHTTP
    go run ~/helloworld/cmd/main.go
    
  5. Uji fungsi Anda dengan membuka http://localhost:8080 di browser atau dengan menjalankan curl localhost:8080 dari jendela lain.

    Lihat Mengirim permintaan ke fungsi lokal untuk mengetahui detail selengkapnya.

Men-deploy fungsi

Untuk men-deploy fungsi Anda, jalankan perintah berikut di direktori helloworld:

  gcloud functions deploy go-http-function \
    --gen2 \
    --runtime=go122 \
    --region=REGION \
    --source=. \
    --entry-point=HelloHTTP \
    --trigger-http \
    --allow-unauthenticated

Ganti REGION dengan nama region Google Cloud tempat Anda ingin men-deploy fungsi (misalnya us-west1).

Flag --allow-unauthenticated opsional memungkinkan Anda menjangkau fungsi tanpa autentikasi.

Menguji fungsi yang di-deploy

  1. Setelah fungsi di-deploy, catat properti uri dari output perintah gcloud functions deploy, atau ambil dengan perintah berikut:

      gcloud functions describe go-http-function \
        --region=REGION
    

    Ganti REGION dengan nama region Google Cloud tempat Anda men-deploy fungsi (misalnya us-west1).

  2. Kunjungi URL ini di browser Anda. Fungsi ini menampilkan pesan "Halo Dunia!".

    Anda juga dapat menemukan URL ini di Google Cloud Console. Buka halaman Ringkasan fungsi Cloud Run, lalu klik nama fungsi Anda untuk membuka halaman Detail fungsi. Buka tab TRIGGER untuk melihat URL fungsi Anda.

Melihat log fungsi Anda

Melihat log dengan alat command line

Anda dapat meninjau log fungsi dengan UI Cloud Logging atau melalui Google Cloud CLI.

Untuk melihat log fungsi Anda dengan gcloud CLI, gunakan perintah logs read:

    gcloud functions logs read \
      --gen2 \
      --limit=10 \
      --region=REGION \
      go-http-function

Ganti REGION dengan nama region Google Cloud tempat Anda men-deploy fungsi (misalnya us-west1).

Outputnya akan terlihat seperti berikut:

LEVEL: I
NAME: hellohttp
TIME_UTC: 2023-05-31 21:52:20.473
LOG:

LEVEL: I
NAME: hellohttp
TIME_UTC: 2023-05-31 21:52:20.370
LOG:

LEVEL: I
NAME: hellohttp
TIME_UTC: 2023-05-31 21:52:20.280
LOG: Default STARTUP TCP probe succeeded after 1 attempt for container "h-hello_h_t_t_p-1" on port 8080.

LEVEL: I
NAME: hellohttp
TIME_UTC: 2023-05-31 21:52:20.108
LOG:

Melihat log dengan dasbor logging

Untuk melihat log fungsi Anda dengan dasbor logging, buka halaman Ringkasan fungsi Cloud Run, lalu klik nama fungsi Anda dari daftar, lalu klik tab Log.