Статьи

Бессерверный FaaS с AWS Lambda и Java

Что такое безсерверная архитектура?

Бессерверная архитектура запускает пользовательский код в временных контейнерах, которые полностью управляются сторонними разработчиками. Пользовательский код обычно является небольшой частью полного приложения. Это также называется функцией . Это дает другое название для безсерверной архитектуры как « Функция как услуга» (FaaS). Контейнер эфемерный, потому что он может длиться только один вызов. Контейнер может быть использован повторно, но это не то, на что вы можете положиться. Как разработчик, вы загружаете код на платформу FaaS, а затем служба обрабатывает всю емкость, масштабирование, исправления и администрирование инфраструктуры для запуска вашего кода.

Приложение, созданное с использованием бессерверной архитектуры, использует подход, основанный на событиях. Например, в приложении произошла активность, например щелчок.

Это очень отличается от классической архитектуры, где код приложения обычно развертывается на сервере приложений, таком как Tomcat или WildFly. Масштабирование приложения означает запуск дополнительных экземпляров сервера приложений или увеличение количества дополнительных контейнеров с помощью сервера упакованных приложений. Балансировщик нагрузки должен быть обновлен новыми IP-адресами. Операционная система должна быть исправлена, обновлена ​​и поддержана.

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

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

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

Одним из больших преимуществ FaaS является то, что вы платите только за время вычислений, то есть за время выполнения кода. Когда ваш код не работает, плата не взимается.

Другой способ взглянуть на то, как функции отличаются от виртуальных машин и контейнеров:

Обратите внимание, что контейнеры Linux вместо контейнеров Docker используются в качестве реализации для AWS Lambda.

Чем FaaS отличается от PaaS?

Как цитируется на Serverless Architectures , быстрый ответ обеспечивается следующим твитом:

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

Абстрагирование Back-end с FaaS объясняет разницу с различными * aaS предложениями. Изображение из блога запечатлено ниже:

Бессерверные архитектуры также предоставляют подробные сведения о том, что такое FaaS, а что нет.

AWS Lambda , Google Cloud Functions и Azure Functions являются одними из вариантов запуска безсерверных приложений.

Этот блог покажет, как написать вашу первую функцию AWS Lambda.

Что такое AWS Lambda?

AWS Lambda — это сервис FaaS от Amazon Web Services. Он запускает ваш код в вычислительной инфраструктуре высокой доступности и выполняет все администрирование вычислительных ресурсов, включая обслуживание сервера и операционной системы, выделение ресурсов и автоматическое масштабирование, мониторинг кода и ведение журнала.

AWS Lambda взимает плату за период действия кода с шагом 100 мс. Хранение лямбда-функции в AWS не требует никаких затрат. Первый миллион запросов в месяц бесплатен, а цены после этого являются номинальными. Читайте более подробную информацию о ценах лямбда . Он также обеспечивает представление о производительности, предоставляя в реальном времени метрики и журналы для AWS CloudWatch . Все, что вам нужно сделать, это написать код!

Вот краткое введение:

Также ознакомьтесь с новостями AWS Lambda от AWS ReInvent 2016 :

Также ознакомьтесь с Безсерверными архитектурными шаблонами и рекомендациями от AWS ReInvent 2016:

Код, который вы запускаете на AWS Lambda, называется лямбда-функцией. Вы загружаете свой код в виде zip-файла или проектируете его с помощью AWS Lambda Management Console . Существует встроенная поддержка AWS SDK, что упрощает возможность вызова других сервисов AWS.

Короче говоря, Lambda является масштабируемой, безсерверной, вычисляет в облаке.

