Pubblicato il 24/09/2022 da alnao nella categoria AWS

E’ possibile creare con CloudFormation un template per la creazione API Rest sviluppata in Java il servizio Lambda e il paradigma del server-less. Proma di tutto bisogna creare un template in formato yaml (o json) e inseire la definizione dei vari componenti, in questo semplice esempio sono due: la funzione e httpApi:

HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: HelloWorldFunction
Handler: helloworld.App::handleRequest
Runtime: java8
Environment:
Variables:
PARAM1: VALUE
Events:
HelloWorld:
Type: HttpApi
Properties:
ApiId: !Ref ES15HttpApi
Path: /hello
Method: GET
ES15HttpApi:
Type: AWS::Serverless::HttpApi
Properties:
StageName: !Ref StageName
RouteSettings:
"GET /hello":
ThrottlingBurstLimit: 500 # overridden in HttpApi

Per il codice in java bisogna creare un progetto java dentro ad una sottocartella “HelloWorldFunction” (valore del CodeUri) come un progetto maven ufficiale, con con file pom.xml dove bisogna indicare le dipendenze del progetto e le configurazioni del compilatore java, un esempio è disponibile:

https://github.com/alnao/AWSCloudFormationExamples/blob/master/Esempio15lambdaJava/HelloWorldFunction/pom.xml

Poi ovviamente bisogna creare la classe che verrà eseguita come Lambda, in questo caso bisogna creare un metodo java indicato nella proprietà Handler del template cloudformation: il package (helloworld), la classe (App) e il metodo (handleRequest), per esempio:

public class App implements RequestHandler<Object, Object> {
public Object handleRequest(final Object input, final Context context) {
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
headers.put("X-Custom-Header", "application/json");
try {
String output = String.format("{ \"message\": \"hello world\" }");
return new GatewayResponse(output, headers, 200);
} catch (Exception e) {
return new GatewayResponse("{}", headers, 500);
}
}
}

In questo semplice esempio è stata usata una classe POJO creata custom dal nome GatewayResponse

public class GatewayResponse {
private final String body;
private final Map<String, String> headers;
private final int statusCode;
...

Una volta compilato in locale con il comando

mvn install
mvn build

si possono eseguire i comandi aws-sam per eseguire il caricamento della funzione in un ambiente AWS come tutti gli altri template. In questo caso la classe java viene compilata e inserita dentro ad un pacchetto jar (anche se con estensione zip) e caricata nel bucket indicato in fase di deloy del comando sam. In alternativa a maven e al pom.xml è possibile usare il gradle creando il file build.gradle con le configurazioni del compilatore

Un esempio completo funzionante è disponibile sul GIT:

https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio15lambdaJava