Some products and features are in the process of being renamed. Generative playbook and flow features are also being migrated to a single consolidated console. See the details.
Stay organized with collections
Save and categorize content based on your preferences.
Your webhook currently uses hardcoded data in the cruisePlanCoverage function.
In this step of the tutorial,
you will create a
Spanner
database, populate it with covered destinations,
and update your function to query the database.
Project configuration
It is important that your Dialogflow agent and the database
are both in the same project.
This is the easiest way for your function to have
secure access to your database.
Also, you must enable the Spanner API.
Before creating the database,
select your project from the Google Cloud console.
Click Submit.
The Google Cloud console returns to the database Overview page and
shows that Schema updates are underway.
Wait until the update is complete.
Insert data into your table
Now that your database has a table,
you need to add data to the table.
To add data:
In the list of tables on the database Overview page,
click the Destinations table.
The Google Cloud console displays the Destinations table's Schema page.
In the left navigation menu,
click Data to display the Destinations table's Data page.
Click Insert.
The Google Cloud console displays the Destinations table's Query page with a
new query tab that contains INSERT and SELECT statements.
Overwrite those statements with the following:
In the left navigation menu,
click Data again to display the Destination table's data.
Confirm that the table contains the desired data.
Update the Cloud Function to query the database
The cruisePlanCoverage function in the webhook code
checks whether specific environment variables are set
with information for connecting to the database.
If these environment variables are not set,
the function uses a hardcoded list of destinations.
Now that you have a database set up,
update your Cloud Function to set required environment variables:
Click the tutorial-telecommunications-webhook function to go to its details page.
Click Edit.
Open the Runtime, build and connections settings section.
Select the Runtime tab.
Add the following variables in the Runtime environment variables section:
PROJECT_ID: your project ID
SPANNER_INSTANCE_ID: your Spanner instance ID (probably tutorial-instance)
SPANNER_DATABASE_ID: your spanner database ID (probably tutorial-database)
Click Next.
Click Deploy.
Wait until the status indicator shows that the function
has successfully deployed.
Test your agent
Your agent is now ready to try.
Click the Test Agent button from the Dialogflow console
to open the simulator.
Attempt to have the following conversation with the agent:
Conversational turn
You
Agent
1
Hello
Hi! I'm the virtual telecommunications agent. I can help you resolve billing and plan questions, troubleshoot, and add travel and cruise plans. How can I assist you today?
2
I want to add a cruise plan
Let me take a look for you. What is your phone number with us?
3
123-123-1234
How many days is your cruise?
4
7
Option 1 includes talk and text. It costs $[XX]/day. More info here [URL]. Option 2 includes talk, text and data. It costs $[XX]/day. More info here [URL]. Which cruise plan would you like to add?
5
Option 1
Got it. I've added that plan to your account. While on your cruise, you may also need coverage on land. What port will you be stopping at?
6
Italy
And, how many days are you spending there?
7
3
Great news! Italy has free coverage on land. You're all set. Is there anything else I can help you with today?
If you examine the code,
Italy is not in the hardcoded list of covered destinations.
This means that your webhook has successfully connected to the database,
which does include Italy.
Troubleshooting
The webhook code includes logging statements.
If you are having issues, try viewing the logs for your Cloud Function.
If your function is not connecting to the database,
and you see a permission error in the logs,
you may need to fix the role for the default service account
used by your function.
This service account is of the form
PROJECT_ID@appspot.gserviceaccount.com.
You can fix this in one of the following ways:
If the default service account is shown on the IAM main page,
change permissions for the service account.
The Editor role will work,
but you may want a more granular role in a production scenario.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-29 UTC."],[[["\u003cp\u003eThis tutorial guides you through setting up a Spanner database to replace hardcoded data in your webhook's \u003ccode\u003ecruisePlanCoverage\u003c/code\u003e function, improving its functionality and data management.\u003c/p\u003e\n"],["\u003cp\u003eYou will create a Spanner instance and database, define a table named "Destinations" with "Destination" and "Covered" columns, and then populate it with data representing covered travel destinations.\u003c/p\u003e\n"],["\u003cp\u003eThe process involves enabling the Spanner API, selecting the project in the Google Cloud console, creating the Spanner instance and database, and defining a table schema.\u003c/p\u003e\n"],["\u003cp\u003eYou'll update your Cloud Function's runtime environment variables with your \u003ccode\u003ePROJECT_ID\u003c/code\u003e, \u003ccode\u003eSPANNER_INSTANCE_ID\u003c/code\u003e, and \u003ccode\u003eSPANNER_DATABASE_ID\u003c/code\u003e to enable it to connect to the newly created database.\u003c/p\u003e\n"],["\u003cp\u003eFinally, you can test the updated agent by having a conversation to verify that it successfully queries the Spanner database instead of using hardcoded data to determine coverage, as demonstrated with Italy.\u003c/p\u003e\n"]]],[],null,["# Query a database\n\nYour webhook currently uses hardcoded data in the `cruisePlanCoverage` function.\nIn this step of the tutorial,\nyou will create a\n[Spanner](/spanner/docs)\ndatabase, populate it with covered destinations,\nand update your function to query the database.\n\nProject configuration\n---------------------\n\nIt is important that your Dialogflow agent and the database\nare both in the same project.\nThis is the easiest way for your function to have\nsecure access to your database.\nAlso, you must enable the Spanner API.\n\n1. Before creating the database,\n select your project from the Google Cloud console.\n\n [Go to project selector](https://console.cloud.google.com/projectselector2/home/dashboard)\n2. Enable the Spanner API for the project.\n\n [Enable the Spanner API](https://console.cloud.google.com/flows/enableapi?apiid=spanner.googleapis.com)\n\nCreate a Spanner instance\n-------------------------\n\nWhen you first use Spanner,\nyou must create an instance,\nwhich is an allocation of resources\nthat are used by Spanner databases in that instance.\n\n1. In the Google Cloud console, go to the **Spanner Instances** page.\n\n [Go to Spanner instances](https://console.cloud.google.com/spanner/instances)\n2. Click **Create instance**.\n\n3. For the instance name, enter **Tutorial Instance**.\n\n4. The instance ID is automatically entered based on the instance name.\n\n5. In **Choose your configuration** ,\n retain the default option **Regional** and select the same region\n [location](/dialogflow/cx/docs/concept/region#avail)\n that you chose when creating the function.\n\n6. In **Allocate compute capacity**,\n enter 100 processing units.\n This provides a minimal capacity for the tutorial.\n\n7. Click **Create** .\n The Google Cloud console displays the **Overview** page for the instance\n you created.\n\nCreate a Spanner database\n-------------------------\n\nNow that you have an instance,\nyou need to create a database.\nTo create a database:\n\n1. In the instance **Overview** page, click **Create database**.\n2. For the database name, enter **tutorial-database**.\n3. Select the **Google Standard SQL** database dialect.\n4. Click **Create** . The Google Cloud console displays the **Overview** page for the database you created.\n\nCreate a table for your database\n--------------------------------\n\nNow that you have a database,\nyou need to create a table for the database.\nTo create a table:\n\n1. In the Tables section of the database **Overview** page, click **Create table**.\n2. In the **Write DDL statements** page, enter:\n\n CREATE TABLE Destinations (\n Destination STRING(1024),\n Covered BOOL,\n ) PRIMARY KEY(Destination);\n\n3. Click **Submit** .\n The Google Cloud console returns to the database **Overview** page and\n shows that **Schema updates** are underway.\n Wait until the update is complete.\n\nInsert data into your table\n---------------------------\n\nNow that your database has a table,\nyou need to add data to the table.\nTo add data:\n\n1. In the list of tables on the database **Overview** page, click the Destinations table. The Google Cloud console displays the Destinations table's **Schema** page.\n2. In the left navigation menu, click **Data** to display the Destinations table's **Data** page.\n3. Click **Insert** .\n The Google Cloud console displays the Destinations table's **Query** page with a\n new query tab that contains `INSERT` and `SELECT` statements.\n Overwrite those statements with the following:\n\n INSERT INTO Destinations (Destination, Covered)\n VALUES('anguilla', TRUE),\n ('canada', TRUE),\n ('china', TRUE),\n ('italy', TRUE),\n ('mexico', TRUE),\n ('spain', FALSE);\n\n4. Click **Run**.\n\n5. In the left navigation menu,\n click **Data** again to display the Destination table's data.\n Confirm that the table contains the desired data.\n\nUpdate the Cloud Function to query the database\n-----------------------------------------------\n\nThe `cruisePlanCoverage` function in the webhook code\nchecks whether specific environment variables are set\nwith information for connecting to the database.\nIf these environment variables are not set,\nthe function uses a hardcoded list of destinations.\n\nNow that you have a database set up,\nupdate your Cloud Function to set required environment variables:\n\n1. Open the Cloud Functions overview page.\n\n [Go to Cloud Functions overview](https://console.cloud.google.com/functions/list)\n2. Click the tutorial-telecommunications-webhook function to go to its details page.\n\n3. Click **Edit**.\n\n4. Open the **Runtime, build and connections settings** section.\n\n5. Select the **Runtime** tab.\n\n6. Add the following variables in the Runtime environment variables section:\n\n - `PROJECT_ID`: your project ID\n - `SPANNER_INSTANCE_ID`: your Spanner instance ID (probably `tutorial-instance`)\n - `SPANNER_DATABASE_ID`: your spanner database ID (probably `tutorial-database`)\n7. Click **Next**.\n\n8. Click **Deploy**.\n\n9. Wait until the status indicator shows that the function\n has successfully deployed.\n\nTest your agent\n---------------\n\nYour agent is now ready to try.\nClick the **Test Agent** button from the Dialogflow console\nto open the simulator.\nAttempt to have the following conversation with the agent:\n\nIf you examine the code,\nItaly is not in the hardcoded list of covered destinations.\nThis means that your webhook has successfully connected to the database,\nwhich does include Italy.\n\nTroubleshooting\n---------------\n\nThe webhook code includes logging statements.\nIf you are having issues, try viewing the logs for your Cloud Function.\n\nIf your function is not connecting to the database,\nand you see a permission error in the logs,\nyou may need to fix the role for the default service account\nused by your function.\nThis service account is of the form\n\u003cvar translate=\"no\"\u003ePROJECT_ID\u003c/var\u003e`@appspot.gserviceaccount.com`.\nYou can fix this in one of the following ways:\n\n- If the default service account is shown on the IAM main page,\n [change permissions for the service account](/functions/docs/securing/function-identity#default).\n The *Editor* role will work,\n but you may want a more granular role in a production scenario.\n\n [Go to the IAM main page](https://console.cloud.google.com/iam-admin/iam)\n- If the a default service account is not shown on the IAM main page,\n [grant the required role](/iam/docs/grant-role-console#grant_an_iam_role)\n by adding the service account as a new principal.\n\n- Alternatively, you can\n [use a service account that you create](/functions/docs/securing/function-identity#individual).\n\nMore information\n----------------\n\nFor more information about the steps above, see:\n\n- [Using Cloud Spanner with Cloud Functions](/functions/docs/tutorials/use-cloud-spanner)\n- [Create and query a database by using the Google Cloud console](/spanner/docs/create-query-database-console)\n- [Google Standard SQL data definition language](/spanner/docs/reference/standard-sql/data-definition-language)\n- [Google Standard SQL data manipulation language](/spanner/docs/reference/standard-sql/dml-syntax)"]]