Рубрики
Uncategorized

Как я заставил AWS Lambda работать для моего SaaS

Использование AWS Lambda эффективно для моего SaaS потребовало немного работы. Вот как мы это сделали. Tagged SaaS, DevOps, AWS, Node.

Большая часть проверки работает на AWS Lambda, но я никогда не обсуждал это подробно в этом блоге. Итак, вот и мы.

Темы:

  • Немного на нашей настройке Lambda.
  • Почему Lambda — почти идеальная подход для SaaS. Особенно, когда ты маленький.
  • Почему я не использую «большую» структуру вокруг него.
  • Почему распределенные фоновые задания, вызванные очередями, являются выражением Lambda.
  • Почему мониторинг и ведение журнала все еще являются проблемой.

Обратите внимание, что я использую «rambda» здесь в качестве подставки для «без сервера» в целом. Многие из вещей, обсуждаемых здесь, относятся к любому Google Cloud Functions , Функции Azure и возможно Zeit Хотя я никогда не использовал это.

Сначала что -то о том, как мы используем лямбду. На прошлой неделе мы прошли более 35 миллионов чеков. Все чековые прогоны для проверки находятся на Lambda и были, по крайней мере, последние 12 месяцев или около того.

У нас даже есть раздел метриков тщеславия на домашней странице Checkly, которая обновляется в значительной степени вживую.

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

Больше данных о нашей настройке Lambda:

  • Мы запускаем три основных функции во всех Регионы AWS Анкет Они обрабатывают проверки API, проверки браузера и сценарии настройки/разрыва. Проверьте Наши документы Чтобы узнать, что это значит.
  • Все функции подключены к SNS Темы но также может быть вызвано непосредственно через вызовы AWS SDK. Подробнее об этом позже.
  • Самая загруженная функция — это функция сантехники, которая направляет данные в нашу базу данных. Он вызывается где -то от 7000 до 10,000 раз в час со средней продолжительностью около 179 мс.
  • Мы запускаем отдельные DEV и тестируемые версии каждой функции в каждой области.

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

Обратите внимание, что призывы непосредственно связаны с тем, как часто проверяет, чтобы вы могли запускать чеки: каждая минута для проверки API, каждые 5/10 минут для проверки браузера.

Вы получите это сейчас. Мы используем Lambda, по крайней мере, в каком -то масштабе. Далее.

Мы запускали проверки браузера на виртуальных машинах с Docker. Прочитайте это старое сообщение в блоге о том, как работало решение VM/Docker.

Lambda отлично подходит для ранних, загруженных саас -компаний по этим трем причинам. По крайней мере, они были для меня:

  1. Это сохраняет ваши переменные затраты низкими или несуществующими. Если никто не использует его, вы не платите за это. Поиск CAPEX против OPEX.
  2. Если люди начинают использовать ваш SaaS, масштаб на 100% прозрачен и автоматически. Нет автоматических групп, нет Heroku PS: Scale команды Ваш счет также увеличится.
  3. Вы можете развернуть функции во всех регионах, позволяя вам предложить специфику региона ваших клиентов. Опять же, если у вас нет клиентов, использующих этот регион, вы ничего не платите. Но вы все равно можете предложить это и использовать его в качестве аргумента продаж. Настройка этого с помощью EC2 будет намного дороже.

Итак, там ничего нового Анкет Это маркетинговая реклама для любого без серверного решения. Но это на 100% верно по моему опыту. Хороший маркетинг работы!

Чтобы развернуть функцию лямбды, вы можете Загрузить файл .zip с вашим кодом в S3 или непосредственно в Lambda. Я бы этого не рекомендовал. В конечном итоге вы напишете огромное количество сценариев Bash для фильтрации, сортировки и проверки ошибок.

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

Я выбрал Узел-ламбда , специфический набор инструментов Node.js где -то между ними, просто используя AWS SDK напрямую и обширные джунгли без серверов. Вот почему это работает для меня и для проверки

  • Он обрабатывает упаковку и загрузку с помощью повторных изделий, проверки ошибок и счетчиков прогресса.
  • Это только Время выполнения одиночного языка Анкет Это делает структуру намного проще. Кроме того, он придерживается Экосистемные шаблоны Вы привыкли и не заставляют вас выучить совершенно новый дерьмовый DSL. Если вы используете Python или Java, вероятно, есть что -то подобное. Обратите внимание, что мне действительно не нравится без серверов …
  • У него достаточно крючков, чтобы Настройте сборку , то есть: Post Install Hook позволяет запустить сценарий Bash для изменения вашего пакета перед загрузкой. Я использую это, чтобы летать в некоторых пользовательских двоичных файлах хрома и скручивания, которые существуют вне моего обычного пакета NPM.

Единственное, чего не хватает, — это опция «Построить один раз и развернуть Multi Region». Но это всего лишь пара линий.

#!/usr/bin/env bash

declare -a arr=("us-east-1" "us-east-2" "us-west-1")

npm run package

for i in "${arr[@]}"
do
   AWS_REGION=$i npm run deploy
done

