diff --git a/README.md b/README.md index 97a0a8d..6831f5c 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ Table of Contents: | **[Redis TLS](functions/redis-tls/README.md)**
How to connect a function to a Scaleway Redis cluster with TLS enabled. | python310 | [Serverless Framework] | | **[Rust MNIST](functions/rust-mnist/README.md)**
A Rust function to recognize hand-written digits with a simple neural network. | rust165 | [Serverless Framework] | | **[Terraform Python](functions/terraform-python-example/README.md)**
A Python function deployed with Terraform. | python310 | [Terraform] | +| **[PostgeSQL Node](functions/postgre-sql-node/README.md)**
A Node function to connect and interact with PostgreSQL database. | node18 | [Serverless Framework] | ### 📦 Containers diff --git a/functions/postgre-sql-node/README.md b/functions/postgre-sql-node/README.md new file mode 100644 index 0000000..6d23a9f --- /dev/null +++ b/functions/postgre-sql-node/README.md @@ -0,0 +1,60 @@ +# Interact with a PostgreSQL database using functions + +## Requirements + +This example assumes that you are familiar with some products of Scaleway's ecosystem: + * how serverless functions work. If needed, you can check [Scaleway official documentation](https://www.scaleway.com/en/docs/serverless/functions/quickstart/). + * how a managed database for PostgreSQL works, and especially how to create a database and create users with appropriate permissions. Please refer to scaleway's documentation [here](https://www.scaleway.com/en/docs/managed-databases/postgresql-and-mysql/quickstart/). + +This example uses the Scaleway Serverless Framework Plugin. Please set up your environment with the requirements stated in the [Scaleway Serverless Framework Plugin](https://github.com/scaleway/serverless-scaleway-functions) before trying out the example. + + +## Context + +This example shows how to connect to a managed PostgreSQL database and perform a query on it. This example can be extended to adding, deleting, or processing data within a database. + + +## Description + +The function connects to a PostgreSQL database and performs an example query on it. This example uses Node 18 runtime. Used packages are specified in `package.json`. + +## Setup + +### Create a managed PostgreSQL database + +Create a PostgreSQL database and a user profile with appropriate access permissions. + +### Fill environment variables + +Fill your secrets within `serverless.yml` file: + +``` +secret: + PG_HOST: "your host IP address" + PG_USER: "your database username" + PG_DATABASE: "your database name" + PG_PASSWORD: "your databse user password" + PG_PORT: "your database port" +``` + +### Install npm modules + +Once your environment is set up, you can install `npm` dependencies from `package.json` file using: + +``` +npm install +``` + +### Deploy and call the function + +Then deploy your function and get its URL using: + +``` +serverless deploy +``` + +From the given function URL, you can run your function using: + +``` +curl +``` \ No newline at end of file diff --git a/functions/postgre-sql-node/handler.js b/functions/postgre-sql-node/handler.js new file mode 100644 index 0000000..7760979 --- /dev/null +++ b/functions/postgre-sql-node/handler.js @@ -0,0 +1,53 @@ +const pg = require('pg') + +const PG_HOST=process.env.PG_HOST; +const PG_USER=process.env.PG_USER; +const PG_DATABASE=process.env.PG_DATABASE; +const PG_PASSWORD=process.env.PG_PASSWORD; +const PG_PORT=parseInt(process.env.PG_PORT,10); + +const pool = new pg.Pool({ + user: PG_USER, + host: PG_HOST, + database: PG_DATABASE, + password: PG_PASSWORD, + port: PG_PORT +}) + +exports.handle = async (event, context, callback) => { + try { + const { rows } = await query("SELECT * FROM table LIMIT 10") + console.log(JSON.stringify(rows[0])) + const response = { + "statusCode": 200, + "headers": { + "Content-Type" : "application/json" + }, + "body": JSON.stringify(rows), + "isBase64Encoded": false + }; + callback(null, response); + } catch (err) { + console.log('Database ' + err) + callback(err); + } + }; + +async function query (q) { + const client = await pool.connect() + let res + try { + await client.query('BEGIN') + try { + res = await client.query(q) + await client.query('COMMIT') + } catch (err) { + await client.query('ROLLBACK') + throw err + } + } finally { + client.release() + } + + return res +} \ No newline at end of file diff --git a/functions/postgre-sql-node/package.json b/functions/postgre-sql-node/package.json new file mode 100644 index 0000000..6e14379 --- /dev/null +++ b/functions/postgre-sql-node/package.json @@ -0,0 +1,15 @@ +{ + "name": "postgreSQL-node-example", + "version": "1.0.0", + "main": "handler.js", + "type": "commonjs", + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "pg": "^8.10.0" + }, + "devDependencies": { + "serverless-scaleway-functions": "^0.4.6" + } +} diff --git a/functions/postgre-sql-node/serverless.yml b/functions/postgre-sql-node/serverless.yml new file mode 100644 index 0000000..81929f3 --- /dev/null +++ b/functions/postgre-sql-node/serverless.yml @@ -0,0 +1,25 @@ +service: scaleway-node18 +configValidationMode: off +singleSource: false +provider: + name: scaleway + runtime: node18 + + secret: + PG_HOST: "your host IP address" + PG_USER: "your database username" + PG_DATABASE: "your database name" + PG_PASSWORD: "your databse user password" + PG_PORT: "your database port" + +plugins: + - serverless-scaleway-functions + +package: + patterns: + - '!.gitignore' + - '!.git/**' + +functions: + get-all-from-table + handler: handler.handle \ No newline at end of file