AWS Lambda és a Spring Cloud Function
Az AWS Lambda egy AWS szolgáltatás, mely lehetővé teszi, hogy a különböző programozási nyelven megírt alkalmazásainkat (függvényeinket) anélkül tudjuk futtatni, hogy gondunk lenne az azt kiszolgáló infrastruktúrára. A szolgáltatás a serverless computing kategóriába tartozik, ami kicsit megtévesztő, hiszen itt is van futtató környezet, azonban ez számunkra láthatatlan. A másik ismert megnevezése a Function as a Service (FaaS). Természetesen más cloud szolgáltatóknak is van hasonló megoldásuk, a Microsoftnál az Azure Functions, a Google-nél a Cloud Functions.
A függvények tipikusan valamilyen beérkező eseményre reagálnak, ami lehet egy felhasználói kérés, valamilyen üzenet más szolgáltatás (pl. S3) felöl, vagy üzenet brókeren keresztül beérkező üzenet, pl. valamilyen IoT eszköz, vagy alkalmazás irányából. Miután megírjuk a választott programozási nyelven a függvényünket, azt össze kell csomagolni, és telepíteni. Ez lehet akár egy tömörített fájl, akár egy container image. A szolgáltatás rugalmassága miatt ma akár bármilyen programozási nyelven írhatunk ilyen függvényeket.
A futtatókörnyezettel nem kell foglalkozni, azt a szolgáltatás önmaga kezeli. Ez magában foglalja a hardvert és az operációs rendszert, annak frissítését, erőforrás kezelést, automatikus skálázást és naplózást. És fizetnünk is csak annyit kell, amennyit futott a függvényünk, idő alapján (ezredmásodperc alapon).
A kód futtatása természetesen konténerekben történik, melyek tartalmazzák az adott programozási nyelv futtatókörnyezetét. Azonban a szolgáltatás nem mindig indít minden bejövő eseményhez új konténert, hanem megpróbálja azokat újrahasznosítani. Ennek egyik következménye, hogy bizonyos kérések kiszolgálása tovább tart, mikor a konténert el kell indítani (ún. cold start). Bizonyos kérések kiszolgálása azonban nagyon gyorsan megtörténik (ún. warm start). A nem használt konténereket a szolgáltatás automatikusan leállítja. Másrészt mivel a kérések kiszolgálása ugyanabban a konténerben futhat, lehet ezeknek egymásra hatása (pl. ha használják a fájlrendszert).
Egy AWS Lambda konténer rendelkezésére álló memória konfigurálható 128 és 10240 MB között, természetesen egy ezredmásodperc ára is annál nagyobb, minél több memóriát használ a konténer. Valamint 512 MB és 10240 MB között tudunk hozzá tárhelyet is rendelni, minél többet, annál nagyobb felárral.
Amennyiben saját image-t állítunk elő, először a Amazon Elastic Container Registry (Amazon ECR) szolgáltatásba kell feltöltenünk.
Ha a Lambda függvényünket REST-en akarjuk meghívni, akkor még az API Gateway szolgáltatást kell használnunk.
Ezek alapján mikor érdemes az AWS Lambdát használni? Olyan funkciók megvalósítására ideális, amik eseményekre reagálnak, nincs rá folyamatosan szükségünk, nem kell azonnali választ adnunk, és az üzenetek beérkezése nem egyenletes. Ilyen lehet pl. a kép- és videófeldolgozás, bejövő események adatainak aggregálása, (PDF) dokumentumok generálása.
Vannak azonban esetek, amelyeknél el kell gondolkodnunk, hogy tényleg az AWS Lambda-e a jó választás. Ilyenek például a klasszikus webes alkalmazások. Itt egy gyenge forgalom esetén lehet, hogy a cold start miatt nagyobb lesz a válaszidő. Valamint egy nagyon nagy terhelésű alkalmazás esetén pedig lehet, hogy az idő alapú számlázás nem a legkedvezőbb.
A Spring Cloud Function egy olyan projekt, mely a Spring ökoszisztéma tagja, Spring Boothoz illeszkedik, és segítségével az üzleti logikát Java 8 funkcionális interfészek implementálásával tudjuk megvalósítani. Ezáltal teljesen leválasztja az infrastruktúrális elemekről. Azonban adapterekkel, konfigurációt használva össze tudjuk kapcsolni az üzleti logikát különböző szolgáltatásokkal, pl. AWS Lambdaval is. A Spring Cloud Stream használatával pedig különböző message brokerrekkel, mint pl. RabbitMQ-val vagy Apache Kafkával.
Mivel nem mindegy, hogy a function mennyi memóriát használ, és mennyi idő alatt indul el, ezért a Java bytekód nem feltétlenül a legjobb választás. Azonban a Spring Boot alkalmazásokat könnyű natívvá fordítani.
Ebben a posztban azt mutatom be, hogyan lehet egy natívra fordított, Spring Cloud Functiont használó alkalmazást AWS Lambda függvényként futtatni.
(A példa ingyenesen kipróbálható az AWS Free Tier használatával. Bankkártya adatok megadása szükséges.)
Java SE alkalmazás az SDK-val
Először elkészítek egy Java 21 alkalmazást az AWS Lambda Java Support Libraries segítségével. Itt egy egyszerű AWS Lambda function handlert fogok implementálni. Az alkalmazás teljes forráskódja megtalálható a GitHubon.
A pom.xml
fájlba a következő függőségeket kell felvenni:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>3.11.3</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-log4j2</artifactId>
<version>1.5.1</version>
</dependency>
A beérkező esemény egy JSON dokumentum, melyet képes az SDK azonnal Java objektummá alakítani (input). A válasz ugyanúgy egy Java objektum (output). A kéréshez és a válaszhoz létrehozok egy-egy rekordot.
public record HelloRequest(String name) {}
public record HelloResponse(String message) {}
A függvénynek a RequestHandler
interfészt kell implementálnia. Típusparaméterek az input és az output osztálya.
Ebben implementálom a handleRequest()
metódust. Paramétere az input és egy Context
példány.
Ez utóbbin keresztül a futtatókörnyezethez lehet hozzáférni, mint pl. a naplózó. Visszatérési értéke pedig az output.
public class HelloHandler implements RequestHandler<HelloRequest, HelloResponse> {
@Override
public HelloResponse handleRequest(HelloRequest helloRequest, Context context) {
var logger = context.getLogger();
logger.log("Name: %s".formatted(helloRequest.name()));
return new HelloResponse("Hello %s!".formatted(helloRequest.name()));
}
}
A JSON serialization/deserialization műveleteket ebben az esetben az AWS Lambda futtatókörnyezet végzi.
A függvényt össze kell csomagolni egy JAR fájlba, ugyanis azt könnyű feltölteni az AWS Lambdára. Szükség van arra, hogy a JAR
tartalmazza a függőségeket is. Ehhez a maven-shade-plugin
is használható.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.logging.log4j.maven.plugins.shade.transformer.Log4j2PluginCacheFileTransformer">
</transformer>
</transformers>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-transform-maven-shade-plugin-extensions</artifactId>
<version>0.1.0</version>
</dependency>
</dependencies>
</plugin>
Majd ki kell adni az mvnw package
parancsot.
Függvény létrehozása az AWS Management Console-on
A Services menüben ki kell választani a Lambda szolgáltatást. Majd Create function gombra kell kattintani. A megjelenő űrlapot a következő értékekkel kell kitölteni:
- Function name:
Hello
- Runtime: Java 21
A többi az alapértelmezett értéken hagyható.
Miután létrejött a függvény, a Code fülön a Code source panelen meg kell nyomni
az Upload from gombot, és kiválasztani a .zip or .jar fájl menüpontot.
Itt meg kell adni a target
könyvtárban létrejött hello-aws-lambda-1.0-SNAPSHOT.jar
fájlt.
Majd a Runtime settings panelen az Edit gombra kattintva meg kell adni a következő értéket:
- Handler:
hello.HelloHandler::handleRequest
, ez az osztály és metódus neve
Függvény tesztelése
A függvény teszteléséhez a Test fülre kell kattintani, és az Event JSON mezőbe a következő JSON dokumentumot kell beírni:
{
"name": "John Doe"
}
Majd a Test gombra kell klikkelni. A függvény a következő választ fogja adni:
{
"message": "Hello John Doe!"
}
Log a CloudWatch szolgáltatásban
A futásnak a naplóját a CloudWatch szolgáltatásban is lehet látni, a Logs / Log groups alatt,
és a Log group neve esetünkben: aws/lambda/Hello
.
Függvény telepítése és futtatása Linux parancssorból
Állandóan a felületen klikkelgetni nagyon időigényes, ezért a függvényünket parancssorból is tudjuk telepíteni és futtatni. Mindenképp Linux parancssort használjunk, ugyanis az idézőjelek escape-elése nagyon nehézkes Windows esetén.
Létre kell hozni egy szerepkört:
aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
A visszaadott JSON-ből ki kell másolni az Arn
mező értékét és azt kell használni a következő parancsban.
Telepítés:
aws lambda create-function --function-name Hello \
--runtime java21 --handler hello.HelloHandler \
--role arn:aws:iam::123:role/lambda-ex \
--zip-file fileb://target/hello-aws-lambda-1.0-SNAPSHOT.jar
Futtatás:
aws lambda invoke --function-name Hello --payload '{"name": "John"}' response.json
cat response.json | jq
A válasz a response.json
fájlban található.
Ha a függvény logját is látni szeretnénk:
aws lambda invoke --function-name Hello --payload '{"name": "John"}' --log-type Tail --query 'LogResult' --output text response.json | base64 -d
Módosítás után telepíthetjük az új JAR fájlt:
aws lambda update-function-code --function-name Hello \
--zip-file fileb://target/hello-aws-lambda-1.0-SNAPSHOT.jar
A válasz a response.json
fájlban található.
Függvény futtatása IDEA-ból
Az IDEA-hoz letölthető egy AWS Toolkit plugin. Ebben meg lehet tekinteni a telepített függvényeket, és meg is lehet hívni azokat.
AWS Serverless Application Model (AWS SAM)
Az Amazon egy teljes eszközrendszert is biztosít a függvények fejlesztésére, ez a AWS Serverless Application Model (AWS SAM).
Ennek két fő része van, egyrészt az AWS SAM template specification, ez a AWS CloudFormation kiegészítése. Ennek segítségével deklaratív módon, yaml formátumban írhatjuk le a függvényeink futtató környezetét, és egy paranccsal tudjuk utána telepíteni. Másik része a SAM CLI, mely segítségével gyorsan tudunk projektet létrehozni, buildelni, lokálisan (akár konténerben) futtatni, debuggolni, CI/CD pipeline-t kialakítani, a futó alkalmazást monitorozni, stb.
E nélkül is lehet fejleszteni, ebben a posztban is eltekintünk a használatától.
Spring Boot alkalmazás Spring Cloud Functionnel
Az alkalmazás teljes forráskódja megtalálható a GitHubon.
Az eddigi függőségeken kívül szükség van a Spring Cloud Function AWS Adapterre.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-aws</artifactId>
</dependency>
Ehhez a kell a org.springframework.cloud:spring-cloud-dependencies
a dependencyManagement
tag alá.
Ez tranzitíven behozza a org.springframework.cloud:spring-cloud-function-context
függőséget is,
mely a Spring Cloud Function.
Amennyiben szeretnénk az alkalmazást futtatni, egy olyan JAR-t kell előállítani, mely kicsomagolva tartalmazza a függőségeket.
Ehhez először egy olyan JAR-t kell készíteni, ami nem tartalmazza JAR-ként a függőségeket, majd oda kell másolni
kicsomagolva a függőségeket. Ehhez egyrészt a org.springframework.boot.experimental:spring-boot-thin-layout
függőségre
van szükség a org.springframework.boot:spring-boot-maven-plugin
pluginnál.
(A Spring Boot Thin Launcher már önmagában is egy nagyon érdekes projekt.
Spring Boot alkalmazásnál probléma, hogy az összes függőség az alkalmazásba kerül bele, amitől az nagy lesz, és ha feltöltjük Maven
repo-ba, akkor többszörösen kerül eltárolásra. Ezért megalkották a Thin Jar fogalmát, ami csak az alkalmazást tartalmazza függőségek nélkül.
Valamint a JAR-ba becsomagolásra kerül egy ThinJarWrapper
osztály, mely először letölt egy másik JAR fájlt, az ún. launcher JAR-t.
Ennek feladata, hogy a JAR-ban található pom.xml
alapján felolvassa a függőségeket, és letölti a Maven local repository-ba.)
Másrészt kell a org.apache.maven.plugins:maven-shade-plugin
plugin, ami pedig a függőségeket másolja kitömörítve a JAR-ba.
Az ehhez tartozó pom.xml
részlet:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimental</groupId>
<artifactId>spring-boot-thin-layout</artifactId>
<version>1.0.30.RELEASE</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>aws</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Az alkalmazás maga nagyon egyszerű, szükség van a korábbi HelloRequest
és
HelloResponse
rekordokra, valamint maga az alkalmazás a következőképp néz ki:
@SpringBootApplication
@Slf4J
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
@Bean
public Function<HelloRequest, HelloResponse> hello() {
return (request) -> {
var name = request.name();
log.debug("Name: %s".formatted(name));
return new HelloResponse("Hello %s!".formatted(name));
};
}
}
Azaz definiálunk egy Function
implementációt, melyet az AWS Lambda fog meghívni.
A függvényünk a FunctionCatalog
segítségével tesztelhető, a Spring Cloud Function ugyanis ide
regisztrálja a függvényeket.
@SpringBootTest
public class HelloIT {
@Autowired
FunctionCatalog functionCatalog;
@Test
void hello() {
var function = (Function<Message<HelloRequest>, HelloResponse>) functionCatalog.lookup("hello");
var response = function.apply(new HelloRequest("John Doe"));
assertEquals("Hello John Doe!", response.message());
}
}
Spring Boot alkalmazás telepítése
Az mvnw -Pshaded package
paranccsal létrehozott alkalmazást az előbb leírt módon telepíthető.
Legyen a neve pl. SpringHello
.
A Maven profile azért kell, mert én a két plugint a shaded
profile alatt hoztam létre.
A különbség csak annyi, hogy a Handler értékeként a org.springframework.cloud.function.adapter.aws.FunctionInvoker
értéket állítsuk be.
Utána ugyanúgy tesztelhető, mint egyszerű Java SE alkalmazás esetén.
Naplózás
Naplózás során két megoldás közül választhatunk:
- Konzol, Spring Boot esetén alapértelmezetten Logbackkel
- AWS Lambda által biztosított
LambdaLogger
A különbség, hogy az utóbbi jól kezeli a többsoros naplókat is, de sokkal kevésbé konfigurálható, mint a Logback.
A legjobb, ha kombináljuk, azaz a Logback napló bejegyzéseket átvezetjük a LambdaLogger
felé, pl.
a jlib AWS Lambda SLF4J/Logback Appender segítségével.
Paraméterezhetőség
A property-ket parancssori kapcsolóként, vagy környezeti változóként is meg lehet adni. Pl. a naplózás módosítása
beállítható a Configuration fülön, Environment variables menüpontban, a JAVA_TOOL_OPTIONS
értéke legyen
-Dlogging.level.hello=debug
.
Reaktív megoldás
A függvény reaktívan is megírható:
@Bean
public Function<Flux<HelloRequest>, Flux<HelloResponse>> hello() {
return request ->
request
.map(HelloRequest::name)
.doOnNext(name -> log.debug("Name: %s".formatted(name)))
.map("Hello %s!"::formatted)
.map(HelloResponse::new);
}
Belső működés
A FunctionInvoker
implementálja a RequestStreamHandler
interfészt. Azért nem a már említett RequestHandler
interfészt, mert itt az alkalmazás maga kezeli a JSON serialization/deserialization műveleteket. Ezt az AWS Lambda környezet hívja meg
a Handler értéke miatt. Ez beindítja a Spring Application Contextet --spring.main.web-application-type=none
és --spring.cloud.function.web.export.enabled=false
paraméterekkel. Előbbi kikapcsolja, hogy az alkalmazás webalkalmazásként induljon el. Az utóbbi
kikapcsolja, hogy a függvényeink REST-en kiajánlásra kerüljenek. Így nem baj, ha a
org.springframework.boot:spring-boot-starter-web
és org.springframework.cloud:spring-cloud-function-web
függőségek a Classpath-on vannak, valamint hogy milyen property-k vannak beállítva. Majd a FunctionCatalog
példányon keresztül meghívja a függvényt.
Közben info
szinten naplóz:
2024-05-06T11:41:37.989Z INFO 8 --- [ main] o.s.c.f.adapter.aws.FunctionInvoker : Locating function: 'null'
2024-05-06T11:41:38.006Z INFO 8 --- [ main] o.s.c.f.adapter.aws.FunctionInvoker : Located function: 'hello'
2024-05-06T11:41:38.041Z INFO 8 --- [ main] o.s.c.f.adapter.aws.AWSLambdaUtils : Received:
{
"name": "John Doe"
}
Mivel nincs megadva spring.cloud.function.definition
property, ezért az egyetlen függvényünket választja ki, és hívja meg.
Web függőségek és belső működés
A Spring Boot alkalmazás esetén fel szoktuk venni a org.springframework.boot:spring-boot-starter-web
függőséget,
valamint Spring Cloud Function esetén a org.springframework.cloud:spring-cloud-function-web
. Ezzel egyrészt
tranzitívan bekerül a függőségek közé egy web konténer, pl. a Tomcat, másrészt az alkalmazásunk índításakor ez el is
indul. Utána a spring.cloud.function.web.export.enabled
property true
értékre való állításával
HTTP-n keresztül, REST-en is meghívható a függvény.
Ezért a web függőségeket valahogy ki kell iktatni a következő módok valamelyikét használva, mert nem kell az alkalmazásba:
- Ne legyen egyáltalán a függőségek között, a függvény tesztesetből próbálható ki
- Legyen csak teszt scope-ban
- Vagy csak bizonyos Maven profile használata esetén legyen a függőségek között
- Csomagoláskor kerüljön exclude-álásra
- A függőség ellenére is az alkalmazás legyen parancssori alkalmazás,
spring.main.web-application-type
property értéke legyennone
Native image működése
Amikor image kerül feltöltésre, akkor kicsit másképpen működik. Hiszen az image, ami elkészül, nem tartalmazza az AWS Lambda futtató környezetet. Ez az ún. custom runtime. Így amikor az AWS Lambda elindítja a konténert, benne az alkalmazást, ezáltal a függvényt, annak kell kihívnia egy URL-en a Lambda felé (a host nevét megkapja környezeti változóban), és az AWS Lambda adja vissza a következő kérést. Ezt utána fel tudja dolgozni a függvény. Ha ezt feldolgozta, akkor kihívhat, hogy van-e következő kérés. Ezt egészen addig, amíg van kérés, így ugyanabban a konténerban futó függvény fel tud dolgozni több kérést is. Ez az ún. Lambda runtime API. (Mellesleg ennek a felhasználásával bármilyen programozási nyelven lehet AWS Lambda környezetben futó függvényt írni.)
Native image elkészítése és futtatása
A natív image futtatásának lépései:
- Image elkészítése lokálisan
- Image feltöltése a Elastic Container Registry-be
- Új Function létrehozása image alapján
Mivel a függvény hív ki http-n, szükséges a következő
konfiguráció a pom.xml
-ben:
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<buildArgs>
<buildArg>--enable-url-protocols=http</buildArg>
</buildArgs>
</configuration>
</plugin>
Az image készítéséhez ki kell adni a következő parancsot:
mvn -Pnative spring-boot:build-image
Ennek neve docker.io/library/hello-aws-lambda-scf:0.0.1-SNAPSHOT
lesz.
Az Elastic Container Registry oldalán a Create repository gombbal létre kell hozni egy új repository-t. Legyen a
neve pl. hello
. Ide kell push-olni az elkészült image-t, az ehhez való parancsokat megtalálhatóak a
View push commands gombra kattintva. Következő lépéseket kell megtenni:
- Bejelentkezés,
aws ecr get-login-password
kezdetű parancs - Elkészült image taggelése:
docker tag
kezdetű parancs - Repository-ba feltöltés:
docker push parancs
Parancssorban (természetesen a registry azonosítóját cserélni kell):
aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin 12345.dkr.ecr.eu-central-1.amazonaws.com
docker tag docker.io/library/hello-aws-lambda-scf:0.0.1-SNAPSHOT 12345.dkr.ecr.eu-central-1.amazonaws.com/hello:latest
docker push 12345.dkr.ecr.eu-central-1.amazonaws.com/hello:latest
Most már csak a Functiont kell létrehozni:
- Container image
- Funcation name:
SpringNative
- Container image URI: A Browse image gombbal válasszuk ki a feltöltött image-t a repository-ból
- ENTRYPOINT:
/workspace/hello.HelloApplication
- CMD:
hello
Futtatás ugyanúgy történik, mint az előző függvény esetén, teszt üzenettel.
Sebesség összehasonlítás
Bytecode | Native | |
Teszt futása | ~7 s | ~1 s |
Billed duration | ~3000 ms | ~1200 ms |
Spring Boot start | ~2500 ms | 100 ms |
Belső működés
Indításkor a CustomRuntimeInitializer
osztály regisztrál bizonyos feltételek mellett az Application Contextbe egy
CustomRuntimeEventLoop
példányt. Csak akkor, ha a spring.cloud.function.web.export.enabled
értéke nem
true
, és adott a _HANDLER
property. Ezért kell megadni CMD
értéket, mert az első paraméter értéke lesz a
_HANDLER
környezeti változó értéke, és ha ez nincs megadva, akkor nem kerül példányosításra a
CustomRuntimeInitializer
. A _HANDLER
értéke bármi lehet, ugyanis ha nem talál vele functiont,
de csak egy van, akkor azt az egyet fogja megtalálni. A CustomRuntimeEventLoop
osztály egy példánya hívogat ki ciklusban
HTTP-n keresztül az AWS Lambda felé RestTemplate
használatával.
Konfiguráció
Átadhatóak property-k parancssori paraméterként is, pl. a CMD override-nál. Naplózás módosításakor
be kell állítani a következőt: hello, -Dlogging.level.hello=debug
. A paramétereket vesszővel kell elválasztani,
és az első paraméter mindig a _HANDLER
értéke lesz (ami a function neve).
Függvény elérése HTTP-n
Ahhoz, hogy a függvényünket HTTP-n el lehessen érni, használni kell az AWS API Gateway szolgáltatást.
Ez a bejövő HTTP kéréseket továbbítja a függvénynek.
Kiválasztása után a Create API gombra kell kattintani, majd REST API, és Build gomb.
Itt New API, API name értéke legyen SpringHello
, majd Create API gomb.
A /
URL alatt meg kell nyomni a Create method gombot, és meg kell adni a következőket:
- Method type: POST
- Lambda function
- Lambda function kiválasztása legördülő menüből
Majd Create method gomb.
Ezután csak deploy-olni kell. Ehhez meg kell nyomni a Deploy API gombot, majd a Stage name beviteli mezőben megadni a production
értéket. Ezután megjelenik egy Invoke URL, mely értéke valami hasonló: https://abc.execute-api.eu-central-1.amazonaws.com/production
.
Ide már küldhető is a kérés:
POST https://jsbz878wuc.execute-api.eu-central-1.amazonaws.com/production/
Content-Type: application/json
{
"name": "Jack Doe"
}
Vagy CURL használatával:
curl -X POST --location "https://abc.execute-api.eu-central-1.amazonaws.com/production/" \
-H "Content-Type: application/json" \
-d '{
"name": "Jack Doe"
}'