ГрафQL?
Если вы не знакомы с ним, GraphQL — это язык запросов данных, созданный Facebook. GraphQL позволяет клиенту выбирать специальные данные. Это отличает его от REST API, которые предоставляют предварительно заданные структуры данных.
Бессерверный?
Безсерверный паттерн побуждает разработчиков сосредоточить внимание на четко определенных элементах бизнес-логики, не принимая преждевременных решений по оптимизации, связанных с развертыванием или масштабированием этой логики.
Код
Настройка бессерверной среды
Прежде чем мы начнем, убедитесь, что на вашем компьютере установлены 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 и продолжить работу над этой основой для своих собственных проектов.