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.jsPython

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

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

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

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

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

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

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

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

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

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

    Node.jsPython
    // 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}`);
      }
    });
    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.jsPython
gcloud run deploy nodejs-spanner-function \
    --source . \
    --region REGION \
    --function spannerQuickstart \
    --base-image RUNTIME_ID \
    --log-http
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.jsPython
    gcloud run services delete nodejs-spanner-function
    gcloud run services delete python-spanner-function

次のステップ