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

現在の Webhook は、cruisePlanCoverage 関数でハードコードされたデータを使用しています。チュートリアルのこのステップでは、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 Destinations (
      Destination STRING(1024),
      Covered BOOL,
    ) PRIMARY KEY(Destination);
    
  3. [送信] をクリックします。 Google Cloud コンソールがデータベースの [概要] ページに戻り、[スキーマの更新] が進行中であることが表示されます。更新が完了するまで待ちます。

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

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

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

    INSERT INTO Destinations (Destination, Covered)
    VALUES('anguilla', TRUE),
          ('canada', TRUE),
          ('china', TRUE),
          ('italy', TRUE),
          ('mexico', TRUE),
          ('spain', FALSE);
    
  4. [実行] をクリックします。

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

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

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

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

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

    Cloud Functions の概要に移動

  2. tutorial-telecommunications-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 こんにちは こんにちは。私は仮想通信エージェントです。請求と計画に関する疑問の解決、トラブルシューティング、旅行やクルーズの計画の追加をお手伝いします。ご用件をお知らせください。
2 クルーズ計画を追加したい 検索します。登録している電話番号をお知らせください。
3 123-123-1234 クルーズの日数をお知らせください。
4 7 オプション 1 には、会話とテキストが含まれています。1 日あたりの費用は $[XX] です。詳しくは、[URL] をご覧ください。オプション 2 には、トーク、テキスト、データが含まれます。1 日あたりの費用は $[XX] です。詳しくは、[URL] をご覧ください。どのクルーズプランを追加しますか?
5 オプション 1 承知しました。お客様のアカウントにそのプランを追加しました。クルーズ中は、地上での滞在も必要な場合があります。どの港に停まりますか?
6 イタリア では、そちらで何日滞在しますか。
7 3 おめでとうございます。イタリアでは地上でも無料でカバーされます。設定が完了しました。他に何かご不明な点はございませんか?

コードを調べてみると、イタリアは対象となる宛先のハードコードされたリストに含まれていません。これは、Webhook がイタリアを含むデータベースに正常に接続されたことを表します。

トラブルシューティング

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

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

詳細

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