Skip to content

Commit 6785d09

Browse files
muellerccarlzogh
andauthored
fix: add support for ARM based platforms (#300)
- Fixed build-jni-lib.sh script after refactoring it - Upgrade jacoco maven plugin from 0.8.6 to 0.8.7 to solve a build error with JDK 17 - Update java-core and maven-compiler-plugin, - Use CodeBuild image from ECR - Stage RIC 2.1.0, change to use Public ECR base image for amazoncorretto tests Co-authored-by: Carl Zogheib <[email protected]>
1 parent 6d2383c commit 6785d09

File tree

12 files changed

+106
-26
lines changed

12 files changed

+106
-26
lines changed

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ ___
5252
<dependency>
5353
<groupId>com.amazonaws</groupId>
5454
<artifactId>aws-lambda-java-runtime-interface-client</artifactId>
55-
<version>2.0.0</version>
55+
<version>2.1.0</version>
5656
</dependency>
5757
<dependency>
5858
<groupId>com.amazonaws</groupId>
@@ -69,7 +69,7 @@ ___
6969
'com.amazonaws:aws-lambda-java-events:3.11.0'
7070
'com.amazonaws:aws-lambda-java-events-sdk-transformer:3.0.7'
7171
'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
72-
'com.amazonaws:aws-lambda-java-runtime-interface-client:2.0.0'
72+
'com.amazonaws:aws-lambda-java-runtime-interface-client:2.1.0'
7373
'com.amazonaws:aws-lambda-java-tests:1.1.1'
7474
```
7575

@@ -80,7 +80,7 @@ ___
8080
[com.amazonaws/aws-lambda-java-events "3.11.0"]
8181
[com.amazonaws/aws-lambda-java-events-sdk-transformer "3.0.7"]
8282
[com.amazonaws/aws-lambda-java-log4j2 "1.5.1"]
83-
[com.amazonaws/aws-lambda-java-runtime-interface-client "2.0.0"]
83+
[com.amazonaws/aws-lambda-java-runtime-interface-client "2.1.0"]
8484
[com.amazonaws/aws-lambda-java-tests "1.1.1"]
8585
```
8686

@@ -91,7 +91,7 @@ ___
9191
"com.amazonaws" % "aws-lambda-java-events" % "3.11.0"
9292
"com.amazonaws" % "aws-lambda-java-events-sdk-transformer" % "3.0.7"
9393
"com.amazonaws" % "aws-lambda-java-log4j2" % "1.5.1"
94-
"com.amazonaws" % "aws-lambda-java-runtime-interface-client" % "2.0.0"
94+
"com.amazonaws" % "aws-lambda-java-runtime-interface-client" % "2.1.0"
9595
"com.amazonaws" % "aws-lambda-java-tests" % "1.1.1"
9696
```
9797

aws-lambda-java-events/pom.xml

+26-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<properties>
3535
<maven.compiler.source>1.8</maven.compiler.source>
3636
<maven.compiler.target>1.8</maven.compiler.target>
37+
<lombok.version>1.18.22</lombok.version>
3738
</properties>
3839

3940
<distributionManagement>
@@ -72,7 +73,7 @@
7273
<dependency>
7374
<groupId>org.projectlombok</groupId>
7475
<artifactId>lombok</artifactId>
75-
<version>1.18.16</version>
76+
<version>${lombok.version}</version>
7677
<scope>provided</scope>
7778
</dependency>
7879
</dependencies>
@@ -108,7 +109,7 @@
108109
<plugin>
109110
<groupId>org.apache.maven.plugins</groupId>
110111
<artifactId>maven-source-plugin</artifactId>
111-
<version>2.2.1</version>
112+
<version>3.2.1</version>
112113
<executions>
113114
<execution>
114115
<id>attach-sources</id>
@@ -159,6 +160,29 @@
159160
<autoReleaseAfterClose>false</autoReleaseAfterClose>
160161
</configuration>
161162
</plugin>
163+
<plugin>
164+
<groupId>org.apache.maven.plugins</groupId>
165+
<artifactId>maven-resources-plugin</artifactId>
166+
<version>3.2.0</version>
167+
<configuration>
168+
<encoding>UTF-8</encoding>
169+
</configuration>
170+
</plugin>
171+
<plugin>
172+
<groupId>org.apache.maven.plugins</groupId>
173+
<artifactId>maven-compiler-plugin</artifactId>
174+
<version>3.8.1</version>
175+
<configuration>
176+
<annotationProcessorPaths>
177+
<path>
178+
<groupId>org.projectlombok</groupId>
179+
<artifactId>lombok</artifactId>
180+
<version>${lombok.version}</version>
181+
</path>
182+
</annotationProcessorPaths>
183+
<encoding>UTF-8</encoding>
184+
</configuration>
185+
</plugin>
162186
</plugins>
163187
</build>
164188
</profile>

aws-lambda-java-runtime-interface-client/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ You can include this package in your preferred base image to make that base imag
1313

1414
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:
1515

16-
* built for x86_64
16+
* built for x86_64 and ARM64
1717
* contains Java >= 8
1818
* contains glibc >= 2.17 or musl
1919

@@ -70,7 +70,7 @@ pom.xml
7070
<dependency>
7171
<groupId>com.amazonaws</groupId>
7272
<artifactId>aws-lambda-java-runtime-interface-client</artifactId>
73-
<version>2.0.0</version>
73+
<version>2.1.0</version>
7474
</dependency>
7575
</dependencies>
7676
<build>

aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### January 20, 2022
2+
`2.1.0`
3+
- fix: Added support for ARM64 architecture
4+
15
### Sept 29, 2021
26
`2.0.0`
37
- Added support for ARM64 architecture
@@ -9,4 +13,4 @@
913

1014
### December 01, 2020
1115
`1.0.0`:
12-
- Initial release of AWS Lambda Java Runtime Interface Client
16+
- Initial release of AWS Lambda Java Runtime Interface Client

aws-lambda-java-runtime-interface-client/pom.xml

+9-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>com.amazonaws</groupId>
66
<artifactId>aws-lambda-java-runtime-interface-client</artifactId>
7-
<version>2.0.0</version>
7+
<version>2.1.0</version>
88
<packaging>jar</packaging>
99

1010
<name>AWS Lambda Java Runtime Interface Client</name>
@@ -31,15 +31,18 @@
3131
</developers>
3232

3333
<properties>
34+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
35+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
3436
<maven.compiler.source>1.8</maven.compiler.source>
3537
<maven.compiler.target>1.8</maven.compiler.target>
38+
<jacoco.maven.plugin.version>0.8.7</jacoco.maven.plugin.version>
3639
</properties>
3740

3841
<dependencies>
3942
<dependency>
4043
<groupId>com.amazonaws</groupId>
4144
<artifactId>aws-lambda-java-core</artifactId>
42-
<version>1.2.0</version>
45+
<version>1.2.1</version>
4346
</dependency>
4447
<dependency>
4548
<groupId>com.amazonaws</groupId>
@@ -102,9 +105,11 @@
102105
<plugin>
103106
<groupId>org.apache.maven.plugins</groupId>
104107
<artifactId>maven-compiler-plugin</artifactId>
105-
<version>2.3.2</version>
108+
<version>3.8.1</version>
106109
<configuration>
107110
<encoding>UTF-8</encoding>
111+
<source>${maven.compiler.source}</source>
112+
<target>${maven.compiler.target}</target>
108113
</configuration>
109114
</plugin>
110115
<plugin>
@@ -123,7 +128,7 @@
123128
<plugin>
124129
<groupId>org.jacoco</groupId>
125130
<artifactId>jacoco-maven-plugin</artifactId>
126-
<version>0.8.6</version>
131+
<version>${jacoco.maven.plugin.version}</version>
127132
<executions>
128133
<execution>
129134
<id>default-prepare-agent</id>

aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/runtimeapi/NativeClient.java

+24-4
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,20 @@
1313
*/
1414
class NativeClient {
1515
private static final String nativeLibPath = "/tmp/.aws-lambda-runtime-interface-client";
16+
private static final String architecturePathSuffix = "/" + getArchIdentifier();
17+
// 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)
18+
private static final String supported_arm_architectures = "^(aarch64.*|arm64.*)$";
19+
private static final String supported_x86_architectures = "^(x8664|amd64|ia32e|em64t|x64|x86_64)$";
1620
private static final String[] libsToTry = {
17-
"/aws-lambda-runtime-interface-client.glibc.so",
18-
"/aws-lambda-runtime-interface-client.musl.so",
21+
"aws-lambda-runtime-interface-client.glibc.so",
22+
"aws-lambda-runtime-interface-client.musl.so",
1923
};
2024
private static final Throwable[] exceptions = new Throwable[libsToTry.length];
2125
static {
2226
boolean loaded = false;
2327
for (int i = 0; !loaded && i < libsToTry.length; ++i) {
24-
try (InputStream lib = NativeClient.class.getResourceAsStream(libsToTry[i])) {
28+
try (InputStream lib = NativeClient.class.getResourceAsStream(
29+
Paths.get(architecturePathSuffix, libsToTry[i]).toString())) {
2530
Files.copy(lib, Paths.get(nativeLibPath), StandardCopyOption.REPLACE_EXISTING);
2631
System.load(nativeLibPath);
2732
loaded = true;
@@ -44,10 +49,25 @@ class NativeClient {
4449
initializeClient(userAgent.getBytes());
4550
}
4651

52+
/**
53+
* @return a string describing the detected architecture the RIC is executing on
54+
* @throws UnknownPlatformException
55+
*/
56+
static String getArchIdentifier() {
57+
String arch = System.getProperty("os.arch");
58+
59+
if (arch.matches(supported_x86_architectures)) {
60+
return "x86_64";
61+
} else if (arch.matches(supported_arm_architectures)) {
62+
return "arm64";
63+
}
64+
65+
throw new UnknownPlatformException("architecture not supported: " + arch);
66+
}
67+
4768
static native void initializeClient(byte[] userAgent);
4869

4970
static native InvocationRequest next();
5071

5172
static native void postInvocationResponse(byte[] requestId, byte[] response);
52-
5373
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.amazonaws.services.lambda.runtime.api.client.runtimeapi;
2+
3+
/**
4+
* Copyright (c) 2022 Amazon. All rights reserved.
5+
*/
6+
public class UnknownPlatformException extends RuntimeException {
7+
8+
public UnknownPlatformException(String message) {
9+
super(message);
10+
}
11+
}

aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh

+20-5
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,25 @@ SRC_DIR=$(dirname "$0")
77
DST_DIR=${1}
88
CURL_VERSION=7.77.0
99

10-
# compile the native library
11-
docker build -f "${SRC_DIR}/Dockerfile.glibc" --build-arg CURL_VERSION=${CURL_VERSION} -t lambda-java-jni-lib-glibc "${SRC_DIR}"
12-
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
10+
# Not using associative arrays to maintain bash 3 compatibility with building on MacOS
11+
# MacOS ships with bash 3 and associative arrays require bash 4+
12+
# Declaring a map as an array with the column character as a separator :
13+
declare -a ARCHITECTURES_TO_PLATFORM=(
14+
"x86_64:linux/amd64"
15+
"arm64:linux/arm64/v8"
16+
)
1317

14-
docker build -f "${SRC_DIR}/Dockerfile.musl" --build-arg CURL_VERSION=${CURL_VERSION} -t lambda-java-jni-lib-musl "${SRC_DIR}"
15-
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
18+
declare -a TARGETS=("glibc" "musl")
1619

20+
for pair in "${ARCHITECTURES_TO_PLATFORM[@]}"; do
21+
arch=${pair%%:*}
22+
platform=${pair#*:}
23+
24+
mkdir -p "${DST_DIR}"/classes/"${arch}"
25+
26+
for target in "${TARGETS[@]}"; do
27+
echo "Compiling the native library for target ${target} on architecture ${arch} using Docker platform ${platform}"
28+
docker build --platform="${platform}" -f "${SRC_DIR}"/Dockerfile."${target}" --build-arg CURL_VERSION=${CURL_VERSION} -t lambda-java-jni-lib-"${target}"-"${arch}" "${SRC_DIR}"
29+
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
30+
done
31+
done

aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/codebuild_build.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ else
176176
docker_command+=" -e \"INITIATOR=$USER\""
177177
fi
178178

179-
docker_command+=" amazon/aws-codebuild-local:latest"
179+
docker_command+=" public.ecr.aws/codebuild/local-builds:latest"
180180

181181
# Note we do not expose the AWS_SECRET_ACCESS_KEY or the AWS_SESSION_TOKEN
182182
exposed_command=$docker_command

aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazoncorretto

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
ARG RUNTIME_VERSION
22

3-
FROM amazoncorretto:${RUNTIME_VERSION}
3+
FROM public.ecr.aws/amazoncorretto/amazoncorretto:${RUNTIME_VERSION}
44

55
ADD aws-lambda-java-runtime-interface-client/test/integration/test-handler/target/HelloWorld-1.0.jar .
66

aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<dependency>
1616
<groupId>com.amazonaws</groupId>
1717
<artifactId>aws-lambda-java-runtime-interface-client</artifactId>
18-
<version>2.0.0</version>
18+
<version>2.1.0</version>
1919
</dependency>
2020
</dependencies>
2121

aws-lambda-java-tests/pom.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<maven.compiler.target>1.8</maven.compiler.target>
3434
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3535
<junit.version>5.7.0</junit.version>
36+
<jacoco.maven.plugin.version>0.8.7</jacoco.maven.plugin.version>
3637
</properties>
3738

3839
<dependencies>
@@ -127,7 +128,7 @@
127128
<plugin>
128129
<groupId>org.jacoco</groupId>
129130
<artifactId>jacoco-maven-plugin</artifactId>
130-
<version>0.8.6</version>
131+
<version>${jacoco.maven.plugin.version}</version>
131132
<executions>
132133
<execution>
133134
<id>default-prepare-agent</id>

0 commit comments

Comments
 (0)