Что такое faast.js?
FAAST.JS — это проект с открытым исходным кодом, который оптимизирует вызов без серверных функций, таких как AWS Lambda. Это позволяет вам вызывать ваши функции без серверов, как если бы они были обычными функциями в вашем коде повседневного дня. Но преимущества на этом не останавливаются. Это позволяет вам раскручивать вашу без серверную инфраструктуру, когда функция фактически вызывается. Больше нет предварительного предоставления ваших среды без серверов.
Это интересный взгляд на инфраструктуру в качестве кода. С Faast мы больше не определяем нашу инфраструктуру внутри языка, такого как HCL или YAML. Вместо этого это больше похоже на Пулуми, где наша инфраструктура живет в коде, который мы фактически используем в наших услугах. Но с большой разницей в том, что наша инфраструктура обеспечивается при вызове нашей функции.
Но подождите, если моя инфраструктура выделена по требованию на мой трубопровод без сервера, как я узнаю, сколько стоит ее запускать?
FAAST.JS также прикрыл вас там. Вы можете оценить свои затраты в режиме реального времени, используя функциональность снимка затрат. Если вам нужен более глубокий вид, вы можете использовать анализатор затрат, чтобы оценить стоимость многих конфигураций параллельно.
В этом посте мы собираемся изучить, как мы можем использовать faast.js для предоставления функции без сервера в AWS Lambda. Мы собираемся создать простую функцию без сервера и вызовать ее, используя FAAST.JS, чтобы увидеть, как наша рабочая нагрузка динамически создается и уничтожается. Мы также погрузимся в некоторые из гладких функций, таких как анализ затрат.
Наша функция без сервера с использованием faast.js
Для начала нам сначала нужно настроить наш AWS CLI. Это требуется для Faast.js, чтобы узнать, какой облачный провайдер использует наша функция без сервера. Установив CLI с правильными клавишами доступа, наша настройка Faast обнаружит, что мы используем AWS Lambda для нашей среды.
Как только мы все настроены на использование AWS в качестве нашего облачного провайдера, мы сможем начать с FAAST, установив библиотеку в наш проект.
$ npm install faastjs
Далее, давайте создадим нашу реализацию функции без серверов внутри файла с именем functions.js
Анкет Наша функция будет очень проста для этого сообщения в блоге. Мы хотим сосредоточиться на преимуществах, которые дает Faast Но нам нужна реалистичная функция без сервера, чтобы сделать это.
При использовании FAAST важной вещью является то, что наша функция без сервера должна быть идентифицирующей. Это означает, что он принимает вход и производит один и тот же вывод каждый раз, когда он вызывает с этим. Это связано с тем, что Faast Abstraction обеспечивает оставляет дверь открытой для повторных функций.
Для нашей цели давайте создадим простую функцию, которая принимает множество чисел и умножает их, возвращая результат. Это наивный пример, но он позволит нам продемонстрировать, как мы можем использовать FAAST для масштабирования наших вызовов, а также оценить стоимость нашей функции. Это также основной пример идентичности, одни и те же два входа всегда приводят к одному и тому же продукту.
Давайте погрузимся в то, как выглядит код для нашей без серверной функции.
exports.multiply = function(numbers) { return numbers.reduce((currTotal, num) => currTotal * num); }
Довольно просто, верно? У нас есть однострочная функция, которая берет множество чисел и возвращает конечный продукт всех их.
Теперь, когда у нас есть базовая функция без сервера, давайте включим FAAST.JS в нашу настройку. Внутри нашего index.js
Файл, который мы собираемся начать с создания некоторых случайных массивов числа. Затем мы можем использовать эти массивы, чтобы вызовать нашу функцию без сервера много раз параллельно.
const { faast } = require("faastjs"); const funcs = require("./functions"); async function main() { const testArrays = []; for(let i = 0; i <= 1000; i++) { var randomLength = Math.floor((Math.random() * 10) + 1); var arr = []; for(let k = 1; k <= randomLength; k++) { arr.push(k); testArrays.push(arr); console.log("Invoking serverless functions"); await invokeFunctions(testArrays); console.log("Done invoking serverless functions"); }
Здесь мы генерируем 1000 массивов случайной длины, а затем передаем их в нашем invokefunctions
функция Именно эта функция использует FAAST, чтобы вызовать нашу функцию Unly Multiplaation без сервера параллельно.
async function invokeFunctions(arrays) { const invoker = await faast("aws", funcs); const promises = [] for(let i = 0; i < arrays.length; i++) { promises.push(invoker.functions.multiply(arrays[i])) const results = await Promise.all(promises); await invoker.cleanup(); console.log("Invocation results"); console.log(results); }
Наш invokefunctions
Метод создает нашу фанат. Затем он вызывает наш Умножьте
Функция для каждого тестового массива мы передавали в него. Наше вызов функции возвращает обещание, которое добавлено в Обещания
массив, где мы можем ждет
На всех наших призыве. Как только все наши функции без сервера завершены, мы называем Очистка
Метод нашего Invoker для уничтожения созданной инфраструктуры.
Запуск нашей функции без сервера
Теперь, когда у нас есть наша функция без сервера и логика внешнего вызова, которую Faast будет использовать для ее вызова, пришло время протестировать вещи.
Это делается с Узел
Позвоните в наш сценарий точки входа. Из корня каталога, где живет наш код, запустите следующие команды. Обратите внимание, что .js должен быть заменен именем файла, в котором Anwoker Faast JS вызывает вашу функцию без сервера.
$ npm install $ node src/.js
Вот и все! Мы только что вызвали нашу функцию без сервера через Framework Faast.js. Мы должны увидеть журналы в нашем выводе, которые выглядят примерно так.
$ node src/index.js Invoking serverless functions Invocation results [ 720, 6, 40320, 720, 3628800, 120, 3628800, .....]
Довольно круто, верно? Мы смогли написать нашу функцию без сервера в своем собственном модуле, а затем вызвать ее так, как будто это была какая -либо старая функция из нашего кода, используя faast.js. Не было предварительного обеспечения нашей инфраструктуры AWS. Не нужно обрабатывать повторные или ошибки, и все было очищено для нас.
Мы можем увидеть это для себя, проверив группы журналов CloudWatch, которые были созданы для каждой из наших функций. Вы можете просмотреть эти журналы, перейдя в журналы CloudWatch в своей учетной записи AWS, а затем отфильтровывая для префикса /aws/lambda/faast
Анкет
Это захватывающий взгляд на инфраструктуру в качестве кода. Это устраняет необходимость предоставлять инфраструктуру заранее. Нам не нужно заранее настраивать эти функции Lambda, они создаются динамически, когда наш модуль Faast вызывает. Одно это очень захватывающе, потому что это позволяет разработчикам вызовать без серверов рабочие нагрузки, как если бы они были функциями в нашем повседневном коде.
Но это становится еще лучше.
Сколько стоили наши призывы?
С великой властью рискует делать что -то неправильно. Или поместите с точки зрения AWS, получая высокий счет в конце месяца, потому что вы неправильно поняли.
Оказывается, Faast может помочь нам с этим с их встроенным анализатором затрат. Давайте обновим нашу логику, чтобы использовать анализатор затрат, чтобы мы могли увидеть разбивку того, что нам стоят наши призывы.
Все, что нам нужно сделать, это вызвать функцию под названием Стоимость На нашем фанат. Поэтому мы добавляем это ниже, чтобы увидеть полную разбивку того, что нам стоят без серверов. Вот обновленный код, который обрабатывает это.
async function invokeFunctions(arrays) { const invoker = await faast("aws", funcs); const promises = [] for(let i = 0; i < arrays.length; i++) { promises.push(invoker.functions.multiply(arrays[i])) const results = await Promise.all(promises); await invoker.cleanup(); console.log(results); const costSnapshot = await invoker.costSnapshot(); console.log(costSnapshot.toString()); }
Так сколько нам стоит наш текущий трубопровод без сервера? Вот вывод журнала от вызова в Стоимость Анкет
functionCallDuration $0.00002813/second 100.1 seconds $0.00281588 91.9% [1] functionCallRequests $0.00000020/request 1001 requests $0.00020020 6.5% [2] outboundDataTransfer $0.09000000/GB 0.00052891 GB $0.00004760 1.6% [3] sqs $0.00000040/request 0 request $0 0.0% [4] sns $0.00000050/request 0 request $0 0.0% [5] logIngestion $0.50000000/GB 0 GB $0 0.0% [6] -------------------------------------------------------------------------------------------- $0.00306368 (USD) * Estimated using highest pricing tier for each service. Limitations apply. ** Does not account for free tier. [6]: https://aws.amazon.com/cloudwatch/pricing/ - Log ingestion costs not currently included.
Здесь мы видим, что у нас были 1001 запросы на функцию с общей продолжительностью 100 секунд и небольшая доля переноса исходящей передачи данных. Все это за общую сумму $ 0,003 цента.
Сделать все это вместе
Что мы продемонстрировали, так это то, что мы можем создать без серверную функцию, которая не требует авансовой инфраструктуры. Наша функция умножения обеспечивается на лету через FAAST. Мы можем даже сбросить снимки затрат из FAAST, чтобы увидеть, что наши призывы стоят нам в целом и на основе запроса.
Что это позволяет нам сделать разработчики, так это абстрагировать мир без серверов, но все же получить все его преимущества.
Представьте себе, что если наша обертка Invoker не была сценарием, который мы запускаем из командной строки, а скорее еще одна функция, которая используется в API, который мы строим. Разработчик API должен знать только, как вызвать нашу функцию в JavaScript. Все без серверных знаний и инфраструктуры полностью абстрагированы от них. Для их кода это не что иное, как другая функция.
Это отличный уровень абстракции для людей, которые являются новыми в мире без сервера. Это дает вам все преимущества, не поднимаясь на некоторую кривую обучения.
Но это происходит с стоимостью. Неправильно, наши без серверных затрат могут пройти через крышу. Если разработчик API вызывает нашу функцию в В то время как
Цикл, не понимая последствий этого, наш счет AWS в конце месяца может заставить нас плакать.
Вывод
FAAST.JS — очень крутая идея из без сервера и инфраструктуры в качестве кодовой перспективы. Лучший код — это код, который вам никогда не нужно писать. FAAST дает нам это, предоставляя нам нашу инфраструктуру, когда нам это нужно. Это также позволяет нам рассматривать наши рабочие нагрузки без серверов как еще одну функцию в нашем коде.
Это происходит с стоимостью и некоторыми сбоями, которые могут не соответствовать всем вариантам использования. Например, роль, созданная для функций Lambda, имеет доступ к администратору, и нет возможности настроить это. Не лучшая безопасность. Существует также случай, когда другие ресурсы можно лежать в вашей учетной записи, если Очистка
Метод не называется.
Это то, что я уверен, что проект стремится обратиться. В то же время я бы предложил попробовать FAAST в контексте разработки/тестирования, чтобы получить представление о том, что ваши рабочие нагрузки без сервера будут стоить вам в масштабе.
Если у вас есть какие -либо вопросы о faast.js или без сервера в целом, не стесняйтесь пинговать меня через Twitter @kylegalbraith или оставьте комментарий ниже. Кроме того, проверьте мой еженедельный Учитесь, делая информационный бюллетень или мой Учитесь AWS, используя его курс Чтобы узнать еще больше о облаке, кодировании и DevOps.
Если у вас есть вопросы о CloudForecast, чтобы помочь вам контролировать и оптимизировать стоимость AWS, не стесняйтесь пинг Тони: tony@cloudforecast.io
Оригинал: «https://dev.to/cloudforecast/analyzing-the-cost-of-your-serverless-functions-using-faast-js-4oai»