Localstack中API Gateway与Lambda集成的选择模式匹配问题
问题:Localstack中API Gateway集成Lambda的集成响应选择模式不生效
背景
我正在用Localstack搭配API Gateway和Lambda做API集成测试,构建模拟AWS环境的脚本位于项目的src/test/resources/localstack/scripts目录下。
我需要为GET /users/{userId}接口配置两个集成响应:
- 默认场景返回200
- 当Lambda抛出带有
No value present消息的NoSuchElementException异常时,返回404
目前Lambda已与API Gateway完成集成,集成类型为AWS,但无论请求是否存在的用户,接口始终返回默认的200响应,404的规则未生效。
配置的集成响应命令
默认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 ""
我尝试过移除--selection-pattern参数,结果仍只会触发该200响应。
用户不存在场景的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.*"
我了解选择模式需要匹配Lambda响应中的errorMessage字段,但实际配置后并未生效。
捕获的HTTP响应
当请求不存在的用户时,API Gateway返回200状态码,响应体为Lambda的错误输出:
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)"]}
对应的测试用例因此失败,Lambda日志可正常显示错误信息。
可能的问题原因
- Localstack对
--selection-pattern选项的支持存在部分问题:但当将404响应的选择模式设为.*时,网关会始终返回404,说明该功能至少有部分支持; - 我对选择模式的匹配逻辑理解存在偏差。
内容的提问来源于stack exchange,提问作者Marco Luzzara
相关产品推荐
相关产品推荐

