Spanner の結果を返す Cloud Run 関数を作成する

目標

Spanner にアクセスする HTTP 関数を作成、デプロイ、トリガーします。

料金

このドキュメントでは、 Google Cloudの課金対象コンポーネントである Spanner と Cloud Run を使用します。

  • Spanner の使用料金については、Spanner の料金をご覧ください。

  • Cloud Run の使用料金(無料の呼び出しを含む)については、Cloud Run の料金をご覧ください。

始める前に

  1. このドキュメントでは、test-instance という名前の Cloud Spanner インスタンスと、音楽アプリケーション スキーマを使用する example-db という名前のデータベースがあると想定します。音楽アプリケーション スキーマを使用するインスタンスとデータベースの作成方法については、Console を使用したクイックスタートか、Node.js または Python のスタートガイドのチュートリアルをご覧ください。

  2. Cloud Run と Cloud Build API を有効にします。

    API を有効にする

  3. gcloud CLI をインストールして初期化します

    gcloud CLI がすでにインストールされている場合は、次のコマンドを実行して更新します。

    gcloud components update
    
  4. 開発環境を準備します。

    Node.js

    Node.js 設定ガイドをご覧ください。

    Python

    Python 設定ガイドをご覧ください。

アプリケーションを準備する

  1. ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。

    Node.js

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

    または、zip ファイルとしてサンプルをダウンロードして解凍します。

    Python

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

    または、zip ファイルとしてサンプルをダウンロードして解凍します。

  2. Spanner にアクセスする Cloud Run functions のサンプルコードが含まれているディレクトリに移動します。

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. サンプルコードを見てみましょう。

    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)
    
    

    この関数は、SQL クエリを送信してデータベースから Albums のすべてのデータをフェッチします。この関数は、関数のエンドポイントに HTTP リクエストを行うと実行されます。

関数をデプロイする

HTTP トリガーを使用して関数をデプロイするには、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

次のように置き換えます。

関数のデプロイには最大 2 分かかります。

関数のデプロイが完了すると、url 値が返されることに注意してください。関数をトリガーするときにこの値を使用します。

Google Cloud コンソールの Cloud Run ページで、デプロイされた関数を確認できます。このページでは関数の作成と編集、関数の詳細と診断を得ることもできます。

関数をトリガーする

関数に HTTP リクエストを出します。

curl URL

URL は、関数のデプロイが完了したときに返される URL 値に置き換えます。

スタートガイド チュートリアルを実施済みで、データベースにデータがある場合は、SQL クエリの結果を示す出力が表示されます。

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

ブラウザで関数の URL にアクセスして、SQL クエリの結果を確認することもできます。

クリーンアップ

このドキュメントで使用した Spanner と Cloud Run functions のリソースについて、 Google Cloud アカウントに以後課金されないようにするには:

  1. インスタンスを削除します。

    gcloud CLI instances delete test-instance
    
  2. このチュートリアルでデプロイした Cloud Run サービスを削除します。

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

次のステップ