package com.myorg; import java.util.Arrays; import java.util.List; import software.amazon.awscdk.App; import software.amazon.awscdk.BundlingOptions; import software.amazon.awscdk.CfnOutput; import software.amazon.awscdk.CfnOutputProps; import software.constructs.Construct; import software.amazon.awscdk.DockerVolume; import software.amazon.awscdk.Duration; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.apigatewayv2.alpha.AddRoutesOptions; import software.amazon.awscdk.services.apigatewayv2.alpha.HttpApi; import software.amazon.awscdk.services.apigatewayv2.alpha.HttpApiProps; import software.amazon.awscdk.services.apigatewayv2.alpha.HttpMethod; import software.amazon.awscdk.services.apigatewayv2.alpha.PayloadFormatVersion; import software.amazon.awscdk.services.apigatewayv2.integrations.alpha.HttpLambdaIntegration; import software.amazon.awscdk.services.apigatewayv2.integrations.alpha.HttpLambdaIntegrationProps; import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.FunctionProps; import software.amazon.awscdk.services.lambda.Runtime; import software.amazon.awscdk.services.logs.RetentionDays; import software.amazon.awscdk.services.s3.assets.AssetOptions; import static java.util.Collections.singletonList; import static software.amazon.awscdk.BundlingOutput.ARCHIVED; public class InfrastructureStack extends Stack { public InfrastructureStack(final App parent, final String id) { this(parent, id, null); } public InfrastructureStack(final Construct parent, final String id, final StackProps props) { super(parent, id, props); List functionOnePackagingInstructions = Arrays.asList( "/bin/sh", "-c", "cd FunctionOne " + "&& mvn clean install " + "&& cp /asset-input/FunctionOne/target/functionone.jar /asset-output/" ); List functionTwoPackagingInstructions = Arrays.asList( "/bin/sh", "-c", "cd FunctionTwo " + "&& mvn clean install " + "&& cp /asset-input/FunctionTwo/target/functiontwo.jar /asset-output/" ); BundlingOptions.Builder builderOptions = BundlingOptions.builder() .command(functionOnePackagingInstructions) .image(Runtime.JAVA_11.getBundlingImage()) .volumes(singletonList( // Mount local .m2 repo to avoid download all the dependencies again inside the container DockerVolume.builder() .hostPath(System.getProperty("user.home") + "/.m2/") .containerPath("/root/.m2/") .build() )) .user("root") .outputType(ARCHIVED); Function functionOne = new Function(this, "FunctionOne", FunctionProps.builder() .runtime(Runtime.JAVA_11) .code(Code.fromAsset("../software/", AssetOptions.builder() .bundling(builderOptions .command(functionOnePackagingInstructions) .build()) .build())) .handler("helloworld.App") .memorySize(1024) .timeout(Duration.seconds(10)) .logRetention(RetentionDays.ONE_WEEK) .build()); Function functionTwo = new Function(this, "FunctionTwo", FunctionProps.builder() .runtime(Runtime.JAVA_11) .code(Code.fromAsset("../software/", AssetOptions.builder() .bundling(builderOptions .command(functionTwoPackagingInstructions) .build()) .build())) .handler("helloworld.App") .memorySize(1024) .timeout(Duration.seconds(10)) .logRetention(RetentionDays.ONE_WEEK) .build()); HttpApi httpApi = new HttpApi(this, "sample-api", HttpApiProps.builder() .apiName("sample-api") .build()); httpApi.addRoutes(AddRoutesOptions.builder() .path("/one") .methods(singletonList(HttpMethod.GET)) .integration(new HttpLambdaIntegration("functionOne", functionOne, HttpLambdaIntegrationProps.builder() .payloadFormatVersion(PayloadFormatVersion.VERSION_2_0) .build())) .build()); httpApi.addRoutes(AddRoutesOptions.builder() .path("/two") .methods(singletonList(HttpMethod.GET)) .integration(new HttpLambdaIntegration("functionTwo", functionTwo, HttpLambdaIntegrationProps.builder() .payloadFormatVersion(PayloadFormatVersion.VERSION_2_0) .build())) .build()); new CfnOutput(this, "HttApi", CfnOutputProps.builder() .description("Url for Http Api") .value(httpApi.getApiEndpoint()) .build()); } }