Если вы
Amazon Web Services (AWS) — это набор инструментов для разработчиков, которые Amazon разрабатывает и публично предлагает. Эта статья поможет вам начать работу с Lambda, инструментом в наборе AWS. Мы будем использовать Lambda для создания конечной точки HTTP GET, которая будет отправлять запросы с использованием GitHub API, чтобы получать информацию о репозитории из GitHub и возвращать ответ JSON.
Слоган Lambda — «Запускайте код, не думая о серверах». На первый взгляд это может показаться запутанным. Где и как тогда работает код? Давайте узнаем.
Чтобы следовать этой статье, вам потребуется собственная учетная запись AWS. Вы можете создать бесплатную учетную запись AWS на сайте aws.amazon.com.
Создавайте бессерверные микросервисы с помощью Node.js и AWS Lambda
Бессерверные решения и функции как услуга
«Бессерверный» — это термин программной инфраструктуры, о котором вы, возможно, слышали. В нем описывается решение для выполнения кода по требованию. Термин «бессерверный» может ввести в заблуждение, потому что в уравнении все еще есть серверы. Лучшее описание — FaaS или «функционирует как услуга».
Оба определения описывают новый опыт разработки и развертывания. Этот опыт считается «бессерверным», потому что вам, как разработчику, больше не нужно управлять, отслеживать или масштабировать
Плюсы и минусы бессерверной архитектуры
Учитывая это расширенное определение «бессерверной» архитектуры, давайте рассмотрим некоторые плюсы и минусы при работе с Lambda.
Плюсы
Цены на использование по запросу.
Традиционный серверный хостинг использует повторяющийся цикл выставления счетов. Ваш сервер всегда включен и работает, используя ресурсы и ожидая ввода. Вы платите ежемесячную или ежегодную плату, чтобы поддерживать его работу в течение всего платежного цикла. С Lambda вы платите только за используемые вычислительные ресурсы, а не за время простоя. У Lambda есть две модели ценообразования за использование: продолжительность и параллелизм.
Ценообразование
продолжительности Ценообразование длительности Lambda вычисляет цены на основе времени, когда функция начинает выполняться до ее завершения. Этот расчет цены выгоден для проектов, использующих кратковременные вычислительные ресурсы. Вы можете сэкономить значительную сумму денег по сравнению с традиционными «неактивными» хостинговыми решениями.
Цены на продолжительность лямбда следующие:
0,20 доллара США за 1 миллион запросов
0,00001667 долларов США за каждый
Стоимость продолжительности зависит от предварительно настроенного использования памяти развернутой функцией. Эта изменчивость продолжительности и памяти создает матрицу ценообразования, которая более подробно описана на странице цен Lambda.
Ценообразование в режиме параллелизма Ценообразование
в режиме Provisioned Concurrency рассчитывается с момента его включения до отключения. Режим параллелизма поддерживает готовность
Цены на параллелизм Lambda следующие:
Provisioned Concurrency — 0,0000041667 USD за каждую
Запросы составляют 0,20 доллара США за 1 млн запросов.
Продолжительность составляет $0,0000097222 за каждый
Страница с ценами на AWS содержит дополнительные сведения и примеры матрицы ценообразования. Узнайте больше на странице цен на Lambda.
Встроенное автоматическое масштабирование
В традиционной размещенной инфраструктуре наступает момент, когда вам может понадобиться беспокоиться о производительности и масштабировании. По мере увеличения трафика и использования вашего приложения вам может потребоваться добавить в вашу инфраструктуру дополнительные размещенные серверы, чтобы не отставать от спроса. Самоуправляемое масштабирование может привести к сбоям и узким местам для ваших пользователей. Lambda позаботится об автоматическом масштабировании, когда это необходимо, устраняя дополнительные когнитивные накладные расходы.
Минусы
Несогласованный рабочий процесс локальной разработки.
Вы можете написать код функции Lambda локально и протестировать его изолированно. Тем не менее, вы не сможете смоделировать производственную среду локально, не создав свою хакерскую версию Lambda.
Ключевые понятия Lambda: код и триггеры
В Lambda есть два основных понятия: код и триггеры. Код говорит сам за себя. В нашем случае это код JavaScript, который вы пишете и загружаете в Lambda для получения желаемого поведения.
После загрузки код не будет выполняться сам по себе. Здесь на помощь приходят триггеры. Триггеры — это события, запускаемые другими сервисами AWS, которые передают данные в функцию Lambda для выполнения.
Некоторые примеры триггеров видны, когда:
событие запускается с интервалом, как задание cron из CloudWatch Events
таблица DynamoDB обновляется и запускает
Сигнатура функции
Вы определяете функцию Lambda, экспортируя обычную функцию из JavaScript, которая соответствует ожидаемой подписи Lambda:
exports.myLambdaFunction = (event, context, callback) => {
// Use callback () and return
}
Функция получает три аргумента:
event: словарь пар
context: внутренняя информация AWS, такая как идентификатор запроса AWS, время ожидания истечения срока действия Lambda и информация журнала. Дополнительные сведения см. в документации по Lambda.
callback: стандартный асинхронный обработчик обратного вызова JavaScript. Для получения дополнительной информации см. документы Lambda.
Построение
Чтобы приступить к созданию новой функции Lambda, посетите панель управления Lambda.
Это должно выглядеть примерно так:
Приборная панель Лямбда
Нажмите кнопку «Создать функцию «, чтобы начать.
Создать функцию
Следующий экран предложит вам несколько вариантов создания
Параметры создания лямбды
Варианты:
Автор с нуля
Используйте план
Образ контейнера
Просмотрите репозиторий бессерверных приложений
Для наших целей выберите Автора с нуля и заполните раздел «Основная информация». Добавьте имя функции. (Я использовал «GithubGet» ниже.) Нажмите функциональную кнопку «Создать», чтобы продолжить.
Обзор функций
Теперь мы находимся на экране обзора функций.
Обзор функций
Верхняя панель обзора функций содержит триггер функций, функцию и назначение. Нижняя панель содержит исходный код и вкладки для других конфигураций. Далее мы добавим триггер в функцию. Нажмите кнопку Добавить триггер.
Добавить триггер
На экране «Добавить триггер» выполните следующие действия.
выберите «API Gateway» из выпадающего списка
выберите «Создать API» в раскрывающемся списке API.
выберите опцию HTTP API
выберите «Открыть» в раскрывающемся списке «Безопасность».
Окончательная конфигурация триггера должна выглядеть так:
Экран добавления триггера
Нажмите кнопку «Добавить «, чтобы продолжить.
Указание кода функции Lambda
Теперь у нас есть триггер шлюза API, зарегистрированный на странице обзора функций перед нашей функцией GithubGet.
Функция с триггером
В нижней панели щелкните вкладку «Код», чтобы просмотреть редактор кода. Есть предварительно настроенный «Hello, World!» пример кода, который выглядит так:
exports.handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify ('Hello from Lambda!'),
};
return response;
};
Теперь, когда у нас есть триггер шлюза API, мы можем публично получить доступ к этой функции. Перейдите на вкладку «Конфигурация» и вкладку «Триггеры» и разверните триггер «Шлюз API».
Конфигурация триггера
Вы должны увидеть конечную точку API: запись с
Создание сложных функций с зависимостями
В большинстве реальных сценариев вам понадобится создавать более сложные функции с использованием сторонних библиотек, установленных через npm.
Давайте создадим пользовательскую функцию, использующую зависимость npm, и загрузим ее в Lambda. Вы можете выполнить шаги, описанные ниже, или взять код из репозитория примеров.
Создание новой функции
Давайте настроим папку для нашей новой функции и изнутри инициализируем npm package.jsonфайлом по умолчанию:
npm init -f
Далее мы установим официальный клиент GitHub:
npm install @octokit/rest
Создайте файл index.jsсо следующим кодом:
const { Octokit } = require («@octokit/rest») ;
const octokit = new Octokit () ;
exports.handler = async (event) => {
try{
const ghres = await octokit.rest.search.repos ({
q: «sitepoint»,
sort: «stars»
}) ;
const result = ghres.data.items.map (function (repo) {
return { url: repo.html_url, «stars»: repo.stargazers_count };
}) ;
return {
statusCode: 200,
body: JSON.stringify (result)
}
}catch (error) {
return {
statusCode: 500,
body: {error: error}
}
}
};
Вот разбивка того, что делает этот код:
Он включает и инициализирует оставшийся API GitHub «Octokit».
Он определяет функцию handler, соответствующую сигнатуре Lambda.
При handlerвызове он отправляет поисковый запрос в GitHub для всех репозиториев, соответствующих sitepointзапросу.
С ответом Github создается карта, которая включает
Наконец, он возвращает ответ HTTP в виде объекта, который соответствует ожидаемой интеграции шлюза API.
Загрузить в AWS Lambda
Создайте
zip -r lambdaupload.zip. /index.js. /node_modules/
Чтобы загрузить код в Lambda, вернитесь в редактор кода в обзоре функций, щелкните селектор «Загрузить из «и выберите «.zip».
Затем выберите lambdaupload.zipфайл на своем компьютере и загрузите его на AWS. Вы должны увидеть обновление редактора кода и загрузить обработчик, который мы написали выше. Если вы посетите
Следующие шаги и будущее Lambda
Я надеюсь, что этот проект дал вам хорошую основу для работы с AWS Lambda. Хотя мы использовали интеграцию стороннего клиента (GitHub) в коде нашей функции, ее можно заменить любым другим клиентским API или подключением клиента к базе данных.
Бессерверные фреймворки
Эта статья демонстрирует очень ручной и несколько эфемерный процесс настройки Lambda. Существуют и другие способы настройки и инициализации Lambda, управляемые API AWS.
Некоторые инструменты и фреймворки создаются на основе AWS API, которые помогают упростить этот процесс:
serverless.com: это самая зрелая структура FaaS. Он обеспечивает очень полный опыт работы с Lambda и применим к другим поставщикам FaaS, не относящимся к AWS. Он обеспечивает локальную настройку среды разработки для быстрой итерации, автоматизированное развертывание кода Lambda, несколько промежуточных сред развертывания и многое другое.
terraform.io: это широко распространенный инструмент управления инфраструктурой как кодом и конфигурацией. Terraform позволяет разработчикам декларативно определять конфигурации облачной инфраструктуры, а затем автоматически развертывать и синхронизировать эти конфигурации. В предыдущем упражнении с Lambda мы выполнили большую часть ручной настройки через пользовательский интерфейс браузера AWS. Эта работа была довольно утомительной, и если нам нужно
Как вы думаете?
Будете ли вы рассматривать FaaS для будущих проектов? Возможно, вы уже начали использовать Lambda как часть архитектуры вашего приложения?