I have asked the same question on SO, but got no answer, sorry for copying it here.
I am using Localstack with API Gateway and Lambda Integration to test my APIs. You can find the repository here. Setup scripts are in the folder src/test/resources/localstack/scripts
I am trying to create multiple integration responses for a single API, which is GET /users/{userId}
. I have integrated the Lambda function with the API Gateway, the integration type is AWS
. The issue is that the default response is always called (200
), whereas I would like to return 404
when the user does not exist. It should return 404 when the lambda throws an exception with the message No value present
(which is the message of a NoSuchElementException
). Basically, I need two integration responses:
- The default one (200)
awslocal apigateway put-integration-response \
--rest-api-id "$_REST_API_ID" \
--resource-id "$_RESOURCE_ID" \
--http-method "$_HTTP_METHOD" \
--status-code 200 \
--selection-pattern ""
I have also tried to remove --selection-pattern
but it is the only one called anyway.
- The one for the “no user with that id” case (404):
awslocal apigateway put-integration-response \
--rest-api-id "$_REST_API_ID" \
--resource-id "$_RESOURCE_ID" \
--http-method "$_HTTP_METHOD" \
--status-code "404" \
--selection-pattern ".*No value present.*"
I have read that the selection pattern tries to match the errorMessage
of the lambda response, but it does not seem the case.
This is the HTTP response I have intercepted with Wireshark:
GET /restapis/s3zoijp35e/test/_user_request_/users/1 HTTP/1.1
Connection: Upgrade, HTTP2-Settings
Content-Length: 0
Host: 127.0.0.1:49161
HTTP2-Settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
Upgrade: h2c
User-Agent: Java-http-client/17.0.7
Content-Type: application/json
HTTP/1.1 200
Content-Type: text/plain; charset=utf-8
Content-Length: 952
Connection: close
date: Sat, 19 Aug 2023 08:40:32 GMT
server: hypercorn-h11
{"errorMessage":"No value present","errorType":"java.util.NoSuchElementException","stackTrace":["java.base/java.util.Optional.orElseThrow(Unknown Source)","it.unimi.cloudproject.ui.lambda.UserLambda.lambda$getUser$2(UserLambda.java:37)","org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.invokeFunctionAndEnrichResultIfNecessary(SimpleFunctionRegistry.java:943)","org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.invokeFunction(SimpleFunctionRegistry.java:889)","org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.doApply(SimpleFunctionRegistry.java:734)","org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry$FunctionInvocationWrapper.apply(SimpleFunctionRegistry.java:577)","org.springframework.cloud.function.adapter.aws.FunctionInvoker.handleRequest(FunctionInvoker.java:91)"]}
This test breaks for that reason, showing also the lambda logs.
Does Localstack correctly support the --selection-pattern
option? I am pretty sure that it is at least partially supported because if I use the pattern .*
with the 404 response, the gateway always chooses this one.
Thanks