Lambda RIE as Standalone App/Container for Testing
driverpt opened this issue · 9 comments
Hello,
For Testing purposes, in this case Java, it would be great that AWS makes Lambda RIE available as Standalone App/Container so we can easily add this to JUnit 5 + Test Containers and be able to do Integration Tests (via Public ECR Gallery) on our Clients.
Thanks
Thank you for bring this to our attention.
Just to understand the problem better, why can https://gallery.ecr.aws/lambda/java not be used?
Ok, so what I'm trying to do is create automated tests using JUnit 5 + TestContainers + GraalVM for a custom Lambda Runtime Client and this could be achieved just by exposing a simple Dummy Lambda Emulator and overriding AWS_LAMBDA_RUNTIME_API Environment Variable/Property and use the proper Assertions.
Do you think this is possible to achieve?
So you are not able to use https://gallery.ecr.aws/lambda/java because you are not using the included Java Lambda Runtime Interface Client (RIC), but you are building your own RIC and want to test that?
Hello @bodelsc , no. I'm just looking for a Runtime API Emulator/Simulator that I can just Pub/Sub and assert responses to test a Custom HTTP Client
The AWS base images for Lambda include the AWS Lambda Runtime Interface Emulator(RIE). For your purpose can you not copy your function's code into the container, start it and then use HTTP to make requests?
See
Is it possible to Start the Container Standalone without Function Code inside?
I am unsure about starting, but you can create one, copy in code etc and then start it.
E.g.
docker_name=$(docker create --publish 9000:8080 "public.ecr.aws/lambda/nodejs:16" "app.handler")
echo -e 'exports.handler = async () => {\n\tconsole.log("Hello world!");\n};' > /tmp/app.js
docker cp "/tmp/app.js" "${docker_name}:/var/task/app.js"
docker start "${docker_name}"
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
docker logs "${docker_name}"
docker stop "${docker_name}"
docker rm "${docker_name}"
I want to do the same.
I took a stab at it like this:
FROM ubuntu
RUN apt-get update && \
apt-get install -y curl && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN mkdir -p ~/.aws-lambda-rie && \
curl -Lo ~/.aws-lambda-rie/aws-lambda-rie \
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64 && \
chmod +x ~/.aws-lambda-rie/aws-lambda-rie && \
mv ~/.aws-lambda-rie/aws-lambda-rie /usr/local/bin/aws-lambda-rie
ENTRYPOINT [ "aws-lambda-rie" ]Then a docker compose:
version: '3.9'
services:
lilfunc:
build: .
image: lilfunc:latest
container_name: lilfunc
environment:
AWS_LAMBDA_RUNTIME_API: rie:8080
depends_on:
- rie
rie:
build:
context: .
dockerfile: Dockerfile.rie
image: rie:latest
container_name: rie
ports:
- 9000:8080
But this happens in the function container:
Attaching to rie, lilfunc
Traceback (most recent call last):
File "/usr/lib/python3.9/runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.9/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/function/awslambdaric/main.py", line 25, in
main(sys.argv)
File "/function/awslambdaric/main.py", line 21, in main
bootstrap.run(app_root, handler, lambda_runtime_api_addr)
File "/function/awslambdaric/bootstrap.py", line 399, in run
event_request = lambda_runtime_client.wait_next_invocation()
File "/function/awslambdaric/lambda_runtime_client.py", line 68, in wait_next_invocation
response_body, headers = runtime_client.next()
AttributeError: 'NoneType' object has no attribute 'next'
lilfunc exited with code 1
I ended up creating a simple app that simulates lambda runtime api server.