BigQuery の結果を返す関数を作成する

このチュートリアルでは、BigQuery にクエリを送信する HTTP Cloud Run 関数を作成する方法について説明します。

始める前に

  1. 設定ページの説明に従って、Cloud Run に新しいプロジェクトを設定したことを確認してください。

  2. Artifact Registry、Cloud Build、Cloud Run Admin API API を有効にします。

     gcloud services enable artifactregistry.googleapis.com \
         cloudbuild.googleapis.com \
         run.googleapis.com
    
  3. ドメイン制限の組織のポリシーでプロジェクトの未認証呼び出しが制限されている場合は、限定公開サービスのテストの説明に従って、デプロイされたサービスにアクセスする必要があります。

必要なロール

ソースから Cloud Run サービスをデプロイするために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスが Google Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

サービス アカウントのロール

  • Cloud Build がソースを構築できるようにするには、次のコマンドを実行して、Compute Engine のデフォルト サービス アカウントに Cloud Build サービス アカウントのロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudbuild.builds.builder

    PROJECT_NUMBER は Google Cloud プロジェクト番号に、PROJECT_ID は Google Cloud プロジェクト ID に置き換えます。プロジェクト ID とプロジェクト番号を確認する方法については、プロジェクトの作成と管理をご覧ください。

    Compute Engine のデフォルト サービス アカウントに Cloud Build サービス アカウントのロールを付与すると、伝播されるまでに数分かかることがあります。

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

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

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

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

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

      cd nodejs-docs-samples/functions/v2/helloBigQuery
      
    3. サンプルコードを見てみましょう。このサンプルは、指定したデータセットで 400 回以上発生した単語をクエリし、結果を返します。

      // Import the Google Cloud client library
      const {BigQuery} = require('@google-cloud/bigquery');
      const bigquery = new BigQuery();
      
      const functions = require('@google-cloud/functions-framework');
      
      /**
       * HTTP Cloud Function that returns BigQuery query results
       *
       * @param {Object} req Cloud Function request context.
       * @param {Object} res Cloud Function response context.
       */
      functions.http('helloBigQuery', async (req, res) => {
        // Define the SQL query
        // Queries the public Shakespeare dataset using named query parameter
        const sqlQuery = `
            SELECT word, word_count
                  FROM \`bigquery-public-data.samples.shakespeare\`
                  WHERE corpus = @corpus
                  AND word_count >= @min_word_count
                  ORDER BY word_count DESC`;
      
        const options = {
          query: sqlQuery,
          // Location must match that of the dataset(s) referenced in the query.
          location: 'US',
          params: {corpus: 'romeoandjuliet', min_word_count: 400},
        };
      
        // Execute the query
        try {
          const [rows] = await bigquery.query(options);
          // Send the results
          res.status(200).send(rows);
        } catch (err) {
          console.error(err);
          res.status(500).send(`Error querying BigQuery: ${err}`);
        }
      });

    関数をデプロイする

    HTTP トリガーを使用して関数をデプロイするには:

    1. サンプルコードを含むディレクトリで次のコマンドを実行します。

      gcloud beta run deploy FUNCTION \
         --source . \
         --function FUNCTION_ENTRYPOINT \
         --base-image BASE_IMAGE \
         --region REGION \
         --allow-unauthenticated

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

      • FUNCTION は、デプロイする関数の名前に置き換えます(my-bigquery-function など)。このパラメータは省略できますが、省略すると名前の入力を求められます。

      • FUNCTION_ENTRYPOINT: ソースコード内の関数のエントリ ポイント。これは、関数の実行時に Cloud Run が実行するコードです。このフラグには、ソースコード内に存在する関数名または完全修飾クラス名を指定する必要があります。サンプル関数に指定するエントリ ポイントは helloBigQuery です。

      • BASE_IMAGE は、関数のベースイメージ環境に置き換えます(例: nodejs22)。ベースイメージと各イメージに含まれるパッケージの詳細については、ランタイム ベースイメージをご覧ください。

      • REGION: 関数をデプロイする Google Cloud リージョン。例: us-central1

      オプション:

      • 公開 HTTP 関数(Webhook など)を作成する場合は、--allow-unauthenticated フラグを指定します。このフラグは、Cloud Run IAM 起動元ロールを特別な ID allUser に割り当てます。サービスの作成後に、IAM を使用してこの設定を編集できます。

    関数をテストする

    1. 関数のデプロイが完了したら、uri プロパティをコピーします。

    2. ブラウザでこの URI にアクセスします。

      クエリ条件に一致する単語のリストと、各単語がターゲット データセットに出現する回数が表示されます。

    クリーンアップ

    サービスが使用されていない場合、Cloud Run の料金は発生しませんが、コンテナ イメージを Artifact Registry に保存すると課金される場合があります。コンテナ イメージを削除するか、Google Cloud プロジェクトを削除してこのような料金が発生しないようにできます。Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.