Skip to content
This repository was archived by the owner on Apr 6, 2026. It is now read-only.

Commit b2c0b99

Browse files
authored
fix(lambda): copy func code to /var/runtime for provided runtimes #114 (#39)
1 parent a1311c9 commit b2c0b99

2 files changed

Lines changed: 77 additions & 0 deletions

File tree

sdk-test-java/src/main/java/com/floci/test/tests/LambdaInvokeTests.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,50 @@ public void run(TestContext ctx) {
145145
lambda.deleteFunction(DeleteFunctionRequest.builder()
146146
.functionName(rubyFn).build());
147147
} catch (Exception ignored) {}
148+
149+
// provided.al2023 custom runtime (bootstrap shell script)
150+
String providedFn = "sdk-invoke-provided-fn";
151+
try {
152+
lambda.createFunction(CreateFunctionRequest.builder()
153+
.functionName(providedFn)
154+
.runtime(Runtime.PROVIDED_AL2023)
155+
.role(role)
156+
.handler("bootstrap")
157+
.timeout(30)
158+
.memorySize(256)
159+
.code(FunctionCode.builder()
160+
.zipFile(SdkBytes.fromByteArray(LambdaUtils.providedRuntimeZip()))
161+
.build())
162+
.build());
163+
ctx.check("Lambda provided.al2023 Invoke: CreateFunction", true);
164+
} catch (Exception e) {
165+
ctx.check("Lambda provided.al2023 Invoke: CreateFunction", false, e);
166+
return;
167+
}
168+
169+
try {
170+
System.out.println(" (provided.al2023 cold start — waiting for container...)");
171+
InvokeResponse resp = lambda.invoke(InvokeRequest.builder()
172+
.functionName(providedFn)
173+
.invocationType(InvocationType.REQUEST_RESPONSE)
174+
.payload(SdkBytes.fromUtf8String("{}"))
175+
.build());
176+
177+
String payload = resp.payload().asUtf8String();
178+
System.out.println(" provided.al2023 response payload: " + payload);
179+
180+
boolean ok = resp.statusCode() == 200
181+
&& resp.functionError() == null
182+
&& payload.contains("hello from provided runtime");
183+
ctx.check("Lambda provided.al2023 Invoke: RequestResponse", ok);
184+
} catch (Exception e) {
185+
ctx.check("Lambda provided.al2023 Invoke: RequestResponse", false, e);
186+
}
187+
188+
try {
189+
lambda.deleteFunction(DeleteFunctionRequest.builder()
190+
.functionName(providedFn).build());
191+
} catch (Exception ignored) {}
148192
}
149193
}
150194
}

sdk-test-java/src/main/java/com/floci/test/tests/LambdaUtils.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,39 @@ def lambda_handler(event:, context:)
5858
}
5959
}
6060

61+
/**
62+
* ZIP containing a {@code bootstrap} shell script that implements the Lambda Runtime API.
63+
* Used to test {@code provided.al2023} / {@code provided.al2} custom runtimes.
64+
* The script calls {@code /invocation/next}, then posts {@code "hello from provided runtime"}
65+
* as the response.
66+
*/
67+
public static byte[] providedRuntimeZip() {
68+
String bootstrap = """
69+
#!/bin/sh
70+
ENDPOINT="http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime"
71+
while true; do
72+
HEADERS=$(mktemp)
73+
curl -sS -D "$HEADERS" -o /tmp/event.json "${ENDPOINT}/invocation/next"
74+
REQUEST_ID=$(grep -i 'lambda-runtime-aws-request-id' "$HEADERS" | tr -d '\\r' | awk '{print $2}')
75+
curl -sS -X POST "${ENDPOINT}/invocation/${REQUEST_ID}/response" \\
76+
-H 'Content-Type: application/json' \\
77+
-d '"hello from provided runtime"'
78+
rm -f "$HEADERS"
79+
done
80+
""";
81+
try {
82+
var baos = new java.io.ByteArrayOutputStream();
83+
try (var zos = new java.util.zip.ZipOutputStream(baos)) {
84+
zos.putNextEntry(new java.util.zip.ZipEntry("bootstrap"));
85+
zos.write(bootstrap.getBytes(StandardCharsets.UTF_8));
86+
zos.closeEntry();
87+
}
88+
return baos.toByteArray();
89+
} catch (Exception e) {
90+
throw new RuntimeException("Failed to build provided-runtime bootstrap ZIP", e);
91+
}
92+
}
93+
6194
/**
6295
* Minimal valid ZIP containing a stub {@code index.js} — accepted by the emulator
6396
* without needing a real runtime.

0 commit comments

Comments
 (0)