Leveraging Micronaut on AWS Lambda

Naresha K
Naresha KDeveloper | Technical Excellence Coach | Consultant | Trainer at Independent
Leveraging Micronaut on AWS Lambda
Leveraging Micronaut on AWS Lambda
Naresha K
Continuous Delivery Architect | Technical Excellence Coach
naresha.k@gmail.com
@naresha_k
IaaS
PaaS
SaaS
IaaS
PaaS
SaaS
FaaS
CaaS
IaaS
PaaS
SaaS
FaaS
CaaS
Leveraging Micronaut on AWS Lambda
➜ ~ sdk install micronaut
https://sdkman.io/
➜ ~ mn
➜ ~ mn
| Starting interactive mode...
| Enter a command name to run. Use TAB for completion:
mn>
➜ ~ mn
| Starting interactive mode...
| Enter a command name to run. Use TAB for completion:
mn> create-function temperature-converter
➜ ~ mn
| Starting interactive mode...
| Enter a command name to run. Use TAB for completion:
mn>create-function temperature-converter
| Generating Java project...
| Function created at /Users/naresha/practice/micronaut/
awsdaysblr/temperature-converter
| Initializing application. Please wait...
mn>
Leveraging Micronaut on AWS Lambda
@Getter
@Setter
@NoArgsConstructor
@Introspected
public class Temperature {
private double inCelcius;
private double inFahrenheit;
public static Temperature ofCelcius(double celcius) {
Temperature temperature = new Temperature();
temperature.setInCelcius(celcius);
return temperature;
}
public static Temperature ofFahrenheit(double fahrenheit) {
Temperature temperature = new Temperature();
temperature.setInFahrenheit(fahrenheit);
return temperature;
}
}
@FunctionBean("temperature-converter")
public class TemperatureConverterFunction
}
@FunctionBean("temperature-converter")
public class TemperatureConverterFunction
implements Function<Temperature, Temperature> {
}
@FunctionBean("temperature-converter")
public class TemperatureConverterFunction
implements Function<Temperature, Temperature> {
@Override
public Temperature apply(Temperature input) {
return Temperature.ofFahrenheit(input.getInCelcius() * 9 / 5 + 32);
}
}
Deploying to AWS Lambda
➜ temperature-converter ./gradlew assemble
➜ temperature-converter ./gradlew assemble
> Task :compileJava
Note: Creating bean classes for 1 type elements
BUILD SUCCESSFUL in 5s
10 actionable tasks: 8 executed, 2 up-to-date
➜ temperature-converter
➜ temperature-converter ./gradlew assemble
> Task :compileJava
Note: Creating bean classes for 1 type elements
BUILD SUCCESSFUL in 5s
10 actionable tasks: 8 executed, 2 up-to-date
➜ temperature-converter echo '{"inCelcius": 37}' | java -jar ./build/libs/
temperature-converter-0.1-all.jar
➜ temperature-converter ./gradlew assemble
> Task :compileJava
Note: Creating bean classes for 1 type elements
BUILD SUCCESSFUL in 5s
10 actionable tasks: 8 executed, 2 up-to-date
➜ temperature-converter echo '{"inCelcius": 37}' | java -jar ./build/libs/
temperature-converter-0.1-all.jar
{"inCelcius":0.0,"inFahrenheit":98.6}
Leveraging Micronaut on AWS Lambda
Leveraging Micronaut on AWS Lambda
Leveraging Micronaut on AWS Lambda
➜ temperature-converter ./gradlew deploy
> Task :deploy
Function not found: arn:aws:lambda:us-east-1:341512844459:function:temperature-
converter-mn-java-2 (Service: AWSLambda; Status Code: 404; Error Code:
ResourceNotFoundException; Request ID: 0c789b90-e936-4663-ad68-2037c1a3b6ef)
Creating function... temperature-converter-mn-java-2
BUILD SUCCESSFUL in 57s
4 actionable tasks: 1 executed, 3 up-to-date
➜ temperature-converter
@FunctionBean("temperature-converter")
public class TemperatureConverterFunction extends FunctionInitializer
implements Function<Temperature, Temperature> {
@Override
public Temperature apply(Temperature input) {
return Temperature.ofFahrenheit(input.getInCelcius() * 9 / 5 + 32);
}
public static void main(String... args) throws IOException {
TemperatureConverterFunction function =
new TemperatureConverterFunction();
function.run(args, (context) ->
function.apply(context.get(Temperature.class)));
}
}
package com.nareshak.demo
Temperature temperatureConverter(Temperature input) {
new Temperature(inFahrenheit:
input.getInCelcius() * 9 / 5 + 32)
}
package com.nareshak.demo
import groovy.transform.Field
import javax.inject.Inject
@Field @Inject TemperatureConveterService temperatureConveterService
Temperature temperatureConverter(Temperature input) {
new Temperature(inFahrenheit:
temperatureConveterService
.celciusToFahrenheit(input.inCelcius))
}
package com.nareshak.demo
import javax.inject.Singleton
@Singleton
class TemperatureConveterService {
double celciusToFahrenheit(double celcius) {
celcius * 9 / 5 + 32
}
}
Testing Functions
package temperature.converter;
import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;
import javax.inject.Inject;
import static org.junit.jupiter.api.Assertions.assertEquals;
@MicronautTest
public class TemperatureConverterFunctionTest {
@Inject
TemperatureConverterClient client;
@Test
public void testFunction() throws Exception {
Temperature body = Temperature.ofCelcius(37.0);
assertEquals(98.6, client.apply(body).blockingGet().getInFahrenheit());
}
}
package com.nareshak.demo
import io.micronaut.test.annotation.MicronautTest
import spock.lang.Specification
import javax.inject.Inject
@MicronautTest
class TemperatureConverterFunctionSpec extends Specification {
@Inject
TemperatureConverterClient client
void "test temperature-converter-groovy function"() {
given:
Temperature temperature = new Temperature(inCelcius: 37)
expect:
client.convertTemperature(temperature).blockingGet().inFahrenheit == 98.6
}
}
Function Client
@FunctionClient
interface TemperatureConverterClient {
@Named("temperature-converter")
Single<Temperature> convertTemperature(Temperature input)
}
micronaut:
application:
name: clientapp
---
aws:
lambda:
functions:
convertTemperature:
functionName: temperature-converter
region: us-east-1
@Controller
class MainController {
@Inject
TemperatureConverter temperatureConverter
@Get("/")
String index() {
def temperature = new Temperature(inCelcius: 37)
Temperature result = temperatureConverter
.convertTemperature(temperature)
.blockingGet()
result.toString()
}
}
Compile-time dependency injection
=>
less runtime overhead
https://github.com/naresha/awscommunitydayblr_micronaut_faas
Thank You
1 of 39

More Related Content

Similar to Leveraging Micronaut on AWS Lambda(20)

Leveraging Micronaut on AWS Lambda