AWS Lambda предоставляет несколько сред выполнения:

  • Node.js — v0.10.36, v4.3.2 (рекомендуется)
  • Ява — Ява 8
  • Python — Python 2.7
  • .NET Core — .NET Core 1.0.1 (C #)

Этот блог покажет:

  • Создайте приложение Java, которое хранит документ JSON в Couchbase
  • Используйте Maven для создания пакета развертывания для приложения Java
  • Создать лямбда-функцию
  • Обновите лямбда-функцию

Полный код в этом блоге доступен по адресу github.com/arun-gupta/serverless/tree/master/aws/hellocouchbase .

Java-приложение для AWS Lambda

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

В нашей лямбда-функции будет реализован предопределенный интерфейс com.amazonaws.services.lambda.runtime.RequestHandler . Код выглядит так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
public class HelloCouchbase implements RequestHandler<Request, String> {
  
    CouchbaseCluster cluster;
    Bucket bucket;
    LambdaLogger logger;
  
    @Override
    public String handleRequest(Request request, Context context) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String timestamp = dateFormat.format(Calendar.getInstance().getTime());
  
        logger = context.getLogger();
        logger.log("Request received: %s" + timestamp);
        ButtonDocument buttonDocument = new ButtonDocument();
        buttonDocument.setId(context.getAwsRequestId());
        buttonDocument.setRequestId(context.getAwsRequestId());
        buttonDocument.setTimestamp(String.valueOf(timestamp));
         
        getBucket().upsert(buttonDocument.toJson());
  
        return buttonDocument.toString();
    }

Метод handleRequest — это место, где реализован код функции. Context предоставляет полезную информацию о среде выполнения Lambda. Некоторая информация из контекста хранится в JSON-документе. Наконец, Couchbase Java SDK API upsert используется для записи документа JSON в указанный экземпляр Couchbase. Couchbase на Amazon EC2 содержит подробные инструкции по установке Couchbase на AWS EC2.

Информация о сервере Couchbase получается как:

1
2
3
4
5
6
7
public CouchbaseCluster getCluster() {
    if (null == cluster) {
        logger.log("env: " + System.getenv("COUCHBASE_HOST"));
        cluster = CouchbaseCluster.create(System.getenv("COUCHBASE_HOST"));
    }
    return cluster;
}

Это снова использует Couchbase Java API CouchbaseCluster в качестве основной точки входа в кластер Couchbase. COUCHBASE_HOST среды COUCHBASE_HOST передается при создании функции Lambda. В нашем случае это будет указывать на кластер Couchbase с одним узлом, работающий на AWS EC2. Переменные среды были недавно введены в AWS Lambda.

Наконец, вам нужно получить доступ к контейнеру на сервере:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public Bucket getBucket() {
    while (null == bucket) {
        logger.log("Trying to connect to the database");
        bucket = getCluster().openBucket("serverless", 2L, TimeUnit.MINUTES);
  
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            logger.log("Thread sleep Exception: " + e.toString());
            throw new RuntimeException(e);
        }
    }
  
    return bucket;
}

Имя сегмента без serverless и все документы JSON хранятся в нем.

Простое приложение Hello World также может быть использовано для создания этой функции.

Создание пакета развертывания AWS Lambda

Для функции AWS Lambda требуется пакет развертывания. Этот пакет представляет собой файл .zip или .jar который содержит все зависимости функции. Наше приложение упаковано с использованием Maven, поэтому мы будем использовать плагин Maven для создания пакета развертывания.

Приложение имеет pom.xml со следующим фрагментом плагина:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Дополнительные сведения о конфигурации Maven доступны в разделе Создание пакета развертывания .jar с использованием Maven без какой-либо IDE . Maven-shade-plugin позволяет создать uber-jar, включающий все зависимости. Цель shade связана с фазой package . Таким образом, команда mvn package сгенерирует один mvn package развертывания.

Упакуйте приложение, используя mvn package . Это покажет вывод:

