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