Руководство по бессерверным вычислениям и их развертыванию

бессерверным вычислениям Программирование и разработка

бессерверным вычислениям

За последние несколько лет бессерверные функции (иногда также называемые «бессерверными» или «бессерверными вычислениями») стали популярной технологией. Однако вокруг этого термина до сих пор существует много путаницы. Как можно запускать код без серверов? Каковы плюсы и минусы технологии? В каких ситуациях вы можете его использовать? В этой статье я надеюсь ответить на эти вопросы и дать вам хороший обзор технологии.

Что такое бессерверные функции?

Термин «бессерверный» наверняка вызовет любопытство, когда вы его впервые услышите. «Как запустить код в Интернете без сервера?» вы можете задаться вопросом. На самом деле это означает, что вам, как разработчику, не нужно беспокоиться о серверах, на которых работает ваш код. Предоставление оборудования, настройка сети, установка программного обеспечения и масштабирование — все это абстрагируется бессерверным провайдером.

С точки зрения разработки бессерверная функция — это пакет кода, который вы загружаете бессерверному провайдеру (например, AWS или Google). Этот код можно настроить для ответа на запросы через URL, запускать по расписанию (то есть через задание cron) или вызывать из других служб или бессерверных функций.

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

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

Преимущества бессерверных функций

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

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

Ключевым преимуществом бессерверной модели является отсутствие необходимости иметь дело с серверами. Запуск веб-приложения требует много времени и опыта в администрировании сервера, чтобы поддерживать программное обеспечение в актуальном состоянии с последними исправлениями безопасности и гарантировать, что сервер правильно настроен для обеспечения безопасности и производительности. Для стартапов и малых предприятий наем человека, который будет заниматься администрированием серверов, — это большие дополнительные накладные расходы. С бессерверным режимом разработчики могут сосредоточиться на создании решений.

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

Конечно, ни одна технология не идеальна, и бессерверные функции не лишены недостатков. Как я упоминал ранее, бессерверная модель разработана с учетом краткосрочных процессов. С максимальным временем выполнения, измеряемым в минутах (например, 15 на AWS и 9 на Google), он не подходит для длительных задач, таких как обработка больших пакетов данных.

Другой широко обсуждаемый вопрос — время холодного старта. Это время, необходимое поставщику для подготовки и инициализации контейнера для вашей бессерверной функции, прежде чем он будет готов к запуску. После того, как функция завершила работу, контейнер остается на короткое время для повторного использования, если код будет выполнен снова. Эта задержка «холодного старта» может добавить от полсекунды до секунды задержки к времени отклика вашей функции. Для этого есть обходные пути, в том числе плагин WarmUp Serverless framework, который проверяет вашу функцию по расписанию, чтобы поддерживать контейнер в рабочем состоянии.

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

Также существует проблема привязки к поставщику, которая иногда упоминается как обратная сторона бессерверной технологии. В настоящее время основные поставщики в этой сфере (AWS, Google, Azure) имеют свои собственные различные реализации и инструменты управления. Это может затруднить перенос бессерверного приложения от одного облачного провайдера к другому. Такие проекты, как Serverless Framework, пытались абстрагироваться от базовых сервисов, чтобы сделать приложения переносимыми между поставщиками.

Сценарии использования бессерверных функций

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

Форма рассылки

Нередко бывает, что веб-сайты являются полностью статичными, за исключением контактной формы, которую клиент хочет, чтобы он отправлял им по электронной почте, когда пользователь нажимает кнопку «Отправить». Хостинг-провайдер сайта может поддерживать или не поддерживать сценарии на стороне сервера, и даже в этом случае он может быть не на знакомом вам языке. Настройка бессерверной функции в качестве почтовой программы позволяет добавлять функциональность сайтам, находящимся на статическом хостинге.

Читайте также:  Ruby Tutorial for Python Programmers: как сделать переход

Cron работа

Иногда может потребоваться выполнение запланированной задачи в фоновом режиме. Обычно вам нужно платить за сервер, чтобы настроить задание cron, и этот сервер простаивает между заданиями. При использовании бессерверной функции вы платите только за время выполнения задания (и, возможно, совсем не платите, если оно находится в пределах бесплатного уровня).

Генератор эскизов

