GraphQL Serverless API в Yandex Cloud
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
чтобы знать какие функции нужно развернуть в облаке. Так как вы создавали проект из шаблона в папке уже будет заполненный конфиг.
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.