Название «Бессерверная архитектура» ошибочно подразумевает волшебное отсутствие сервера. В бессерверных вычислениях сторонний поставщик услуг берет на себя ответственность за процессы, операционные системы и серверы. Теперь разработчики могут сосредоточиться только на создании отличного программного обеспечения.

Все, что им нужно сделать, это код. Рассмотрение ресурсов (развертывание, настройка, управление) больше не их забота. Об этом позаботятся компании по миграции в облако. Чем меньше вы должны управлять экземпляром, тем больше он бессерверный. Бессерверная версия хорошо сочетается с определенными функциями. Компании должны научиться оптимизировать их использование и интегрировать их в более широкие системы данных.

Запуск AWS Lambda в 2014 г. стал первым крупным бессерверным предложением. Google Cloud Functions, Iron.io, Microsoft Azure Functions и IBM Bluemix OpenWhisk с тех пор вышли на рынок с аналогичными предложениями услуг в своем облаке. Бэкэнд как услуга (BaaS), Мобильный бэкэнд как услуга и Функция как услуга (FaaS) - это подходы, которые идут с бессерверным режимом.

Бессерверная архитектура и AWS Lambda

  1. AWS Lambda предлагает конкурентоспособные цены и модель вычислений, управляемую событиями. То есть Lambda выполняет ваш код в ответ на события. Событие может быть изменением корзины Amazon S3, обновлением таблицы Amazon DynamoDB или настраиваемыми событиями, генерируемыми различными приложениями или устройствами. Через несколько мгновений после триггера события Lambda автоматически подготавливает вычислительные ресурсы и запускает функцию или код Lambda.
  2. Это устраняет проблемы, связанные с неиспользованной занятой емкостью сервера, без ущерба для масштабируемости или скорости ответа. Стартапы перешли от архитектуры монолитных приложений к архитектуре, управляемой микросервисами, с помощью AWS Lambda. Такие стартапы, как групповой чат и приложение для обмена сообщениями SendBird и аналитическая платформа Wavefront, используют Lambda. Многие стартапы, такие как Click Travel, перешли от архитектуры монолитных приложений к архитектуре, основанной на микросервисах (с использованием AWS Lambda).
  3. Lambda устраняет проблемы, связанные с неиспользованной емкостью сервера, без ущерба для масштабируемости или скорости отклика. Например, разработчики, работающие над сайтом бронирования отелей, испытывают эскалацию пользователей в праздничные дни. Обычно разработчики должны создавать механизмы, чтобы справиться с этим всплеском спроса. Вместо этого Lambda позаботится об этом за вас. Он поддерживает несколько языков и библиотек, включая Python и JavaScript.
  4. Схемы AWS Lambda: набор организованных, но многоразовых и расширяемых лямбда-функций. Схемы можно сравнить с рецептами с примерами источников событий и конфигурациями лямбда-функций.

Эффект AWS Lambda

Чтобы разбить, как AWS Lambda делает это за вас, в четыре этапа:

AWS Lambda и микросервисы: AWS Lambda отлично подходит для компаний, которые хотят направить все свои ресурсы на решение проблемы. Обладая гибкой способностью масштабироваться и обрабатывать большой трафик, микросервисы хорошо сочетаются с AWS lambda.

Благодаря новой функции управления версиями и Amazon API Gateway создание микросервисов стало намного проще. Масштабируемые микросервисы теперь можно создавать для приложений Интернета вещей, Интернета и мобильных устройств. Посмотреть презентацию о переходе от монолитной архитектуры к микросервисам с помощью Lambda можно в этом видео.

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

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

Машинное обучение. Lambda можно использовать вместе с машинным обучением Amazon. Вы можете делать прогнозы потоковых данных или настраиваемые прогнозы, выставив лямбда-функцию, обертывающую машинное обучение как API. Узнайте, как создать приложение для машинного обучения с помощью AWS lambda, здесь.

Аналитика. AWS Lambda также может использоваться в качестве аналитического инструмента. Войдите в Amazon Kinetic Analytics, который позволяет обрабатывать потоковые данные в реальном времени с помощью стандартного SQL.

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

Amazon Elasticsearch или AMR выбирают данные из Kinesis Stream для анализа. Результаты отображаются на панели управления в реальном времени. Чтобы узнать больше об Amazon Kinesis, нажмите здесь.

Конвейеры больших данных. Конвейеры больших данных могут быть построены с использованием бессерверной архитектуры. Как же помогает бессерверный конвейер? Во-первых, он обладает высокой масштабируемостью, оплата производится за выполнение, а в-третьих, нет необходимости управлять группой экземпляров EC2. Процесс перемещения данных из источника данных в целевой объект через конвейер больших данных называется ETL (извлечение, преобразование, загрузка).

