Menggunakan Cloud Functions

Tujuan

Tulis, deploy, dan picu HTTP Cloud Function yang mengakses Bigtable.

Biaya

Topik ini menggunakan Bigtable dan Cloud Functions, yang merupakan komponen Google Cloud yang dapat ditagih.

  • Untuk informasi tentang biaya penggunaan Bigtable, lihat Harga Bigtable.

  • Untuk informasi tentang biaya penggunaan Cloud Functions, termasuk pemanggilan gratis, lihat Harga Cloud Functions.

Sebelum memulai

  1. Topik ini mengasumsikan bahwa Anda memiliki instance Bigtable bernama test-instance dan tabel bernama test-table. Anda dapat membuat resource ini dengan mengikuti langkah-langkah pada Membuat tabel pengujian. Pastikan untuk menghapus resource setelah selesai untuk menghindari timbulnya biaya yang tidak perlu.

  2. Aktifkan Cloud Functions API.

    Mengaktifkan API

  3. Instal dan lakukan inisialisasi gcloud CLI.

    Jika Anda sudah menginstal gcloud CLI, update dengan menjalankan perintah berikut:

    gcloud components update
    
  4. Menyiapkan lingkungan pengembangan:

Menyiapkan aplikasi

  1. Clone repositori aplikasi contoh ke komputer 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.

  2. Beralihlah ke direktori yang berisi kode contoh Cloud Functions untuk mengakses Bigtable:

    Node.js

    cd nodejs-docs-samples/functions/bigtable/

    Python

    cd python-docs-samples/functions/bigtable/

    Go

    cd golang-samples/functions/bigtable/
  3. Lihat kode contoh:

    Node.js

    // Imports the Google Cloud client library
    const {Bigtable} = require('@google-cloud/bigtable');
    
    // Instantiates a client
    const bigtable = new Bigtable();
    
    exports.readRows = async (req, res) => {
      // Gets a reference to a Cloud Bigtable instance and database
      const instance = bigtable.instance(req.body.instanceId);
      const table = instance.table(req.body.tableId);
    
      // Execute the query
      try {
        const prefix = 'phone#';
        const rows = [];
        await table
          .createReadStream({
            prefix,
          })
          .on('error', err => {
            res.send(`Error querying Bigtable: ${err}`);
            res.status(500).end();
          })
          .on('data', row => {
            rows.push(
              `rowkey: ${row.id}, ` +
                `os_build: ${row.data['stats_summary']['os_build'][0].value}\n`
            );
          })
          .on('end', () => {
            rows.forEach(r => res.write(r));
            res.status(200).end();
          });
      } catch (err) {
        res.send(`Error querying Bigtable: ${err}`);
        res.status(500).end();
      }
    };
    

    Python

    from google.cloud import bigtable
    from google.cloud.bigtable.row_set import RowSet
    
    client = bigtable.Client()
    
    def bigtable_read_data(request):
        instance = client.instance(request.headers.get("instance_id"))
        table = instance.table(request.headers.get("table_id"))
    
        prefix = "phone#"
        end_key = prefix[:-1] + chr(ord(prefix[-1]) + 1)
    
        outputs = []
        row_set = RowSet()
        row_set.add_row_range_from_keys(prefix.encode("utf-8"), end_key.encode("utf-8"))
    
        rows = table.read_rows(row_set=row_set)
        for row in rows:
            output = "Rowkey: {}, os_build: {}".format(
                row.row_key.decode("utf-8"),
                row.cells["stats_summary"][b"os_build"][0].value.decode("utf-8"),
            )
            outputs.append(output)
    
        return "\n".join(outputs)
    
    

    Go

    
    // Package bigtable contains an example of using Bigtable from a Cloud Function.
    package bigtable
    
    import (
    	"context"
    	"fmt"
    	"log"
    	"net/http"
    	"sync"
    
    	"cloud.google.com/go/bigtable"
    )
    
    // client is a global Bigtable client, to avoid initializing a new client for
    // every request.
    var client *bigtable.Client
    var clientOnce sync.Once
    
    // BigtableRead is an example of reading Bigtable from a Cloud Function.
    func BigtableRead(w http.ResponseWriter, r *http.Request) {
    	clientOnce.Do(func() {
    		// Declare a separate err variable to avoid shadowing client.
    		var err error
    		client, err = bigtable.NewClient(context.Background(), r.Header.Get("projectID"), r.Header.Get("instanceId"))
    		if err != nil {
    			http.Error(w, "Error initializing client", http.StatusInternalServerError)
    			log.Printf("bigtable.NewClient: %v", err)
    			return
    		}
    	})
    
    	tbl := client.Open(r.Header.Get("tableID"))
    	err := tbl.ReadRows(r.Context(), bigtable.PrefixRange("phone#"),
    		func(row bigtable.Row) bool {
    			osBuild := ""
    			for _, col := range row["stats_summary"] {
    				if col.Column == "stats_summary:os_build" {
    					osBuild = string(col.Value)
    				}
    			}
    
    			fmt.Fprintf(w, "Rowkey: %s, os_build:  %s\n", row.Key(), osBuild)
    			return true
    		})
    
    	if err != nil {
    		http.Error(w, "Error reading rows", http.StatusInternalServerError)
    		log.Printf("tbl.ReadRows(): %v", err)
    	}
    }
    

    Fungsi ini mengirimkan permintaan baca ke tabel untuk mengambil semua data stats_summary untuk baris dengan awalan row key phone. Fungsi ini dijalankan saat Anda membuat permintaan HTTP ke endpoint fungsi.

