Delivering responses to a database using Cloud Functions
Written by
Updated at February 19, 2024
You can deliver form responses to a PostgreSQL database created in Yandex Cloud and store them there.
Step 1. Create a database
- Go to the Yandex Cloud management console
and select the folder where you want to create a database. - In the left-hand panel, click
and select Yandex Managed Service for PostgreSQL. - In the top-right corner, click Create cluster.
- Configure the cluster:
- Under Basic parameters, fill in the Cluster name field. The name may contain uppercase and lowercase Latin letters, numbers, underscores, and hyphens.
- Under Database, fill in the DB name and Username fields. The names may contain uppercase and lowercase Latin letters, numbers, underscores, and hyphens.
- Under Database, fill in the Password field.
- Under Database, set the Locale for sorting (LC_COLLATE) and Charset locale (LC_CTYPE) fields to en_US.UTF8. Once you create a database, you cannot change these parameters.
- Under Additional settings, enable Access from the management console and Serverless access.
- Configure other parameters if needed. For more information, see Creating an PostgreSQL cluster.
- Click Create cluster.
- Wait until the new cluster's Availability field changes to Alive.
Step 2. Create a table
- Go to the page of the created cluster.
- In the left-hand panel, click SQL.
- Select the appropriate username and database, enter the password, and click Connect.
- Select the public schema.
- Run the following query in the SQL editor:
create table answers( id serial primary key, answer jsonb, created timestamp with time zone default now() );
Step 3. Create a connection to the database
- In the management console
, return to the folder with the new cluster. - In the left-hand panel, click
and select Cloud Functions. - In the left-hand panel, click
. - In the top-right corner, click Create connection.
- Set up a connection:
- Fill in the Name field. The name may only contain lowercase Latin letters, numbers, and hyphens.
- In the Type field, select PostgreSQL.
- Fill in the Cluster, Database, User, and Password fields. Enter the same field values as you set when creating your cluster in step 1.
- Click Create.
- Go to the connection page and copy the Entry point field value.
Step 4. Create a service account
- In the management console
, return to the folder with the new cluster. - In the top-right corner, click
→ Create service account. - In the service account creation window, fill in the following fields:
- Name; it may only contain lowercase Latin letters, numbers, and hyphens.
- Description; it may contain any characters.
- In the Roles in folder field, add the following roles:
serverless.functions.invoker
serverless.mdbProxies.user
- Click Create.
Step 5. Create a service account key
- In the management console
, return to the folder with the new cluster. - Go to the Service accounts tab.
- Select the account you need.
- In the top panel on the account page, click Create new key → Create API key.
- Provide a brief description for the key.
- Click Create.
- This will open a window with the key ID and the secret key. Store them in a secure place. You will not be able to access them after you close the window.
Step 6. Create a cloud function
-
In the management console
, return to the folder with the new cluster. -
In the left-hand panel, click
and select Cloud Functions. -
In the top-right corner, click Create function.
-
On the function creation page, fill in the following fields:
- Name; it may only contain lowercase Latin letters, numbers, and hyphens.
- Description; it may contain any characters.
-
Select the Python programming language.
-
Create a file named
requirements.txt
and add the following line to it:psycopg2
-
Create or edit a file named
index.py
:import json import psycopg2 def run_function(connection, answer, **params) -> int: data = { 'answer': answer, 'params': params, } args = (json.dumps(data), ) with connection.cursor() as c: c.execute('insert into answers(answer) values(%s) returning id', args) rs = c.fetchone() connection.commit() return rs[0] def get_connection(context): return psycopg2.connect( database="<connection_ID>", user="<username>", password=context.token["access_token"], host="<entry_point>", port=6432, sslmode="require", ) def handler(event, context): body = json.loads(event.get('body')) params = { name: value for name, value in body.items() if name != 'answer' } connection = get_connection(context) result = { 'id': run_function(connection, body.get('answer'), **params), } return { 'statusCode': 200, 'body': result, 'headers': { 'Content-Type': 'application/json', } }
Substitute the following values in this function:
<connection_ID>
: Value of the ID field of the database connection you created in step 3. You can copy it on the connection page.<username>
: Database user name that you specified in the cluster settings in step 1. You can find it in the Users tab on the cluster page.<entry_point>
: Value of the Entry point field of the database connection you created in step 3. You can copy it on the connection page.
-
Click Save changes.
-
On the function page, copy the value from the ID field.
Step 7. Set up integration
- Go to the form whose responses you want to deliver to the database and select the Integrations tab.
- Select a group of actions to set up issue creation in and click Cloud Functions at the bottom of the group.
- In the Function code field, paste the function ID that you copied in the previous step.
- Under Parameters, you can optionally select additional parameters to be transferred to the function.
- Click Save.
From now on, all responses from this form will be additionally saved to your database in the answers table.