Представьте, что ваше приложение React позволяет пользователю загружать фотографию, которая будет использоваться в качестве аватара во всем приложении. Вы хотите изменить размер загруженного изображения, чтобы не тратить впустую пропускную способность, обслуживая изображения, которые намного больше, чем необходимо. Можно использовать бессерверную функцию для обработки запроса на загрузку, изменения размера изображения до требуемых размеров и сохранения в такой сервис, как S3 или Google Storage.

Практический пример бессерверной функции

Чтобы получить более практическое представление о работе с бессерверными функциями, давайте рассмотрим реальный пример. Мы создадим статическую страницу с формой подписки на рассылку новостей, которая использует бессерверную функцию для сохранения имени и адреса электронной почты пользователя в электронной таблице Google.

В зависимости от поставщика бессерверные функции могут быть написаны на разных языках, но мы собираемся использовать JavaScript, поскольку Netlify поддерживает функции Node.js. Я предполагаю, что у вас установлена ​​последняя версия Node / npm на вашем локальном компьютере, чтобы продолжить.

1. Зарегистрируйте учетную запись Netlify.

Мы собираемся использовать Netlify в качестве хоста для этого примера, поскольку они предоставляют бесплатный уровень, который включает бессерверные функции, и его очень легко установить и запустить. Во-первых, зайдите на их сайт и зарегистрируйтесь для получения бесплатной учетной записи.

2. Установите инструмент Netlify CLI.

Чтобы протестировать наш примерный сайт локально и развернуть его на Netlify, мы собираемся использовать их инструмент CLI. Его можно установить как глобальный модуль npm из командной строки:

npm install -g netlify-cli

После установки интерфейса командной строки выполнение следующей команды откроет окно браузера для подключения интерфейса командной строки к вашей учетной записи:

netlify login

3. Создайте папку проекта и установите зависимости.

Создадим папку для проекта и инициализируем новый проект npm:

mkdir serverless-mailinglist && cd serverless-mailinglist

npm init -y

Это настроит нас с package.jsonфайлом для проекта, готовым для установки зависимостей. Кстати, нам понадобится пара пакетов для нашей бессерверной функции:

npm install dotenv google-spreadsheet

Первый, dotenv, представляет собой пакет, который позволит нам загружать значения из.envфайла в корне нашего проекта и предоставлять их сценарию узла (наша бессерверная функция), как если бы они были переменными среды. Другой — это google-spreadsheet, пакет, который включает API Google Таблиц и упрощает работу с ним.

4. Включите API Google Таблиц и создайте учетные данные.

Чтобы использовать API Таблиц, нам нужно проделать небольшую подготовительную работу. Во-первых, вам нужно включить API для своей учетной записи Google, перейдя в консоль API. Создайте новый проект в меню вверху, а затем нажмите кнопку «Включить».

Как только это будет сделано, вам нужно будет создать учетную запись службы. Эта учетная запись предоставит вам набор учетных данных с необходимыми разрешениями для доступа к API. Для этого выполните следующие действия:

  1. Убедитесь, что вы находитесь на экране управления API Таблиц.
  2. Нажмите Учетные данныена левой боковой панели, затем нажмите + СОЗДАТЬ УЧЕТНЫЕ ДАННЫЕ и в раскрывающемся списке выберите Учетная запись службы.
  3. Заполните форму, выбрав имя для учетной записи сервиса. Выбранное имя и название проекта станут частью идентификатора учетной записи службы. Например, если вы назовете учетную запись «Список рассылки», а название проекта — «Sitepoint Serverless Demo», идентификатор будет примерно таким mailing-list@sitepoint-serverless-demo.iam.gserviceaccount.com. Щелкните СОЗДАТЬ.
  4. Вы можете пропустить оставшиеся два необязательных раздела на странице. Щелкните ПРОДОЛЖИТЬ,а затем ГОТОВО.
  5. Затем щелкните вновь созданную учетную запись службы. Это приведет вас к экрану с подробностями об учетной записи. Нажмите КЛЮЧИв верхнем меню, затем «Добавить ключ» и «Создать новый ключ». Выберите JSON в качестве типа ключа.
  6. Нажмите кнопку СОЗДАТЬ, и файл ключа JSON будет загружен на ваш компьютер. (Примечание: это единственнаякопия, так что храните ее в безопасности!)