Lambda очень хорошо подходит для фоновых рабочих мест. Вот почему

  • Запуск Lambda’s сообщений SNS или SQS работает абсолютно блестяще. Как SQ, так и SN также являются чрезвычайно простыми и стабильными частями экосистемы AWS.
  • SNS и SQS поставляются с различными встроенными режимами повторения и отказа. Тем не менее, вам необходимо проверить на идентичность, так как сообщения могут быть доставлены более одного раза в редких случаях. В случае использования Checkly все в порядке, если некоторые сообщения обрабатываются дважды. В 35 м+ мы бежали, это не произошло раз, насколько я могу судить.
  • Холодные времена старта Не имеет значения, так как ваша работа не должна доставлять синхронный ответ пользователю. Это повторяющаяся проблема при использовании Lambda подключенного API Gateway и использования его для обслуживания запросов пользователей.
  • Недавние AWS Lambda Layers Добавление чрезвычайно полезно для нетривиальных функций. Мы используем его для загрузки бинарного хрома, используемого кукловодом. Это означает, что мы можем использовать код функции, не ожидая больших загрузок на каждом толчке кода.
  • Не нужно хлопотать с API -шлюзом или другим — довольно сложным — частями системы AWS Eco.

Вот диаграмма того, как работает проверка настройки.

  1. Процесс планировщика считывает все проверки из базы данных и на основе того, где они настроены для запуска — помните сборщик региона? — подчиняет их в тему SNS в определенном регионе.
  2. Функция проверки API запускается сообщением по этой теме и выполняет полезную нагрузку. Результат представлен в одну тему «Результаты».
  3. Функция «Передока» запускается, после обработки полезной нагрузки результата и перенаправляет ее в очередь SQS. Эта очередь обрабатывается за пределами инфраструктуры Lambda, где она хранится в базе данных и используется для оповещения, панели панелей и т. Д.

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

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

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

Для этого мы делаем две вещи:

  1. Мы вызываем функцию, просто используя стандартный aws node.js sdk в простом классе обертки.
const Aws = require('aws-sdk')
const lambda = new Aws.Lambda()
export default class ApiCheckRunner {

  constructor () {
    this.params = {
      FunctionName: 'api-checker'
      InvocationType: 'RequestResponse',
      LogType: 'None'
    }
  }

  run (check) {
    return new Promise((resolve, reject) => {
      this.params.Payload = JSON.stringify(check)
      lambda.invoke(this.params, (err, res) => {
        return resolve(JSON.parse(res.Payload))
      })
    })
  }
}
  1. В коде функции мы проверяем, запускается ли функция прямым вызовом или сообщением SNS. Мы делаем это по разным причинам. Главным образом потому, что мы не хотим представлять результаты проверки отладки в обработку метрик вниз по течению, и они окажутся в «официальных» результатах.
async function handler (evt, ctx) {
  const isSnsMessage = evt.Records && evt.Records[0].EventSource === 'aws:sns'

  if (isSnsMessage) {
    // handle as non-interactive background job
  } else {
    // handle as ad hoc, interactive call
  }
}

Мониторинг и регистрация на AWS Lambda не на высшем уровне, но, по общему признанию, это становится лучше. Каковы проблемы?

  1. Журналы AWS CloudWatch ужасны Анкет Поиск ужасен, макет ужасен, фильтрация ужасна. Это действительно последняя среда для отладки странных проблем. Если вы можете, подключите стороннее решение, такое как Papertrail.
  2. Метрики AWS CloudWatch неплохо. Это используется и все время становится лучше. Но Это не делает метрики перекрестных регионов Анкет Так что нет способа взглянуть на частоту ошибок Lambda в США-Востоку-1 и US-EAST-2 на одном графике. По общему признанию, именно так регионы AWS работают для всей экосистемы.
  3. Вы можете иметь свой собственный, Пользовательские метрики Рядом с местными метриками AWS, но это дорого! Скажем, вы записываете 1 пользовательскую метрику в секунду. Это 60 * 60 * 24 * .592.000 Точки данных. Стоимость AWS CloudWatch будет 2,592,000 * 0,02 = 51 долл. США. НДС.

Пока я использую Appoptics Анкет В течение менее 30 долларов в месяц он принимает все мои соответствующие Cloudwatch, Heroku и пользовательские метрики и позволяет мне создавать пользовательские панели мониторинга.

Это, в свою очередь, позволяет мне быстро переключаться между метриками логики приложений — количеством отправленных SMS, Slack Clocks, называемыми и т. Д. — и облачными метриками AWS довольно быстро. Вот пример:

  1. Эта приборная панель сочетает в себе прямые метрики AWS Lambda с пользовательскими метриками. Например, «продолжительность запуска» — это пользовательская метрика, так как общее время выполнения Lambda включает в себя некоторую логику настроек и разрыва, которая не интересна для меня. Этот показатель конкретно измеряет, как долго проходит сессия кукловода, а не сколько времени заняло общее вызыв Lambda. Метрики записываются с использованием стандартного API Appoptics REST.
  2. Верхний ряд графиков показывает, что Lambda работает по всем регионам. Супер, очень полезный, чтобы мгновенно увидеть, что такое самый загруженный регион и где дела идут некотны. Но мы также можем выбрать регион и иметь некоторые конкретные счетчики на нем-см. Панели США-Запад-1.

Оригинал: «https://dev.to/checkly/how-i-made-aws-lambda-work-for-my-saas-338k»