aws / aws/aws-lambda-rust-runtime
`AWS_LAMBDA_HTTP_IGNORE_STAGE_IN_PATH` does not ignore stage in API Gateway V2 (HTTP)
- Ngôn ngữ chính
- Rust
- Star
- 3.6k
- Fork
- 396
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
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?
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu bằng cách chạy bản tái hiện Axum và API Gateway V2 được cung cấp với AWS_LAMBDA_HTTP_IGNORE_STAGE_IN_PATH được bật, sau đó lần theo cách xử lý RequestContext::ApiGatewayV2 và biến môi trường. Hoàn thành khi yêu cầu /v1/not-staged đến được route /not-staged, trong khi route có stage vẫn tiếp tục hoạt động.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- aws, rust
- Lĩnh vực
- api, backend
- Loại issue
- Lỗi
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 48/100