5. Создайте страницу формы регистрации.

Давайте продолжим и создадим простую страницу регистрации, которая позволит пользователям отправлять свои данные в наш список рассылки. Создайте index.htmlфайл в корне проекта со следующим содержимым:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Sign Up For Beta Form</title>
    <link rel="stylesheet" href="style.css">
    <link href='https://fonts.googleapis.com/css?family=Lato:400,700' rel='stylesheet' type='text/css'>
  </head>
  <body>
    <form action="/.netlify/functions/subscribe" method="post">
      <div class="header">
         <p>Get Great Content Every Week</p>
      </div>
      <div class="description">
        <p>I publish new articles every week. Be sure to subscribe to my newsletter to make sure you never miss a post!</p>
      </div>
      <div class="input">
        <input type="text" class="button" id="name" name="name" placeholder="YOUR NAME">
      </div>
      <div class="input">
        <input type="text" class="button" id="email" name="email" placeholder="NAME@EXAMPLE.COM">
        <input type="submit" class="button" id="submit" value="SIGN UP">
      </div>
    </form>
  </body>
</html>

И style.cssфайл со следующими правилами:

body {
  background: #A6E9D7;
  font-family: 'Lato', sans-serif;
  color: #FDFCFB;
  text-align: center;
  background-image: url(https://images.pexels.com/photos/326311/pexels-photo-326311.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940)
}

form {
  width: 450px;
  margin: 17% auto;
}

.header {
  font-size: 35px;
  text-transform: uppercase;
  letter-spacing: 5px;
}

.description {
  font-size: 14px;
  letter-spacing: 1px;
  line-height: 1.3em;
  margin: -2px  45px;
}

.input {
  display: flex;
  align-items: center;
}

.button {
  height: 44px;
  border: none;
}

#email {
  width: 75%;
  background: #FDFCFB;
  font-family: inherit;
  color: #737373;
  letter-spacing: 1px;
  text-indent: 5%;
  border-radius: 5px   5px;
}

#name {
  width: 100%;
  background: #FDFCFB;
  font-family: inherit;
  color: #737373;
  letter-spacing: 1px;
  text-indent: 5%;
  border-radius: 5px;
  margin-bottom: 1em;
}

#submit {
  width: 25%;
  height: 46px;
  background: #E86C8D;
  font-family: inherit;
  font-weight: bold;
  color: inherit;
  letter-spacing: 1px;
  border-radius:  5px 5px ;
  cursor: pointer;
  transition: background .3s ease-in-out;
}

#submit:hover {
  background: #d45d7d;
}

input:focus {
  outline: none;
  outline: 2px solid #E86C8D;
  box-shadow:   2px #E86C8D;
}

6. Создайте бессерверную функцию для обработки формы.

Теперь, когда у нас есть форма, нам нужно создать код для бессерверной функции, которая будет обрабатывать запрос POST и сохранять данные в электронную таблицу Google через API. Чтобы Netlify мог развернуть нашу функцию, мы должны следовать их соглашению об именах и создать путь к папке netlify/functions/в нашей папке проекта.

Читайте также:  Что такое Vitejs?

Внутри этой новой папки функций создайте файл JavaScript subscribe.js:

if (!process.env.NETLIFY) {
  require('dotenv').config();
}

const { parse } = require('querystring');
const { GoogleSpreadsheet } = require('google-spreadsheet');

exports.handler = async (event, context) => {
  const doc = new GoogleSpreadsheet(process.env.GOOGLE_SPREADSHEET_ID_FROM_URL);

  await doc.useServiceAccountAuth({
    client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
    private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n')
  });

  await doc.loadInfo();
  const sheet = doc.sheetsByIndex[]; 

  try {
    if (event.httpMethod === 'POST') {
      /* parse the string body into a useable JS object */
      const data = parse(event.body);
      await sheet.addRow(data);

      return {
        statusCode: 302,
        headers: {
          Location: '/success.html'
        }
      };
    } else {
      return {
        statusCode: 500,
        body: 'unrecognized HTTP Method, must be POST'
      };
    }
  } catch (err) {
    console.error('error ocurred in processing ', event);
    console.error(err);
    return {
      statusCode: 500,
      body: err.toString()
    };
  }
};

