AWS Lambdas предоставляет удобную среду для запуска недолговечных приложений, не беспокоясь о выделении базового оборудования или управлении операционными системами. В этой статье мы рассмотрим простое Java-приложение, которое может работать как Lambda.
Исходный код этого приложения доступен на GitHub .
На приведенном ниже видео показан экран, демонстрирующий пример этого приложения, настроенного в AWS, в комплекте с Cognito для аутентификации и API Gateway для интерфейса HTTP.
Первое решение, которое нужно сделать, — будет ли эта Lambda вызываться через API-шлюз через прокси-интеграцию или без прокси-интеграции. Мы продемонстрируем первое в этом посте, поскольку интеграция с прокси-сервером кажется предпочтительным решением, хотя формулировка этого предпочтения со временем смягчилась .
Вам также может понравиться: Создание Serverless на AWS Lambda
Вот класс, содержащий метод точки входа.
Джава
1
package com.matthewcasperson;
2
import com.amazonaws.services.lambda.runtime.Context;
4
import com.google.gson.Gson;
5
import java.util.Map;
7
public class LambdaMethodHandler {
9
public ProxyResponse handleRequest(
10
final Map<String,Object> input,
11
final Context context) {
12
return new ProxyResponse(
13
"200",
14
new Gson().toJson(input));
15
}
16
}
Сигнатура метода возвращает ProxyResponse
класс, структура которого необходима для поддержки ответа интеграции прокси (подробнее об этом классе позже). Первый параметр принимает содержимое JSON, предоставляемое API Gateway, поэтому сопоставление строк с объектами будет поддерживать любую структуру объектов JSON. Второй параметр содержит подробную информацию о среде выполнения Lambda.
Этот метод возвращает код состояния 200 (HTTP OK), и предоставленный объект ввода внедряется обратно в тело ответа. Мы делаем это, чтобы убедиться, что лямбда правильно получила входные данные.
ProxyResponse
Класс необходимо выставить три поля: тело (тело ответа HTTP), заголовки (HTTP - заголовки) и statusCode
(код состояния HTTP).
Этот класс является не чем иным, как классом данных, за исключением заголовков, которые включают предварительно определенный заголовок CORS Access-Control-Allow-Origin. Это сделано потому, что, хотя API-шлюз может реализовывать большую часть обмена CORS, некоторые запросы, например запросы с заголовком Authorization, требуют, чтобы Lambda возвращал заголовок Access-Control-Allow-Origin.
Джава
xxxxxxxxxx
1
package com.matthewcasperson;
2
import java.util.HashMap;
4
import java.util.Map;
5
public class ProxyResponse {
7
public final String statusCode;
8
public final String body;
9
public final Map<String, String> headers;
10
public ProxyResponse(
12
final String statusCode,
13
final String body,
14
final Map<String, String> headers) {
15
this.headers = headers == null ? new HashMap<>() : headers;
16
this.body = body;
17
this.statusCode = statusCode;
18
addCORSHeaders();
19
}
20
public ProxyResponse(
22
final String statusCode,
23
final String body) {
24
this.headers = new HashMap<>();
25
this.body = body;
26
this.statusCode = statusCode;
27
addCORSHeaders();
28
}
29
private void addCORSHeaders() {
31
headers.put("Access-Control-Allow-Origin", "*");
32
}
33
}
Пример приложения упакован как UberJAR с плагином Maven Shade, настроенным в файле pom.xml.
XML
xxxxxxxxxx
1
2
<project>
3
<modelVersion>4.0.0</modelVersion>
4
<groupId>com.matthewcasperson</groupId>
5
<artifactId>awslambdajava</artifactId>
6
<version>1.0</version>
7
<properties>
9
<maven.compiler.target>1.8</maven.compiler.target>
10
<maven.compiler.source>1.8</maven.compiler.source>
11
</properties>
12
<dependencies>
14
<dependency>
15
<groupId>com.amazonaws</groupId>
16
<artifactId>aws-lambda-java-core</artifactId>
17
<version>1.1.0</version>
18
</dependency>
19
<dependency>
20
<groupId>com.google.code.gson</groupId>
21
<artifactId>gson</artifactId>
22
<version>2.8.6</version>
23
</dependency>
24
</dependencies>
25
<build>
27
<plugins>
28
<plugin>
29
<groupId>org.apache.maven.plugins</groupId>
30
<artifactId>maven-shade-plugin</artifactId>
31
<version>2.4.3</version>
32
<configuration>
33
<createDependencyReducedPom>false</createDependencyReducedPom>
34
</configuration>
35
<executions>
36
<execution>
37
<phase>package</phase>
38
<goals>
39
<goal>shade</goal>
40
</goals>
41
</execution>
42
</executions>
43
</plugin>
44
</plugins>
45
</build>
46
</project>
После упаковки с mvn package
командой у нас будет один автономный файл JAR, который можно загрузить в виде лямбды.
На скриншоте ниже я создал Lambda, загрузил JAR-файл и протестировал его через консоль Lambda с тестовыми данными по умолчанию. Вы видите, что сериализованный ProxyResponse
класс был возвращен, встраивая предоставленные тестовые данные.
Дальнейшее чтение
Java на AWS с использованием лямбды
AWS Lambda Best Practices