AWS HTTP API Gateway 如何拦截favicon请求避免触发Lambda?
实现网关层拦截favicon请求的方案
当前配置的问题根源
你目前使用的是HTTP API的快速集成模式,直接把整个API的全路径流量映射到目标Lambda,相当于匹配/*的所有请求全量转发,因此浏览器自动触发的/favicon.ico请求会毫无拦截地打到Lambda上,产生不必要的调用。
具体配置调整逻辑
完全可以在网关层完成拦截,不需要改动Lambda逻辑,只需要把原来的全量快速集成拆成分路由的自定义配置即可:
- 移除API资源中直接绑定Lambda的
target字段(该字段是快速集成的标记,会强制全量转发) - 分别配置两类路由对应的集成规则:
- 业务路由:匹配实际需要转发到Lambda的路径,保持原有的Lambda调用逻辑
- favicon专用路由:匹配
/favicon.ico路径,配置为MOCK静态响应,直接在网关层面返回空响应,不转发到Lambda
参考调整后的Terraform示例
# 移除原api资源的target字段,改为自定义路由集成 resource "aws_apigatewayv2_api" "retry_api" { name = "${var.environment}_${var.cdp_domain}_retry_api" protocol_type = "HTTP" description = "To pass commands into the retry lambda." } # 配置指向Lambda的业务集成 resource "aws_apigatewayv2_integration" "lambda_biz_integration" { api_id = aws_apigatewayv2_api.retry_api.id integration_type = "AWS_PROXY" integration_uri = module.retry-support.etl_lambda_arn payload_format_version = "2.0" } # 配置favicon路径的MOCK拦截集成,直接在网关返回空响应 resource "aws_apigatewayv2_integration" "favicon_block_integration" { api_id = aws_apigatewayv2_api.retry_api.id integration_type = "MOCK" } # 配置favicon路由,绑定拦截集成 resource "aws_apigatewayv2_route" "favicon_route" { api_id = aws_apigatewayv2_api.retry_api.id route_key = "GET /favicon.ico" target = "integrations/${aws_apigatewayv2_integration.favicon_block_integration.id}" } # 配置业务默认路由,绑定Lambda集成 resource "aws_apigatewayv2_route" "default_biz_route" { api_id = aws_apigatewayv2_api.retry_api.id route_key = "$default" # 匹配所有未被其他路由命中的请求,保持原业务逻辑 target = "integrations/${aws_apigatewayv2_integration.lambda_biz_integration.id}" } # 配置favicon路由的直接响应内容 resource "aws_apigatewayv2_route_response" "favicon_route_response" { api_id = aws_apigatewayv2_api.retry_api.id route_id = aws_apigatewayv2_route.favicon_route.id route_response_key = "$default" } resource "aws_apigatewayv2_integration_response" "favicon_integration_response" { api_id = aws_apigatewayv2_api.retry_api.id integration_id = aws_apigatewayv2_integration.favicon_block_integration.id route_response_key = "$default" response_templates = { "$default" = jsonencode({ statusCode = 204 headers = { "Content-Type" = "image/x-icon" } }) } } # 调整Lambda权限的source_arn,匹配业务路由的调用源 resource "aws_lambda_permission" "allow_retry_api" { statement_id = "AllowAPIgatewayInvokation" action = "lambda:InvokeFunction" function_name = module.retry-support.etl_lambda_arn principal = "apigateway.amazonaws.com" # 仅允许业务默认路由触发Lambda调用,favicon请求不会走到权限校验环节 source_arn = "${aws_apigatewayv2_api.retry_api.execution_arn}/*/*" }
配置生效后的效果
- 所有匹配
GET /favicon.ico的请求会被API Gateway直接拦截,返回204空响应,全程不会触发Lambda调用,也不会产生额外的Lambda计费 - 原有业务路径的请求逻辑完全不受影响,Postman测试的原有功能和结果保持一致
- 浏览器收到204响应后,会停止后续对favicon的重复请求
内容的提问来源于stack exchange,提问作者firestreak
相关产品推荐
相关产品推荐

