Компания JetClosing недавно выпустила версию 2 нашего приложения. Для этого выпуска мы разработали совершенно новую внутреннюю службу, которая использует GraphQL для своих API. В этой мини-серии будут описаны шаги, необходимые для настройки собственного готового к работе сервера GraphQL в AWS с использованием Serverless Framework, Node.js и ApolloServer. Он использует Lambda для запуска кода сервера, API Gateway для обслуживания нашего GraphQL API и DynamoDB в качестве нашего хранилища данных.
Создать Сервис
Для начала убедитесь, что у вас есть аккаунт AWS, настроенный и настроенный для бессерверного режима.
Затем мы хотим сгенерировать наш сервис, используя один из шаблонов. Выполните следующие команды в своем терминале, заменив my-graphql-service
именем вашей службы:
mkdir -p ~/my-graphql-service cd ~/my-graphql-service npx serverless create --template aws-nodejs-ecma-script -n my-graphql-service yarn install
Использование шаблона гарантирует, что мы используем новейшие стандарты; однако это требует некоторой очистки:
- Добавить заблокированную версию бессерверной версии:
yarn add -D serverless
- Удалить примеры обработчиков:
rm first.js second.js
- В файле
serverless.yml
удалите все, что находится подfunctions
Затем мы захотим добавить в нашу службу несколько улучшенных параметров по умолчанию. В serverless.yml
мы хотим добавить следующее в поле provider
:
provider: # Generated code... apiGateway: minimumCompressionSize: 1024 # Enable gzip compression for responses > 1 KB environment: SERVICE: ${self:service} STAGE: ${opt:stage} AWS_NODEJS_CONNECTION_REUSE_ENABLED: 1 # Use http keep-alive for AWS connections
Добавим зависимости GraphQL и ApolloServer:
yarn add graphql apollo-server-lambda graphql-tag graphql-tools
Создайте GraphQL API
Создайте файлы GraphQL и схемы index.js
:
mkdir -p src/graphQl/schema && touch src/graphQl/index.js && touch src/graphQl/schema/index.js
Поскольку мы только настраиваем сервер, мы создадим временную схему GraphQL для тестирования. Добавьте в индексный файл схемы следующее:
Теперь мы можем настроить наш код обработчика GraphQL. Обновите свой индексный файл GraphQL:
Вы заметите, что мы включили самоанализ, когда prod
этап не используется. Если вы разрабатываете общедоступный API, вы всегда должны включать его, чтобы ваши потребители API могли просматривать документацию.
Добавьте функцию GraphQL в ваш serverless.yml
файл в поле functions
:
functions: graphQl: handler: src/graphQL/index.graphQlHandler events: - http: path: /graphql method: post cors: true
Теперь у нас есть работающий сервис GraphQL, который можно развернуть! Вы можете протестировать развертывание dev, выполнив:
yarn serverless deploy -s dev
Настроить GraphQL Playground
Вызвать GraphQL API вручную сложно, поэтому мы собираемся настроить среду GraphQL Playground, чтобы упростить ручное тестирование нашего API.
Установите зависимости GraphQL Playground:
yarn add graphql-playground-middleware-lambda aws-lambda
Добавьте обработчик игровой площадки в свой индексный файл GraphQL:
import lambdaPlayground from 'graphql-playground-middleware-lambda'; export const playgroundHandler = lambdaPlayground({ endpoint: `/${process.env.STAGE}/graphql`, });
Теперь добавьте функцию игровой площадки в файл serverless.yml:
functions: # Existing graphQl function playground: handler: src/graphQL/index.playgroundHandler events: - http: path: /playground method: get cors: true
Вы можете подумать о защите API игровой площадки, если ваш API не является общедоступным
Теперь давайте развернем наш сервис, чтобы мы могли использовать игровую площадку:
yarn serverless deploy -s dev
Вы должны увидеть такой результат развертывания:
Возьмите конечную точку игровой площадки и вставьте ее в свой браузер. Он должен загрузить игровую площадку и позволить вам просмотреть нашу временную схему и запросить поле ping
.
Дополнительный кредит: модульные тесты
Мы будем использовать Jest для нашего тестового фреймворка. Добавьте зависимости и инициализируйте проект:
yarn add -D jest babel-jest @babel/core @babel/preset-env yarn jest --init
Создайте babel.config.js
файл в корне вашего проекта:
Теперь вы можете создавать несколько модульных тестов.
Следите за Инженерным блогом JetClosing и следите за новостями о следующей части, которая будет включать создание данных API с соответствующей схемой GraphQL и преобразователями. Посмотрите пример репозитория, чтобы увидеть все, что было до этого момента.