Работа с AWS Lambda: пример

Помимо работы с одним из наших клиентов из списка Fortune 500, мы использовали AWS Lambda для множества интересных сценариев использования, от стартап-клиентов IOT до интеграции революционной кухонной техники.

В целях иллюстрации мы воспроизводим здесь пример того, как Lambda играет ключевую роль в создании приложения для новостного блога. Пользователи могут посетить приложение и подписаться на рассылку новостей блога. Администраторы могут войти в систему и собрать список подписчиков на рассылку новостей. Требования следующие:

  1. Подписка на рассылку новостей обрабатывается функцией Lambda и конечной точкой API.
  2. Список подписчиков, полученный функцией Lambda и конечной точкой API.
  3. Разрешение администраторам входить в систему.

Для достижения нашей цели необходимо задействовать несколько сервисов AWS. Микросервисы будут написаны с использованием Lambda. API-шлюз пригодится, чтобы представить функции Lambda в Интернете. IAM и Cognito будут обрабатывать аутентификацию пользователей. Dynamo DB, база данных для хранения информации о подписчиках информационных бюллетеней. Сначала вам нужно настроить Dynamo DB. Узнать больше о Динамо БД можно здесь.

На Lambda: После настройки базы данных мы реализуем функции Lambda. Будут созданы две лямбда-функции. Первый для хранения адресов электронной почты пользователей, второй для получения списков адресов электронной почты в базе данных.

Функция, которая принимает несколько параметров, экспортируется, чтобы помочь установить контекст запроса. Реализация написана внутри функции. Чтобы завершить операцию, вызывается функция обратного вызова и передается в данные, которыми мы хотели бы ответить. Мы используем Node.js для написания наших функций на панели инструментов Lambda.

СОХРАНИТЬ НОВУЮ ФУНКЦИЮ AWS LAMBDA ДЛЯ ПОДПИСКИ

Первая функция реализуется путем перехода на домашнюю страницу Lambda в панели управления AWS и создания функции Lambda. Некоторые настройки требуют настройки перед тем, как приступить к написанию кода. Задайте имя лямбда-функции для среды выполнения, выберите Node 4.3. Остальные настройки можно установить по умолчанию. Установите роль «Выбрать существующую роль».

Теперь вы можете выбрать «роль сервера / администратор». Это дает функции Lambda возможность вызывать и выполнять код из различных сервисов AWS, таких как DynamoDB. Неправильная установка роли вызовет ошибки лямбда-функции. AWS SDK используется для упрощения взаимодействия с другими сервисами AWS, ограниченными кодом.