Конфигурация Netlify по умолчанию означает, что файлы JavaScript по указанному netlify/functionsпути могут быть вызваны по /.netlify/functions/URL-адресу (обратите внимание на точку перед netlify) плюс имя файла минус расширение. Файл netlify/functions/subscribe.jsбудет доступен по относительному URL-адресу /.netlify/functions/subscribe.

Основным требованием для бессерверной функции на основе узла является экспорт функции-обработчика, которая будет вызываться, когда конечная точка получит запрос. Функции передаются два параметра. eventПараметр обеспечивает доступ к деталям запроса, таких как заголовки и метод HTTP. contextПараметр предоставляет доступ к информации о контексте, в котором функция была вызвана, в том числе сведения о идентифицированного пользователя, например.

Сам код функции подключается к Google Sheets API с предоставленными учетными данными. Затем он анализирует тело запроса и добавляет отправленное имя и адрес электронной почты в электронную таблицу через API. По завершении функция возвращает ответ 302, чтобы перенаправить пользователя на страницу успеха. (Создание этой страницы остается для читателя.)

Чтобы протестировать функцию локально, нам нужно создать.envфайл в корне проекта и добавить несколько переменных:

GOOGLE_SERVICE_ACCOUNT_EMAIL=mailing-list@sitepoint-serverless-demo.iam.gserviceaccount.com
GOOGLE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANB \\etc
GOOGLE_SPREADSHEET_ID_FROM_URL=1N8afdqnJjBhwXsvplIgU-5JoAFr3RapIrAS9oUybFnU

Электронная почта учетной записи службы — это та, которую вы создали на шаге 4, а закрытый ключ берется из файла ключа JSON, который вы скачали. Последний, идентификатор электронной таблицы, мы получим на следующем шаге.

7. Создайте таблицу и поделитесь ею

Перейдите в Google Таблицы и создайте новую электронную таблицу. Неважно, какой заголовок вы ему дадите, но запишите идентификатор из URL-адреса и добавьте его в.envфайл, который вы создали на последнем шаге.

В первой строке таблицы добавьте два заголовка столбцов: имя и адрес электронной почты (обратите внимание, что регистр должен совпадать с именами ввода из HTML-формы). Записи, созданные бессерверной функцией, будут добавлены ниже в виде дополнительных строк.

Теперь вы должны предоставить созданной вами сервисной учетной записи разрешение на доступ к электронной таблице. Нажмите кнопку «Поделиться» и введите адрес электронной почты учетной записи службы в поле ввода. Обязательно назначьте права редактора.

8. Протестируйте локально с помощью Netlify CLI.

Одной из приятных особенностей инструмента Netlify CLI является то, что он позволяет тестировать ваш код локально перед публикацией в их сервисе. Чтобы запустить сервер разработки, запустите следующее:

netlify dev

Автоматически откроется новая вкладка браузера с отображаемым сайтом. Заполнение и отправка формы запустит бессерверную функцию (обслуживается локально), а затем в случае успеха перенаправит ваш браузер. Если вы перейдете к своей электронной таблице в Google Таблицах, вы должны увидеть введенные вами данные в новой строке.

9. Разверните на Netlify

Инструмент CLI отлично справляется с имитацией службы Netlify, работающей локально на вашем компьютере, но если вы хотите увидеть, как проект работает на их серверах, вы также можете использовать CLI для публикации своего проекта.

Выполните следующую команду:

netlify deploy

Затем следуйте подсказкам. Ваш сайт, включая бессерверную функцию, будет опубликован в Интернете. Не забывайте, что вам также необходимо настроить переменные среды, чтобы они отображались в вашем.envфайле. Вы можете настроить их из панели администратора вашего сайта Netlify или с помощью инструмента командной строки:

netlify env:set VAR_NAME value

Заключение

Бессерверность одновременно осуждалась как причуда и провозглашалась будущим серверных приложений. Функции Amazon Lambda существуют с 2014 года и являются ключевым продуктом AWS. Конечно, по-прежнему существует множество ситуаций, когда необходимы гибкость и возможности реальных серверов, работающих круглосуточно, без выходных и с полным доступом к оболочке.

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

Оцените статью
bestprogrammer.ru
Добавить комментарий