Deploying a MicroProfile / Quarkus Application as AWS Lambda integrated with Application Load Balancer (ALB / ELB) 📎
import software.amazon.awscdk.services.ec2.Vpc;
//...
var vpc = Vpc.Builder.create(this, "VPC")
.cidr("10.0.0.0/16")
.enableDnsHostnames(true)
.enableDnsSupport(true)
.natGateways(0)
.maxAzs(2)
.build();
...a load balancer:
var loadBalancer = ApplicationLoadBalancer.Builder.create(this, "ELB")
.internetFacing(true)
.loadBalancerName(loadBalancerName)
.vpc(vpc)
.build();
...and a function:
import software.amazon.awscdk.services.lambda.Architecture;
import software.amazon.awscdk.services.lambda.Code;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.lambda.Runtime;
//...
var function = Function.Builder.create(this, functionName)
.runtime(Runtime.JAVA_11)
.architecture(Architecture.ARM_64)
.code(Code.fromAsset("../lambda/target/function.zip"))
.handler(functionHandler)
.memorySize(memory)
.functionName(functionName)
.environment(configuration)
.timeout(Duration.seconds(timeout))
.reservedConcurrentExecutions(maximumConcurrentExecution)
.build();
The Lambda function is integrated with the ALB as a HTTP-listener's target:
import software.amazon.awscdk.services.elasticloadbalancingv2.AddApplicationTargetsProps;
import software.amazon.awscdk.services.elasticloadbalancingv2.BaseApplicationListenerProps;
import software.amazon.awscdk.services.elasticloadbalancingv2.HealthCheck;
import software.amazon.awscdk.services.elasticloadbalancingv2.targets.LambdaTarget;
var lambdaTarget = new LambdaTarget(function);
var listener = loadBalancer.addListener("Http", BaseApplicationListenerProps.builder()
.port(80)
.build());
listener.addTargets("Lambda", AddApplicationTargetsProps.builder()
.targets(List.of(lambdaTarget))
.healthCheck(HealthCheck.builder()
.enabled(true)
.build())
.build());
The entire code ships with the AWS Quarkus Lambda CDK template.
Checkout the deployment and walk-through: