ГрафQL?

Если вы не знакомы с ним, GraphQL — это язык запросов данных, созданный Facebook. GraphQL позволяет клиенту выбирать специальные данные. Это отличает его от REST API, которые предоставляют предварительно заданные структуры данных.



Что такое GraphQL?
GraphQL — это один из самых современных способов создания API и запросов к ним.medium.com



Бессерверный?

Безсерверный паттерн побуждает разработчиков сосредоточить внимание на четко определенных элементах бизнес-логики, не принимая преждевременных решений по оптимизации, связанных с развертыванием или масштабированием этой логики.



Код

Настройка бессерверной среды

Прежде чем мы начнем, убедитесь, что на вашем компьютере установлены Node.js и npm. Вы можете проверить это, выполнив следующие команды:

node -v
npm -v

Затем установите Serverless Framework глобально:

npm install -g serverless

Теперь, когда у нас установлен Serverless Framework, давайте создадим новый проект Serverless:

serverless create --template aws-nodejs --path graphql-serverless

Это создаст новый бессерверный проект с использованием шаблона AWS Node.js в каталоге с именем graphql-serverless.

Установка необходимых библиотек

Чтобы запустить конечную точку GraphQL, нам нужно установить следующие библиотеки:

npm install apollo-server-lambda graphql

apollo-server-lambda — это библиотека, упрощающая запуск сервера Apollo GraphQL на AWS Lambda. graphql — это библиотека, обеспечивающая реализацию GraphQL.

Написание схемы GraphQL

Следующим шагом будет написание схемы GraphQL. Эта схема определяет типы и операции, которые можно выполнять над этими типами.

Создайте файл schema.js в каталоге graphql-serverless со следующим кодом:

const { gql } = require("apollo-server-lambda");

const typeDefs = gql`
  type Query {
    hello: String
  }
`;

module.exports = typeDefs;

Это простая схема, определяющая одну операцию hello, возвращающую строку.

Написание преобразователей GraphQL

Далее нам нужно написать резольверы. Резолверы — это функции, реализующие операции, определенные в схеме.

Создайте файл resolvers.js в каталоге graphql-serverless со следующим кодом:

const resolvers = {
  Query: {
    hello: (_, __, context) => {
      return "Hello, Serverless!";
    },
  },
};

module.exports = resolvers;

Этот преобразователь реализует операцию hello из схемы и возвращает строку "Hello, Serverless!".

Настройка сервера Apollo

Наконец, нам нужно настроить сервер Apollo.

Создайте файл handler.js в каталоге graphql-serverless со следующим кодом:

const { ApolloServer } = require("apollo-server-lambda");
const typeDefs = require("./schema");
const resolvers = require("./resolvers");

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

exports.graphqlHandler = server.createHandler();

Это настраивает сервер Apollo, используя typeDefs и resolvers из предыдущих разделов.

Настройка бессерверной функции

Теперь, когда у нас настроена конечная точка GraphQL, нам нужно настроить бессерверную функцию для ее запуска.

Обновите файл serverless.yml в каталоге graphql-serverless следующим кодом:

service: graphql-serverless
provider:
  name: aws
  runtime: nodejs12.x

functions:
  graphql:
    handler: handler.graphqlHandler
    events:
      - http:
          path: graphql
          method: post

plugins:
 - serverless-apollo-middleware

Это настраивает одну бессерверную функцию с именем `graphql`, которая будет запускаться запросом HTTP POST к конечной точке `/graphql`. Он также включает подключаемый модуль serverless-apollo-middleware, необходимый для работы сервера Apollo на AWS Lambda.

Развертывание бессерверной функции

Последним шагом является развертывание бессерверной функции в AWS. Запустите следующую команду в каталоге `graphql-serverless`:

serverless deploy

Это развернет функцию в AWS и вернет URL-адрес конечной точки GraphQL.

Тестирование конечной точки GraphQL

Вы можете использовать такой инструмент, как Insomnia или Postman, чтобы протестировать конечную точку GraphQL.

Создайте новый запрос POST к URL-адресу конечной точки GraphQL со следующим запросом в теле запроса:

query {
  hello
}

Отправьте запрос, и вы должны получить следующий ответ:

{
  "data": {
    "hello": "Hello, Serverless!"
  }
}

Непрерывная интеграция и развертывание (CI/CD) с использованием GitHub Actions

Чтобы автоматизировать процесс развертывания, мы можем настроить конвейер CI/CD с помощью GitHub Actions. Действия GitHub позволяют автоматизировать рабочий процесс, создавая настраиваемые действия, которые запускаются всякий раз, когда в вашем репозитории GitHub происходит определенное событие.

Создайте новый файл с именем .github/workflows/deploy.yml в своем репозитории GitHub со следующим кодом:

name: Deploy

on:
  push:
    branches:
      - main

env:
  AWS_REGION: us-east-1
  AWS_PROFILE: default

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Deploy to AWS
        uses: anothrNick/serverless-action@v1
        with:
          command: deploy

Это действие запускается всякий раз, когда выполняется отправка ветки main репозитория GitHub. Он использует действие anothrNick/serverless-action для развертывания бессерверной функции в AWS.

Обязательно замените AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY в приведенном выше коде фактическими значениями из вашей учетной записи AWS. Вы можете хранить эти значения как секреты в своем репозитории GitHub.

Заключение

В этой статье мы показали, как запустить конечную точку GraphQL с Serverless на AWS Lambda. Мы рассмотрели основы настройки сервера Apollo и его развертывания в качестве бессерверной функции. Мы также показали, как автоматизировать процесс развертывания с помощью GitHub Actions, что позволяет создать бесшовный конвейер CI/CD.

Используя Serverless, вы можете воспользоваться масштабируемостью и экономичностью AWS Lambda, сохраняя при этом простой и оптимизированный процесс разработки. Сочетание GraphQL и Serverless обеспечивает мощную платформу для создания и развертывания современных веб-приложений.

С помощью кода и шагов, описанных в этой статье, вы сможете приступить к работе с конечной точкой GraphQL с помощью Serverless и продолжить работу над этой основой для своих собственных проектов.