Перейти к основному содержимому

GraphQL Serverless API в Yandex Cloud

· 3 мин. чтения

Yandex Cloud Serverless Functions позволяют развертывать приложения в облаке не тратя время на администрирование серверов. Вы платите только за те ресурсы, которые ваше API потребляет обрабатывая запросы пользователей. Этот пост расскажет как развернуть Apollo Server 2 в Yandex Cloud Functions.

Перед тем как начать:

  • Создайте аккаунт в Yandex Cloud
  • Установите Yandex Cloud CLI и залогиньтесь своим аккаунтом
  • Установите Serverless фреймворк и плагин для Yandex Cloud. Он понадобится чтобы удобно деплоить наш код в облако. npm install -g serverless serverless-yandex-cloud

Создадим приложение

Для начала создайте папку и инициализируйте там новый Serveless проект из шаблона:

serverless create --template-url https://github.com/nikolaymatrosov/yc-apollo-function/tree/master/template \
--path yc-apollo

Теперь мы можем перейти в него:

cd yc-apollo

И посмотреть содержимое проекта. Для начала нам нужно задать схему и резолверы, и передать их как и обычно в конструктор ApolloServer. Однако, ApolloServer мы импортируем из ./yc-apollo-serve. Эта папка содержит дополнительные обертки, которые упрощают интеграцию с рантаймом функций в Yandex Cloud.

Также важно отметить, что файл должен называться именно graphql.js, так как именно оно указано в конфигурационном файле serverless фреймворка.

import {ApolloServer, gql, IResolvers} from './yc-apollo-server';

// Construct a schema, using GraphQL schema language
const typeDefs = gql`
type Query {
hello(name: String): String
}
`;

// Provide resolver functions for your schema fields
const resolvers: IResolvers = {
Query: {
hello: (parent, args, context, info) => `Hello ${args.name || 'world'}!`,
},
};

const server = new ApolloServer({
typeDefs,
resolvers,
playground: true,
});

exports.graphqlHandler = server.createHandler();

Обратите внимание на последнюю строку. Там мы экспортируем функцию graphqlHandler она будет выступать обработчиком запросов и вызываться Yandex Cloud’ом.

Деплой

Serverless использует serverless.yml чтобы знать какие функции нужно развернуть в облаке. Так как вы создавали проект из шаблона в папке уже будет заполненный конфиг.

serveless.yaml
service: yc-apollo-function
frameworkVersion: ">=1.1.0"
configValidationMode: off

provider:
name: yandex-cloud
runtime: nodejs12-preview

plugins:
- serverless-yandex-cloud

package:
exclude:
- ./**
include:
- ./package.json
- ./*.js
- ./yc-apollo-server/*.js

functions:
graphql:
# this is formatted as <FILENAME>.<HANDLER>
handler: graphql.graphqlHandler
memory: 128
timeout: 5

Остается скомплировать TypeScript и запустить деплой.

npm i
npx typescript -b ./tsconfig.json
serverless deploy

Что делает Serverless? Он собирает все файлы указанные в секции конфига package в архив и загружает его в Yandex Cloud.

Запуск

Так как в примере ApolloServer сконфигурирован с параметром playground: true мы можем зайти в консоль Yandex Cloud, сделать ее публичной и запустить демо-стенд чтобы проверить, что все работает.

Перейдя по ссылке для вызова мы увидим приложение.

Больше про Apollo Playground можно прочитать тут.

Также API можно проверить вызвав его при помощи curl.

curl 'https://functions.yandexcloud.net/d4eh1293j6e7flul4e9n' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
--data-binary '{"query":"query FooQuery {\n hello(name: \"Foo\")\n}\n"}' \
--compressed

В ответ получим

{"data":{"hello":"Hello Foo!"}}

Ура у нас есть работающее GraphQL API.