Route Spring Cloud Functions

Routing allows you to delegate incoming calls to internal methods. You have already seen this action when the generic FunctionInvoker automatically routed the request to the uppercase function in the deploy spring cloud function section.

If you implement multiple Spring Cloud Functions in the same Application, for example uppercase and lowercase, you deploy two separate Lambda functions with Lambda environment variable spring_cloud_function_definition to provide the routing instructions.

Therefore, a configuration for a single Application with two Lambfa functions would look like this:

package org.datapith.cdk4j.examples.springCloud;

import java.util.function.Function;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Cdk4jSpringCloudApplication {

  public static void main(String[] args) {
    SpringApplication.run(Cdk4jSpringCloudApplication.class, args);
  }

  @Bean
  public Function<String, String> uppercase() {
    return String::toUpperCase;
  }

  @Bean
  public Function<String, String> lowercase() {
    return String::toLowerCase;
  }
}

And the corresponding stack:

package org.datapith.cdk4j.examples.springCloud.infra.aws;

import java.util.Map;
import org.datapith.cdk4j.examples.springCloud.Cdk4jSpringCloudApplication;
import software.amazon.awscdk.Duration;
import software.amazon.awscdk.RemovalPolicy;
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.StackProps;
import software.amazon.awscdk.services.lambda.Code;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.lambda.Runtime;
import software.amazon.awscdk.services.s3.BlockPublicAccess;
import software.amazon.awscdk.services.s3.Bucket;
import software.constructs.Construct;

public class Cdk4jSpringCloudStack extends Stack {

  public Cdk4jSpringCloudStack(final Construct scope, final String id, final StackProps props) {
    super(scope,id);

    String functionName = (Cdk4jSpringCloudApplication.class.getSimpleName() + ".uppercase").replace(".", "_");

    Function.Builder.create(this, "uppercase")
        .functionName("uppercase")
        .runtime(Runtime.JAVA_25)
        .timeout(Duration.seconds(30))
        .memorySize(512)
        .handler("org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest")
        .code(Code.fromAsset("./target/cdk4j-examples-aws.jar"))
        .environment(
            Map.of(
                "MAIN_CLASS", Cdk4jSpringCloudApplication.class.getName(),
                "spring_cloud_function_definition", "uppercase"
            )
        )
        .build();

    Function.Builder.create(this, "lowercase")
        .functionName("lowercase")
        .runtime(Runtime.JAVA_25)
        .timeout(Duration.seconds(30))
        .memorySize(512)
        .handler("org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest")
        .code(Code.fromAsset("./target/cdk4j-examples-aws.jar"))
        .environment(
            Map.of(
                "MAIN_CLASS", Cdk4jSpringCloudApplication.class.getName(),
                "spring_cloud_function_definition", "lowercase"
            )
        )
        .build();

  }
}

After deployment (mvn deploy) the two Lambda function will appear in the console each routing to its own Spring Cloud Function.

routed-lambda-functions