Компания 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 и преобразователями. Посмотрите пример репозитория, чтобы увидеть все, что было до этого момента.