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

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. [Next] をクリックします。

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

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

エージェントをテスト

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

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

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

トラブルシューティング

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

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

詳細

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