Example on how to implement a basic GraphQL subscriptions using Yandex Cloud Serverless ecosystem
Resources required:
- YDB
- 3 Cloud functions
- Api Gateway
As of now WebSocket and YDB features are not supported by YC's terraform
or serverless
, so we are to create resources and execute migrations manually.
- Create a folder
- Create a service-account. For simplicity give this account admin role to the folder. In production the role should be more granular
- Create
graphql-websocket-connect
function - Create
graphql-websocket-message
function - Create
graphql-websocket-disconnect
function - Create a YDB database in a serverless mode
- In the database console execute SQL queries from /src/migrations/ consequently
- Create Api Gateway with config similar to this:
openapi: 3.0.0
info:
title: Sample API
version: 1.0.0
paths:
/:
x-yc-apigateway-websocket-connect:
x-yc-apigateway-integration:
type: cloud_functions
function_id: <graphql-websocket-connect id>
tag: $latest
service_account_id: <service-account id>
x-yc-apigateway-websocket-message:
x-yc-apigateway-integration:
type: cloud_functions
function_id: <graphql-websocket-message id>
tag: $latest
service_account_id: <service-account id>
x-yc-apigateway-websocket-disconnect:
x-yc-apigateway-integration:
type: cloud_functions
function_id: <graphql-websocket-disconnect id>
tag: $latest
service_account_id: <service-account id>
Note that function_ids and service_account_id should be replaced with corresponding data. As long as you keep the ids you can specify any name for the function. In production this should be configured with terraform and CI scripts
- Install packages using
npm ci
- Create service account with at least functions.editor role
- Create and save authorized key for this account
- Create and fill
.env
file in the repository root accordingly to example.env - Execute
npm dev
This is gonna upload the functions to the cloud and start watch mode for development
https://studio.apollographql.com/sandbox/explorer can be used for GraphQL query\subscription testing after deployment
This project uses several tools some of which might be considered unorthodox:
Production solution to generate typescript and resolver definitions from GraphQL Schema
One of the fastest Typescript to Javascript compilers
WIP project to simplify working with Yandex Database
Plugin for esbuild which makes development process faster