Menerapkan fungsi

Untuk men-deploy fungsi dengan pemicu HTTP, jalankan perintah berikut di direktori bigtable:

Node.js

gcloud functions deploy get \
--runtime nodejs20 --trigger-http

Gunakan flag --runtime untuk menentukan ID runtime dari versi Node.js yang didukung untuk menjalankan fungsi Anda.

Python

gcloud functions deploy bigtable_read_data \
--runtime python312 --trigger-http

Gunakan flag --runtime untuk menentukan ID runtime versi Python yang didukung untuk menjalankan fungsi Anda.

Go

gcloud functions deploy BigtableRead \
--runtime go121 --trigger-http

Gunakan flag --runtime untuk menentukan ID runtime versi Go yang didukung untuk menjalankan fungsi Anda.

Deployment fungsi mungkin memerlukan waktu hingga dua menit.

Setelah selesai di-deploy, fungsi Anda akan menampilkan nilai url. Anda akan menggunakan nilai tersebut saat memicu fungsi.

Anda dapat melihat fungsi yang di-deploy pada halaman Cloud Functions di Konsol Google Cloud. Anda juga dapat membuat dan mengedit fungsi di halaman tersebut, serta mendapatkan detail dan diagnostik untuk fungsi Anda.

Picu fungsi

Buat permintaan HTTP ke fungsi Anda:

Node.js

curl "https://REGION-PROJECT_ID.cloudfunctions.net/get" -H "instance_id: test-instance" -H "table_id: test-table"

Python

curl "https://REGION-PROJECT_ID.cloudfunctions.net/bigtable_read_data" -H "instance_id: test-instance" -H "table_id: test-table"

Go

curl "https://REGION-PROJECT_ID.cloudfunctions.net/BigtableRead" -H "instance_id: test-instance" -H "table_id: test-table"

dengan REGION dan PROJECT_ID cocok dengan nilai yang terlihat di terminal Anda saat fungsi selesai di-deploy. Anda akan melihat output yang menampilkan hasil permintaan baca.

Anda juga dapat membuka URL fungsi di browser untuk melihat hasil permintaan baca Anda.

Pembersihan

Agar tidak menimbulkan biaya tambahan pada akun Google Cloud Anda untuk resource Bigtable dan Cloud Functions yang digunakan dalam topik ini:

  1. Hapus instance:

    gcloud bigtable instances delete test-instance
    
  2. Hapus fungsi yang Anda deploy:

    Node.js

    gcloud functions delete get 

    Python

    gcloud functions delete bigtable_read_data 

    Go

    gcloud functions delete BigtableRead 

Langkah selanjutnya