データベースに対してクエリを実行する

Webhook は現在、accountBalanceCheck 関数でハードコードされたデータを使用しています。チュートリアルのこのステップでは、Spanner データベースを作成し、対象となる宛先を入力して、データベースをクエリするように関数を更新します。

プロジェクトの構成

Dialogflow エージェントとデータベースの両方が同じプロジェクト内にあることが重要です。これは関数がデータベースに安全にアクセスできるようにするための最も簡単な方法です。また、Spanner API を有効にする必要があります。

  1. データベースを作成する前に、Google Cloud コンソールからプロジェクトを選択します。

    プロジェクト セレクタに移動

  2. プロジェクトに対して Spanner API を有効化します

    Spanner API を有効にする

Spanner インスタンスの作成

Spanner を初めて使用するときは、インスタンスを作成する必要があります。これにより、そのインスタンスの Spanner データベースによって使用されるリソースが割り当てられます。

  1. Google Cloud コンソールで、[Spanner インスタンス] ページに移動します。

    Spanner インスタンスに移動

  2. [インスタンスを作成] をクリックします。

  3. インスタンス名として、チュートリアル インスタンスと入力します。

  4. インスタンス ID は、インスタンス名に基づいて自動的に入力されます。

  5. [構成を選択] で、デフォルトのオプション [リージョン] を保持し、関数の作成時に選択した同じリージョンのロケーションを選択します。

  6. [コンピューティング容量の割り当て] に、100 処理ユニットを入力します。 これにより、チュートリアル用の容量が最小限になります。

  7. [作成] をクリックします。Google Cloud コンソールに、作成したインスタンスの [概要] ページが表示されます。

Spanner データベースの作成

これでインスタンスが作成されたため、データベースを作成する必要があります。データベースを作成するには、次のようにします。

  1. インスタンス 概要 ページで、データベースを作成 をクリックします。
  2. データベース名に「tutorial-database」と入力します。
  3. [Google 標準 SQL] データベースの言語を選択します。
  4. [作成] をクリックします。Google Cloud コンソールに、作成したデータベースの [概要] ページが表示されます。

データベース用のテーブルを作成する

データベースが作成されたため、データベースのテーブルを作成する必要があります。テーブルを作成するには、次の手順を行います。

  1. データベースの [概要] ページの [テーブル] セクションで、[テーブルを作成] をクリックします
  2. [DDL ステートメントの記述] ページで、次のように入力します。

    CREATE TABLE Checking (
      AccountId INT64,
      Balance INT64,
    ) PRIMARY KEY(AccountId);
    
  3. [送信] をクリックします。 Google Cloud コンソールがデータベースの [概要] ページに戻り、[スキーマの更新] が進行中であることが表示されます。更新が完了するまで待ちます。

  4. データベースの [概要] ページの [テーブル] セクションで、[テーブルを作成] をクリックします

  5. [DDL ステートメントの記述] ページで、次のように入力します。

    CREATE TABLE Savings (
      AccountId INT64,
      Balance INT64,
    ) PRIMARY KEY(AccountId);
    
  6. [送信] をクリックします。 Google Cloud コンソールがデータベースの [概要] ページに戻り、[スキーマの更新] が進行中であることが表示されます。更新が完了するまで待ちます。

テーブルにデータを挿入する

データベースにテーブルが作成されたため、テーブルにデータを追加する必要があります。データを追加するには:

  1. データベースの [概要] ページのテーブルで、Checking テーブルをクリックします。Google Cloud コンソールで、テーブルの [スキーマ] ページが表示されます。
  2. 左側のナビゲーション・メニューで、[データ] をクリックしてテーブルの [データ] ページを表示します。
  3. [挿入] をクリックします。 Google Cloud コンソールで、テーブルの [クエリ] ページが開き、INSERT ステートメントと SELECT ステートメントを含む新しいクエリタブが表示されます。これらのステートメントを次のように上書きします。

    INSERT INTO Checking (AccountId, Balance)
    VALUES(1, 1000),
          (2, 2000);
    
  4. [実行] をクリックします。

  5. 左側のナビゲーション メニューで、[データ] をもう一度クリックしてテーブルのデータを表示します。テーブルに目的のデータが含まれていることを確認します。

  6. tutorial-database: 概要 リンクをクリックして、データベースの概要ページに戻ります。

  7. データベースの [概要] ページのテーブルで、Savings テーブルをクリックします。Google Cloud コンソールで、テーブルの [スキーマ] ページが表示されます。

  8. 左側のナビゲーション・メニューで、[データ] をクリックしてテーブルの [データ] ページを表示します。

  9. [挿入] をクリックします。 Google Cloud コンソールで、テーブルの [クエリ] ページが開き、INSERT ステートメントと SELECT ステートメントを含む新しいクエリタブが表示されます。これらのステートメントを次のように上書きします。

    INSERT INTO Savings (AccountId, Balance)
    VALUES(1, 10000),
          (2, 20000);
    
  10. [実行] をクリックします。

  11. 左側のナビゲーション メニューで、[データ] をもう一度クリックして、テーブルのデータを表示します。テーブルに目的のデータが含まれていることを確認します。

データベースをクエリするように Cloud Functions の関数を更新する

Webhook コードの accountBalanceCheck 関数は、データベースに接続するための情報が特定の環境変数に設定されているかどうかを確認します。これらの環境変数が設定されていない場合、関数はハードコードされたアカウント残高を使用します。

データベースが設定されたので、Cloud Functions を更新して必要な環境変数を設定します。

  1. Cloud Functions の概要ページを開きます。

    Cloud Functions の概要に移動

  2. tutorial-banking-webhook 関数をクリックして、関数の詳細ページに移動します。

  3. [編集] をクリックします。

  4. [ランタイム、ビルド、接続の設定] セクションを開きます。

  5. [ランタイム] タブを選択します。

  6. [ランタイム環境変数] セクションに次の変数を追加します。

    • PROJECT_ID: プロジェクト ID
    • SPANNER_INSTANCE_ID: Spanner インスタンス ID(tutorial-instance であると考えられます)
    • SPANNER_DATABASE_ID: Spanner データベース ID(tutorial-database であると考えられます)
  7. [次へ] をクリックします。

  8. [デプロイ] をクリックします。

  9. ステータス インジケーターが関数が正常にデプロイされたことを示すまで待ちます。

エージェントをテスト

エージェントを試す準備が整いました。Dialogflow コンソールで [Test Agent] ボタンをクリックして、シミュレータを開きます。エージェントとの次の会話を試行します。

会話ターン 受講者 エージェント
1 こんにちは ACME 銀行をご利用いただきありがとうございます。
2 アカウントの残高を知りたいです 普通預金と当座預金、どちらの口座の残高をご希望ですか?
3 当座 最新の残高は $10.00 です。

コードを調べると、$10 はハードコードされた値ではありません。これは、残高が $10 であるデータベースに Webhook が正常に接続されたことを表します。

トラブルシューティング

Webhook コードにロギング ステートメントが含まれています。問題が発生した場合は、Cloud Functions のログを表示してみてください。

関数がデータベースに接続しておらず、ログに権限エラーが表示される場合は、関数で使用されるデフォルトのサービス アカウントのロールを確認する必要があります。このサービス アカウントの形式は PROJECT_ID@appspot.gserviceaccount.com です。これは、次のいずれかの方法で修正できます。

詳細情報

上述の手順の詳細については、以下をご覧ください。