'use strict';
// Requir'use strict';
'use strict';
// Require the AWS SDK and get the instance of our DynamoDB
var aws = require('aws-sdk');
var db = new aws.DynamoDB();
// Set up the model for our the email
var model = {
  email: {"S" : ""},
};
// This will be the function called when our Lambda function is exectued
exports.handler = (event, context, callback) => {
// We'll use the same response we used in our Webtask
  const RESPONSE = {
    OK : {
      statusCode : 200,
      message: "You have successfully subscribed to the newsletter!",
    },
    DUPLICATE : {
      status : 400,
      message : "You are already subscribed."
    },
    ERROR : {
      status : 400,
      message: "Something went wrong. Please try again."
    }
  };
// Capture the email from our POST request
  // For now, we'll just set a fake email
  var email = event.body.email;;
if(!email){
    // If we don't get an email, we'll end our execution and send an error
    return callback(null, RESPONSE.ERROR);
  }
// If we do have an email, we'll set it to our model
  model.email.S = email;
// Insert the email into the database, but only if the email does not already exist.
  db.putItem({
    TableName: 'Emails',
    Item: model,
    Expected: {
      email: { Exists: false }
    }
  }, function (err, data) {
    if (err) {
      // If we get an err, we'll assume it's a duplicate email and send an
      // appropriate message
      return callback(null, RESPONSE.DUPLICATE);
    }
    // If the data was stored succesfully, we'll respond accordingly
    callback(null, RESPONSE.OK);
  });
};
// Require the AWS SDK and get the instance of our DynamoDB
var aws = require('aws-sdk');
var db = new aws.DynamoDB();
// Set up the model for our the email
var model = {
  email: {"S" : ""},
};
// This will be the function called when our Lambda function is exectued
exports.handler = (event, context, callback) => {
// We'll use the same response we used in our Webtask
  const RESPONSE = {
    OK : {
      statusCode : 200,
      message: "You have successfully subscribed to the newsletter!",
    },
    DUPLICATE : {
      status : 400,
      message : "You are already subscribed."
    },
    ERROR : {
      status : 400,
      message: "Something went wrong. Please try again."
    }
  };
// Capture the email from our POST request
  // For now, we'll just set a fake email
  var email = event.body.email;;
if(!email){
    // If we don't get an email, we'll end our execution and send an error
    return callback(null, RESPONSE.ERROR);
  }
// If we do have an email, we'll set it to our model
  model.email.S = email;
// Insert the email into the database, but only if the email does not already exist.
  db.putItem({
    TableName: 'Emails',
    Item: model,
    Expected: {
      email: { Exists: false }
    }
  }, function (err, data) {
    if (err) {
      // If we get an err, we'll assume it's a duplicate email and send an
      // appropriate message
      return callback(null, RESPONSE.DUPLICATE);
    }
    // If the data was stored succesfully, we'll respond accordingly
    callback(null, RESPONSE.OK);
  });
};
e the AWS SDK and get the instance of our DynamoDB
var aws = require('aws-sdk');
var db = new aws.DynamoDB();
// Set up the model for our the email
var model = {
  email: {"S" : ""},
};
// This will be the function called when our Lambda function is exectued
exports.handler = (event, context, callback) => {
// We'll use the same response we used in our Webtask
  const RESPONSE = {
    OK : {
      statusCode : 200,
      message: "You have successfully subscribed to the newsletter!",
    },
    DUPLICATE : {
      status : 400,
      message : "You are already subscribed."
    },
    ERROR : {
      status : 400,
      message: "Something went wrong. Please try again."
    }
  };
// Capture the email from our POST request
  // For now, we'll just set a fake email
  var email = event.body.email;;
if(!email){
    // If we don't get an email, we'll end our execution and send an error
    return callback(null, RESPONSE.ERROR);
  }
// If we do have an email, we'll set it to our model
  model.email.S = email;
// Insert the email into the database, but only if the email does not already exist.
  db.putItem({
    TableName: 'Emails',
    Item: model,
    Expected: {
      email: { Exists: false }
    }
  }, function (err, data) {
    if (err) {
      // If we get an err, we'll assume it's a duplicate email and send an
      // appropriate message
      return callback(null, RESPONSE.DUPLICATE);
    }
    // If the data was stored succesfully, we'll respond accordingly
    callback(null, RESPONSE.OK);
  });
};

В этой функции переданный объект события получит электронное письмо при вызове функции. Переходим ко второй функции Lambda для получения подписчиков на рассылку новостей.

ПОЛУЧИТЬ ПОДПИСЧИКОВ НА РАССЫЛКИ БЕССЕРВЕРНЫХ ИСТОРИЙ

Для создания новой лямбда-функции используется более ранний процесс. Единственное отличие - изменение названия функции на подписчиков. Создание пост-функции, реализация логики кода будет следующей.

'use strict';
// We'll again use the AWS SDK to get an instance of our database
var aws = require('aws-sdk');
var db = new aws.DynamoDB();
exports.handler = (event, context, callback) => {
  // We'll modify our response code a little bit so that when the response
  // is ok, we'll return the list of emails in the message
  const RESPONSE = {
    OK : {
      statusCode : 200,
      message: [],
    },
    ERROR : {
      status : 400,
      message: "Something went wrong. Please try again."
    }
  };
// We'll use the scan method to get all the data from our database
  db.scan({
    TableName: "Emails"
    }, function(err, data) {
      if (err) {
        callback(null, RESPONSE.ERROR);
      }
      else {
         // If we get data back, we'll do some modifications to make it easier to read
         for(var i = 0; i < data.Items.length; i++){
           RESPONSE.OK.message.push({'email': data.Items[i].email.S});
         }
           callback(null, RESPONSE.OK);
      }
  });
};

Теперь протестируем функцию. Лямбда-функции можно легко протестировать, нажав кнопку ТЕСТ вверху страницы. Код выполнится и отобразит результаты операции. Он также будет отображать журнал, который поможет отладить любые проблемы.

AWS Lambda Edge: сводка

Хотя AWS Lambda существует только с 2014 года, крупные мировые компании уже внедряют ее. Основные факторы, способствующие его популярности:

  1. Время запуска продукта значительно сокращено
  2. Существенно снизились расходы на ИТ.
  3. Компаниям не нужно выделять средства на недостаточно используемые или потраченные впустую вычислительные и технические возможности.

Однако для Lambda еще рано. Он должен доказать свою способность выполнять такие корпоративные ИТ-функции, как тестирование, безопасность и управление конфигурацией. Чтобы узнать больше о бессерверной архитектуре, AWS lambda, сравнении с аналогичными вычислительными сервисами и других аспектах технологий, продолжайте посещать наш раздел блога.

(Источник идеи изображения лямбда-эффекта AWS: https://aws.amazon.com/lambda/. Пример кода любезно предоставлен).

Источник: Cuelogic Блог