01
02
03
04
05
06
07
08
09
10
11
12
13
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ hellocouchbase ---
[INFO] Building jar: /Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:2.3:shade (default) @ hellocouchbase ---
[INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.1.0 in the shaded jar.
[INFO] Including com.couchbase.client:java-client:jar:2.3.6 in the shaded jar.
[INFO] Including com.couchbase.client:core-io:jar:1.3.6 in the shaded jar.
[INFO] Including io.reactivex:rxjava:jar:1.1.8 in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar with /Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

target/hello-couchbase-1.0-SNAPSHOT.jar — это затененная банка, которая будет развернута в AWS Lambda.

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

Создать лямбда-функцию AWS

Создайте лямбда-функцию AWS с помощью AWS CLI . Команда CLI в этом случае выглядит так:

01
02
03
04
05
06
07
08
09
10
11
aws lambda create-function \
--function-name HelloWorld \
--role arn:aws:iam::<account-id>:role/service-role/myLambdaRole \
--zip-file fileb:///Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar \
--handler org.sample.serverless.aws.couchbase.HelloCouchbaseLambda \
--description "Hello Couchbase Lambda" \
--runtime java8  \
--region us-west-2 \
--timeout 30 \
--memory-size 1024 \
--publish

В этом CLI:

  • create-function создает лямбда-функцию
  • --function-name предоставляет имя функции. Имя функции чувствительно к регистру.
  • --role указывает Amazon Resource Name (ARN) роли IAM, которую Lambda берет на себя, когда выполняет свою функцию для доступа к любым другим ресурсам AWS. Если вы выполнили лямбда-функцию с помощью консоли AWS, то эта роль создана для вас.
  • --zip-file указывает на пакет развертывания, который был создан на предыдущем шаге. fileb — это специальный протокол AWS CLI, который указывает, что загружаемый контент является двоичным.
  • --handler — это класс Java, который вызывается для начала выполнения функции
  • --publish запрос AWS Lambda на создание функции Lambda и публикацию версии в качестве атомарной операции. В противном случае может быть создано несколько версий, которые могут быть опубликованы позднее.

Лямбда-консоль показывает:

Тестирование лямбда-функции AWS

Протестируйте лямбда-функцию AWS с помощью интерфейса командной строки AWS.

1
2
3
4
5
aws lambda invoke \
--function-name HelloCouchbaseLambda \
--region us-west-2 \
--payload '' \
hellocouchbase.out

Он показывает вывод как:

1
2
3
{
    "StatusCode": 200
}

Вывод команды хранится в hellocouchbase.out и выглядит следующим образом:

1
"{\"id\":\"e6bbe71a-ca4f-11e6-95a7-95f2ed410493\",\"installationId\":null,\"requestId\":\"e6bbe71a-ca4f-11e6-95a7-95f2ed410493\",\"identityId\":null,\"timestamp\":\"2016-12-25 03:12:01.157\"}"

Вызов этой функции сохраняет документ JSON в Couchbase. Документы, хранящиеся в Couchbase, можно просмотреть с помощью веб-консоли Couchbase . Пароль — « Administrator а пароль — идентификатор экземпляра EC2.

Все области данных в этом экземпляре Couchbase показаны ниже:

Обратите внимание, что serverless ведро создается вручную.

При нажатии на «Документы» отображаются сведения о различных документах, хранящихся в корзине:

Нажатие на каждый документ показывает больше деталей о документе JSON:

Лямбда-функцию также можно протестировать с помощью консоли:

Обновление лямбда-функции AWS

Если логика приложения изменяется, необходимо загрузить новый пакет развертывания для функции Lambda. В этом случае mvn package создаст пакет развертывания, а aws lambda CLI aws lambda используется для обновления кода функции:

1
2
3
4
5
aws lambda update-function-code \
--function-name HelloCouchbaseLambda \
--zip-file fileb:///Users/arungupta/workspaces/serverless/aws/hellocouchbase/hellocouchbase/target/hellocouchbase-1.0-SNAPSHOT.jar \
--region us-west-2 \
--publish

Показывает результат:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
{
    "CodeSha256": "w510ejw/OoVsQt2JiLG2bPZPAaFvQCRrYYYlQWctCQE=",
    "FunctionName": "HelloCouchbaseLambda",
    "CodeSize": 6978108,
    "MemorySize": 1024,
    "FunctionArn": "arn:aws:lambda:us-west-2:<account-id>:function:HelloCouchbaseLambda:8",
    "Environment": {
        "Variables": {
            "COUCHBASE_HOST": "ec2-35-165-249-235.us-west-2.compute.amazonaws.com"
        }
    },
    "Version": "8",
    "Role": "arn:aws:iam::<account-id>:role/service-role/myLambdaRole",
    "Timeout": 30,
    "LastModified": "2016-12-25T04:17:38.717+0000",
    "Handler": "org.sample.serverless.aws.couchbase.HelloCouchbaseLambda",
    "Runtime": "java8",
    "Description": "Java Hello Couchbase"
}

Функция может быть вызвана снова.

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

AWS Lambda References

Ссылка: Бессерверный FaaS с AWS Lambda и Java от нашего партнера по JCG Аруна Гупта в блоге Miles to go 3.0… .