aws / aws/aws-lambda-rust-runtime
`AWS_LAMBDA_HTTP_IGNORE_STAGE_IN_PATH` does not ignore stage in API Gateway V2 (HTTP)
- Langage dominant
- Rust
- Étoiles
- 3.6k
- Forks
- 396
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
The `AWS_LAMBDA_HTTP_IGNORE_STAGE_IN_PATH` env variable doesn't seem to work on API Gateway V2 (HTTP).
Example:
```rust
use axum::{response::Json, routing::get, Router};
use lambda_http::request::RequestContext::ApiGatewayV2;
use lambda_http::{run, tracing, Error};
use serde_json::{json, Value};
// Sample middleware that logs the request id
async fn mw_sample(
req: axum::extract::Request,
next: axum::middleware::Next,
) -> impl axum::response::IntoResponse {
let context = req
.extensions()
.get::();
if let Some(ApiGatewayV2(ctx)) = context {
tracing::info!("RequestId = {:?}", ctx);
}
next.run(req).await
}
async fn handler_sample() -> Json {
Json(json!({ "echo": "hello" }))
}
#[tokio::main]
async fn main() -> Result<(), Error> {
std::env::set_var("AWS_LAMBDA_HTTP_IGNORE_STAGE_IN_PATH", "true"); // ignore stages in routing
tracing::init_default_subscriber();
let app = Router::new()
.route("/not-staged", get(handler_sample)) // stage not specified, not working
.route("/v1/staged", get(handler_sample)) // stage specified, working
.layer(axum::middleware::from_fn(mw_sample));
run(app).await
}
```
Cargo.toml:
```toml
[package]
name = "test"
version = "0.1.0"
edition = "2021"
[dependencies]
axum = "0.7.5"
lambda_http = "0.13.0"
serde = "1.0.209"
serde_json = "1.0.127"
tokio = { version = "1", features = ["macros"] }
```
I will attach my Terraform code as well:
```hcl
module "api_lambda_function" {
source = "terraform-aws-modules/lambda/aws"
function_name = "some-api"
runtime = "provided.al2023"
architectures = ["arm64"]
timeout = 15
create_package = false
// Change path to your bin
local_existing_package = "../../../target/lambda/simple2/bootstrap.zip"
handler = "bootstrap"
create_current_version_allowed_triggers = false
allowed_triggers = {
AllowExecutionFromAPIGateway = {
service = "apigateway"
source_arn = "${aws_apigatewayv2_api.main.execution_arn}/*"
}
}
}
resource "aws_apigatewayv2_api" "main" {
name = "${local.name_prefix}-api"
protocol_type = "HTTP"
}
resource "aws_apigatewayv2_stage" "v1" {
api_id = aws_apigatewayv2_api.main.id
name = "v1"
auto_deploy = true
}
resource "aws_apigatewayv2_integration" "api_lambda" {
api_id = aws_apigatewayv2_api.main.id
integration_type = "AWS_PROXY"
integration_method = "POST"
integration_uri = module.api_lambda_function.lambda_function_arn
payload_format_version = "2.0"
depends_on = [module.api_lambda_function.lambda_function_arn]
}
resource "aws_apigatewayv2_route" "get_1" {
api_id = aws_apigatewayv2_api.main.id
route_key = "GET /not-staged"
target = "integrations/${aws_apigatewayv2_integration.api_lambda.id}"
}
resource "aws_apigatewayv2_route" "get_2" {
api_id = aws_apigatewayv2_api.main.id
route_key = "GET /staged"
target = "integrations/${aws_apigatewayv2_integration.api_lambda.id}"
}
```
Build with:
```
cargo lambda build --release --arm64 --output-format zip
```
And then apply Terraform.
When calling a `/v1/staged` route, response is returned:

But not for `/v1/not-staged` - response is 404:

Am I doing something wrong?
Can someone please suggest how to debug this issue?
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Commencez par exécuter la reproduction fournie d’Axum et d’API Gateway V2 avec AWS_LAMBDA_HTTP_IGNORE_STAGE_IN_PATH activée, puis retracez le traitement de RequestContext::ApiGatewayV2 et de la variable d’environnement. Le travail est terminé lorsque la requête /v1/not-staged atteint la route /not-staged, tandis que la route avec stage continue de fonctionner.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- aws, rust
- Domaine
- api, backend
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 48/100