Membuat fungsi Cloud Run yang menampilkan hasil Spanner

Tujuan

Tulis, deploy, dan picu fungsi HTTP yang mengakses Spanner.

Biaya

Dokumen ini menggunakan Spanner dan Cloud Run, yang merupakan komponen Google Cloudyang dapat ditagih.

  • Untuk mengetahui informasi tentang biaya penggunaan Spanner, lihat Harga Spanner.

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

Sebelum memulai

  1. Dokumen ini mengasumsikan bahwa Anda memiliki instance Spanner bernama test-instance dan database bernama example-db yang menggunakan skema aplikasi musik. Untuk petunjuk tentang cara membuat instance dan database dengan skema aplikasi musik, lihat Panduan memulai menggunakan konsol atau tutorial Mulai di Node.js, atau Python.

  2. Aktifkan Cloud Run dan Cloud Build API.

    Aktifkan 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 contoh sebagai file ZIP dan mengekstraknya.

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

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

  2. Beralihlah ke direktori yang berisi kode contoh fungsi Cloud Run untuk mengakses Spanner:

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. Lihat kode contoh:

    Node.js

    // Imports the Google Cloud client library
    const {Spanner} = require('@google-cloud/spanner');
    
    // Imports the functions framework to register your HTTP function
    const functions = require('@google-cloud/functions-framework');
    
    // Instantiates a client
    const spanner = new Spanner();
    
    // Your Cloud Spanner instance ID
    const instanceId = 'test-instance';
    
    // Your Cloud Spanner database ID
    const databaseId = 'example-db';
    
    /**
     * HTTP Cloud Function.
     *
     * @param {Object} req Cloud Function request context.
     * @param {Object} res Cloud Function response context.
     */
    functions.http('spannerQuickstart', async (req, res) => {
      // Gets a reference to a Cloud Spanner instance and database
      const instance = spanner.instance(instanceId);
      const database = instance.database(databaseId);
    
      // The query to execute
      const query = {
        sql: 'SELECT * FROM Albums',
      };
    
      // Execute the query
      try {
        const results = await database.run(query);
        const rows = results[0].map(row => row.toJSON());
        rows.forEach(row => {
          res.write(
            `SingerId: ${row.SingerId}, ` +
              `AlbumId: ${row.AlbumId}, ` +
              `AlbumTitle: ${row.AlbumTitle}\n`
          );
        });
        res.status(200).end();
      } catch (err) {
        res.status(500).send(`Error querying Spanner: ${err}`);
      }
    });

    Python

    import functions_framework
    from google.cloud import spanner
    
    instance_id = "test-instance"
    database_id = "example-db"
    
    client = spanner.Client()
    instance = client.instance(instance_id)
    database = instance.database(database_id)
    
    
    @functions_framework.http
    def spanner_read_data(request):
        query = "SELECT * FROM Albums"
    
        outputs = []
        with database.snapshot() as snapshot:
            results = snapshot.execute_sql(query)
    
            for row in results:
                output = "SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*row)
                outputs.append(output)
    
        return "\n".join(outputs)
    
    

    Fungsi ini mengirim kueri SQL untuk mengambil semua data Albums dari database Anda. 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 spanner:

Node.js

gcloud run deploy nodejs-spanner-function \
    --source . \
    --region REGION \
    --function spannerQuickstart \
    --base-image RUNTIME_ID \
    --log-http

Python

gcloud run deploy python-spanner-function \
    --source . \
    --region REGION \
    --function spanner_read_data \
    --base-image RUNTIME_ID \
    --log-http

Ganti:

Deployment fungsi mungkin memerlukan waktu hingga dua menit.

Perhatikan bahwa nilai url yang ditampilkan saat fungsi Anda selesai di-deploy. Anda akan menggunakannya saat memicu fungsi.

Anda dapat melihat fungsi yang di-deploy di halaman Cloud Run 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:

curl URL

Ganti URL dengan nilai URL yang ditampilkan saat fungsi Anda selesai di-deploy.

Anda akan melihat output yang menampilkan hasil kueri SQL, dengan asumsi Anda telah menyelesaikan tutorial Memulai dan mengisi database:

SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold Your Peace
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk

Anda juga dapat membuka URL fungsi di browser untuk melihat hasil kueri SQL.

Pembersihan

Agar tidak menimbulkan biaya tambahan pada akun Google Cloud Anda untuk resource fungsi Spanner dan Cloud Run yang digunakan dalam dokumen ini:

  1. Hapus instance:

    gcloud CLI instances delete test-instance
    
  2. Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini:

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

Langkah berikutnya