diff --git a/README.md b/README.md index d75f9472..f9ca49dd 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ ___ com.amazonaws aws-lambda-java-runtime-interface-client - 2.0.0 + 2.1.0 com.amazonaws @@ -69,7 +69,7 @@ ___ 'com.amazonaws:aws-lambda-java-events:3.11.0' 'com.amazonaws:aws-lambda-java-events-sdk-transformer:3.0.7' 'com.amazonaws:aws-lambda-java-log4j2:1.5.1' -'com.amazonaws:aws-lambda-java-runtime-interface-client:2.0.0' +'com.amazonaws:aws-lambda-java-runtime-interface-client:2.1.0' 'com.amazonaws:aws-lambda-java-tests:1.1.1' ``` @@ -80,7 +80,7 @@ ___ [com.amazonaws/aws-lambda-java-events "3.11.0"] [com.amazonaws/aws-lambda-java-events-sdk-transformer "3.0.7"] [com.amazonaws/aws-lambda-java-log4j2 "1.5.1"] -[com.amazonaws/aws-lambda-java-runtime-interface-client "2.0.0"] +[com.amazonaws/aws-lambda-java-runtime-interface-client "2.1.0"] [com.amazonaws/aws-lambda-java-tests "1.1.1"] ``` @@ -91,7 +91,7 @@ ___ "com.amazonaws" % "aws-lambda-java-events" % "3.11.0" "com.amazonaws" % "aws-lambda-java-events-sdk-transformer" % "3.0.7" "com.amazonaws" % "aws-lambda-java-log4j2" % "1.5.1" -"com.amazonaws" % "aws-lambda-java-runtime-interface-client" % "2.0.0" +"com.amazonaws" % "aws-lambda-java-runtime-interface-client" % "2.1.0" "com.amazonaws" % "aws-lambda-java-tests" % "1.1.1" ``` diff --git a/aws-lambda-java-events/pom.xml b/aws-lambda-java-events/pom.xml index 4ab0bc0a..a0f25dc5 100644 --- a/aws-lambda-java-events/pom.xml +++ b/aws-lambda-java-events/pom.xml @@ -34,6 +34,7 @@ 1.8 1.8 + 1.18.22 @@ -72,7 +73,7 @@ org.projectlombok lombok - 1.18.16 + ${lombok.version} provided @@ -108,7 +109,7 @@ org.apache.maven.plugins maven-source-plugin - 2.2.1 + 3.2.1 attach-sources @@ -159,6 +160,29 @@ false + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + + UTF-8 + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + + org.projectlombok + lombok + ${lombok.version} + + + UTF-8 + + diff --git a/aws-lambda-java-runtime-interface-client/README.md b/aws-lambda-java-runtime-interface-client/README.md index 8332a11f..933d960a 100644 --- a/aws-lambda-java-runtime-interface-client/README.md +++ b/aws-lambda-java-runtime-interface-client/README.md @@ -13,7 +13,7 @@ You can include this package in your preferred base image to make that base imag Choose a preferred base image. The Runtime Interface Client is tested on Amazon Linux, Alpine, Ubuntu, Debian, and CentOS. The requirements are that the image is: -* built for x86_64 +* built for x86_64 and ARM64 * contains Java >= 8 * contains glibc >= 2.17 or musl @@ -70,7 +70,7 @@ pom.xml com.amazonaws aws-lambda-java-runtime-interface-client - 2.0.0 + 2.1.0 diff --git a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md index 8b74e9f9..3651fd9e 100644 --- a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md +++ b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md @@ -1,3 +1,7 @@ +### January 20, 2022 +`2.1.0` +- fix: Added support for ARM64 architecture + ### Sept 29, 2021 `2.0.0` - Added support for ARM64 architecture @@ -9,4 +13,4 @@ ### December 01, 2020 `1.0.0`: -- Initial release of AWS Lambda Java Runtime Interface Client \ No newline at end of file +- Initial release of AWS Lambda Java Runtime Interface Client diff --git a/aws-lambda-java-runtime-interface-client/pom.xml b/aws-lambda-java-runtime-interface-client/pom.xml index 09716367..f8d2b78a 100644 --- a/aws-lambda-java-runtime-interface-client/pom.xml +++ b/aws-lambda-java-runtime-interface-client/pom.xml @@ -4,7 +4,7 @@ com.amazonaws aws-lambda-java-runtime-interface-client - 2.0.0 + 2.1.0 jar AWS Lambda Java Runtime Interface Client @@ -31,15 +31,18 @@ + UTF-8 + UTF-8 1.8 1.8 + 0.8.7 com.amazonaws aws-lambda-java-core - 1.2.0 + 1.2.1 com.amazonaws @@ -102,9 +105,11 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.8.1 UTF-8 + ${maven.compiler.source} + ${maven.compiler.target} @@ -123,7 +128,7 @@ org.jacoco jacoco-maven-plugin - 0.8.6 + ${jacoco.maven.plugin.version} default-prepare-agent diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/NativeClient.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/NativeClient.java index f3cda8bc..9c44a9ca 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/NativeClient.java +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/NativeClient.java @@ -13,15 +13,20 @@ */ class NativeClient { private static final String nativeLibPath = "/tmp/.aws-lambda-runtime-interface-client"; + private static final String architecturePathSuffix = "/" + getArchIdentifier(); + // Implementation based on AWS CRT, but adopted to support 64-bit architectures only (ref. https://github.com/awslabs/aws-crt-java/blob/0e9c3db8b07258b57c2503cfc47c787ccef10670/src/main/java/software/amazon/awssdk/crt/CRT.java#L106-L134) + private static final String supported_arm_architectures = "^(aarch64.*|arm64.*)$"; + private static final String supported_x86_architectures = "^(x8664|amd64|ia32e|em64t|x64|x86_64)$"; private static final String[] libsToTry = { - "/aws-lambda-runtime-interface-client.glibc.so", - "/aws-lambda-runtime-interface-client.musl.so", + "aws-lambda-runtime-interface-client.glibc.so", + "aws-lambda-runtime-interface-client.musl.so", }; private static final Throwable[] exceptions = new Throwable[libsToTry.length]; static { boolean loaded = false; for (int i = 0; !loaded && i < libsToTry.length; ++i) { - try (InputStream lib = NativeClient.class.getResourceAsStream(libsToTry[i])) { + try (InputStream lib = NativeClient.class.getResourceAsStream( + Paths.get(architecturePathSuffix, libsToTry[i]).toString())) { Files.copy(lib, Paths.get(nativeLibPath), StandardCopyOption.REPLACE_EXISTING); System.load(nativeLibPath); loaded = true; @@ -44,10 +49,25 @@ class NativeClient { initializeClient(userAgent.getBytes()); } + /** + * @return a string describing the detected architecture the RIC is executing on + * @throws UnknownPlatformException + */ + static String getArchIdentifier() { + String arch = System.getProperty("os.arch"); + + if (arch.matches(supported_x86_architectures)) { + return "x86_64"; + } else if (arch.matches(supported_arm_architectures)) { + return "arm64"; + } + + throw new UnknownPlatformException("architecture not supported: " + arch); + } + static native void initializeClient(byte[] userAgent); static native InvocationRequest next(); static native void postInvocationResponse(byte[] requestId, byte[] response); - } diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/UnknownPlatformException.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/UnknownPlatformException.java new file mode 100644 index 00000000..f0b6d76e --- /dev/null +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/UnknownPlatformException.java @@ -0,0 +1,11 @@ +package com.amazonaws.services.lambda.runtime.api.client.runtimeapi; + +/** + * Copyright (c) 2022 Amazon. All rights reserved. + */ +public class UnknownPlatformException extends RuntimeException { + + public UnknownPlatformException(String message) { + super(message); + } +} diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh b/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh index cac239a6..f6d982d1 100755 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh @@ -7,10 +7,25 @@ SRC_DIR=$(dirname "$0") DST_DIR=${1} CURL_VERSION=7.77.0 -# compile the native library -docker build -f "${SRC_DIR}/Dockerfile.glibc" --build-arg CURL_VERSION=${CURL_VERSION} -t lambda-java-jni-lib-glibc "${SRC_DIR}" -docker run --rm --entrypoint /bin/cat lambda-java-jni-lib-glibc /src/aws-lambda-runtime-interface-client.so > "${DST_DIR}"/classes/aws-lambda-runtime-interface-client.glibc.so +# Not using associative arrays to maintain bash 3 compatibility with building on MacOS +# MacOS ships with bash 3 and associative arrays require bash 4+ +# Declaring a map as an array with the column character as a separator : +declare -a ARCHITECTURES_TO_PLATFORM=( + "x86_64:linux/amd64" + "arm64:linux/arm64/v8" +) -docker build -f "${SRC_DIR}/Dockerfile.musl" --build-arg CURL_VERSION=${CURL_VERSION} -t lambda-java-jni-lib-musl "${SRC_DIR}" -docker run --rm --entrypoint /bin/cat lambda-java-jni-lib-musl /src/aws-lambda-runtime-interface-client.so > "${DST_DIR}"/classes/aws-lambda-runtime-interface-client.musl.so +declare -a TARGETS=("glibc" "musl") +for pair in "${ARCHITECTURES_TO_PLATFORM[@]}"; do + arch=${pair%%:*} + platform=${pair#*:} + + mkdir -p "${DST_DIR}"/classes/"${arch}" + + for target in "${TARGETS[@]}"; do + echo "Compiling the native library for target ${target} on architecture ${arch} using Docker platform ${platform}" + docker build --platform="${platform}" -f "${SRC_DIR}"/Dockerfile."${target}" --build-arg CURL_VERSION=${CURL_VERSION} -t lambda-java-jni-lib-"${target}"-"${arch}" "${SRC_DIR}" + docker run --rm --entrypoint /bin/cat lambda-java-jni-lib-"${target}"-"${arch}" /src/aws-lambda-runtime-interface-client.so > "${DST_DIR}"/classes/"${arch}"/aws-lambda-runtime-interface-client."${target}".so + done +done diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/codebuild_build.sh b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/codebuild_build.sh index ffadfa30..e177edb8 100755 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/codebuild_build.sh +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/codebuild_build.sh @@ -176,7 +176,7 @@ else docker_command+=" -e \"INITIATOR=$USER\"" fi -docker_command+=" amazon/aws-codebuild-local:latest" +docker_command+=" public.ecr.aws/codebuild/local-builds:latest" # Note we do not expose the AWS_SECRET_ACCESS_KEY or the AWS_SESSION_TOKEN exposed_command=$docker_command diff --git a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazoncorretto b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazoncorretto index c2781096..a6958cb0 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazoncorretto +++ b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazoncorretto @@ -1,6 +1,6 @@ ARG RUNTIME_VERSION -FROM amazoncorretto:${RUNTIME_VERSION} +FROM public.ecr.aws/amazoncorretto/amazoncorretto:${RUNTIME_VERSION} ADD aws-lambda-java-runtime-interface-client/test/integration/test-handler/target/HelloWorld-1.0.jar . diff --git a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml index 5fdc98ba..14ea7ba9 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml +++ b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml @@ -15,7 +15,7 @@ com.amazonaws aws-lambda-java-runtime-interface-client - 2.0.0 + 2.1.0 diff --git a/aws-lambda-java-tests/pom.xml b/aws-lambda-java-tests/pom.xml index f62a5413..fa986750 100644 --- a/aws-lambda-java-tests/pom.xml +++ b/aws-lambda-java-tests/pom.xml @@ -33,6 +33,7 @@ 1.8 UTF-8 5.7.0 + 0.8.7 @@ -127,7 +128,7 @@ org.jacoco jacoco-maven-plugin - 0.8.6 + ${jacoco.maven.plugin.version} default-prepare-agent