Статьи

Как создать функцию AWS Lambda с помощью Java

В этом уроке мы увидим, как мы можем создать функцию AWS Lambda на Java, и я говорю вам, что это довольно легко сделать…

По сути, существует три способа создания лямбда-функции AWS:

— путем реализации интерфейса RequestHandler

— путем реализации интерфейса RequestStreamHandler

— Пользовательская реализация, которая не требует от нас реализации какого-либо конкретного интерфейса AWS

Лямбда-функция AWS путем реализации интерфейса RequestHandler

Для использования этого метода создания лямбда-функции AWS нам необходимо иметь следующую зависимость в нашем проекте:

1
2
3
4
5
6
<dependency>
 <groupId>com.amazonaws</groupId>
 <artifactId>aws-lambda-java-core</artifactId>
 <version>1.1.0</version>
 
</dependency>

И ниже, как будет выглядеть ваш класс:

01
02
03
04
05
06
07
08
09
10
11
12
13
package com.blogspot.javasolutionsguide;
 
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
 
public class HelloWorldWithRequestHandler implements RequestHandler<object,object> {
 
 @Override
 public Object handleRequest(Object input, Context context) {
  return String.format("Hello %s%s.", input ," from " + context.getFunctionName());
 }
}
</object,object>

После того, как вы создали в своем проекте maven с вышеуказанной зависимостью и классом, maven соберет проект, который создаст для вас jar-файл в целевой папке вашего проекта.

Теперь откройте Консоль AWS, перейдите в раздел Сервисы и найдите AWS Lambda.

На следующем экране нажмите «Создать функцию».

На следующем экране введите имя функции «HelloWorld» и выберите «Runtime as Java 11».

В разделе «Разрешения» выберите «Создать новую роль с основными лямбда-разрешениями», и AWS Lambda создаст и исполнит роль с именем HelloWorld-role-jc6cmpnj. Эта роль требуется, чтобы позволить AWS Lambda загружать журналы в журналы AWS Cloudwatch.

Нажмите на Создать функцию.

Вы увидите следующий экран, на котором написано, что «Успешно создана функция HelloWorld. Теперь вы можете изменить ее код и конфигурацию. Чтобы вызвать вашу функцию с событием test, выберите Test».

Теперь в разделе «Код функции» нажмите кнопку загрузки и найдите на своем компьютере банку, созданную ранее.

— Также в текстовом поле Обработчик замените
пример с именем пакета, где находится ваш класс «HelloWorldWithRequestHandler», который в нашем случае это «
com.blogspot.javasolutionsguide

— И заменить Hello на «HelloWorldWithRequestHandler».

— И замена handleRequest останется как есть, потому что у нас также есть то же имя метода в нашем классе.

Нажмите на кнопку Сохранить в крайней правой части экрана.

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

Вы увидите следующий экран. Введите имя события как «HelloWorldEvents» и замените следующее

{

«Ключ1»: «значение1»,

«Ключ2»: «значение2»,

«Ключ3»: «значение3»

}

только с вашим именем, как показано ниже:

и нажмите кнопку Создать.

Если щелкнуть ссылку «Журналы» на приведенном выше экране, вы попадете на экран «Облачные часы AWS», где вы увидите, что для вашей лямбда-функции была создана LogGroup и в которой у вас есть LogStream, где вы можете просматривать логи вашей лямбда-функции. Именно по этой причине мы присвоили роль нашей лямбда-функции, потому что AWS lambda использовала эту роль для отправки журналов в Cloudwatch.

Лямбда-функция AWS путем реализации интерфейса RequestStreamHandler

В этом случае вам нужно выполнить те же самые шаги, что и в предыдущем случае. Просто в коде необходимо реализовать интерфейс RequestStreamHandler, а не интерфейс RequestHandler, как показано ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package com.blogspot.javasolutionsguide;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
 
public class HelloWorldWithRequestStreamHandler implements RequestStreamHandler {
 
 @Override
 public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
  int letter;
        while((letter = inputStream.read()) != -1)
        {
            outputStream.write(Character.toUpperCase(letter));
        }
 }
}

Лямбда-функция AWS с пользовательской реализацией, которая не требует от нас реализации какого-либо специального интерфейса AWS

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

В следующем коде я попытался поместить два метода-обработчика, один с объектом Context, а другой без объекта Context. Чтобы проверить их оба, вам просто нужно изменить имя метода в консоли AWS, и он начнет использовать этот метод ,

Кроме того, мы видим, что из объекта Context мы можем получить много полезной информации, такой как имя AWS fucnton, его версия, ARN, сколько памяти выделено для функции (по умолчанию это 512 МБ).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.blogspot.javasolutionsguide;
 
import com.amazonaws.services.lambda.runtime.Context;
 
public class HelloWorld {
  
        //Handler method without Context
 public String sayHelloWorldWithoutContext(String name) {
  return String.format("Hello %s.", name);
 }
  
 //We need to add aws-lambda-java-core dependency if we add Context as parameter.
 public String sayHelloWorldWithContext(String name, Context context) {
   
  context.getLogger().log("Lambda Function Name:" + context.getFunctionName() +
    "Version:" + context.getFunctionVersion() +
    "Arn:" + context.getInvokedFunctionArn() +
    "Allocated Memory:" + context.getMemoryLimitInMB() +
    "Remaining Time:"+ context.getRemainingTimeInMillis());
  return String.format("Hello %s.", name);
 }
 
}

Также в следующем примере мы видим, что если в нашем классе есть два метода-обработчика с одинаковыми именами, будет вызван метод-обработчик, у которого в качестве последнего параметра будет объект Context.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.blogspot.javasolutionsguide;
 
import com.amazonaws.services.lambda.runtime.Context;
 
public class HelloWorldWithMultipleHandlersWithSameName {
  
 public String handler(String name) {
  return String.format("Hello %s.", name);
 }
  
 public String handler(String name, Context context) {
   
  return String.format("Hello %s%s.", name,   " Memory Allocated:" + context.getMemoryLimitInMB());
 }
 
}

Вы можете найти весь код этого урока в GitHub

Резюме :

Итак, мы увидели, как можно создавать лямбда-функции AWS различными способами в Java.

— Имя метода-обработчика не имеет значения. Вы можете выбрать любое имя по вашему выбору.

— Если в вашем классе есть два метода-обработчика с одинаковыми именами, будет вызван метод-обработчик, у которого в качестве последнего параметра используется объект Context.

— Первый параметр метода-обработчика — это ввод в обработчик, который может быть

— Данные о событиях, опубликованные источником событий, таким как S3, в форме предопределенных типов событий AWS, таких как S3Event.

— Пользовательский ввод (примитив или тип объекта).

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

— Если вы вызываете свою лямбда-функцию синхронно (Invoke типа RequestResponse), то вы можете вернуть любой разрешенный примитив или тип объекта из вашего обработчика, однако, если вы вызываете вашу лямбда-функцию асинхронно (Invoke type Event), тогда верните тип вашего обработчика. должно быть недействительным

Опубликовано на Java Code Geeks с разрешения Гаурава Бхардваджа, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Как создать функцию AWS Lambda с Java

Мнения, высказанные участниками Java Code Geeks, являются их собственными.