Skip to content

Commit fb9e768

Browse files
authored
feat!: GA readiness improvements (#667)
BREAKING CHANGE: Remove readiness_check_min_unhealthy_status field and AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS env var. Use readiness_check_healthy_status / AWS_LWA_READINESS_CHECK_HEALTHY_STATUS instead. - Remove deprecated readiness_check_min_unhealthy_status from AdapterOptions - Remove ENV_READINESS_CHECK_MIN_UNHEALTHY_STATUS constant and fallback logic - Remove #[allow(deprecated)] annotations no longer needed - Add migration guide section to README (0.x to 1.0) - Add SECURITY.md with vulnerability reporting policy - Update README security section to reference SECURITY.md - Add CHANGELOG entries for v0.8.0 through v1.0.0 - Fix outdated repo URL in docs/development.md
1 parent b6f0fc9 commit fb9e768

6 files changed

Lines changed: 190 additions & 40 deletions

File tree

CHANGELOG.md

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,143 @@
1+
## v1.0.0 - 2026-03-20
2+
3+
### Major Updates
4+
5+
This is the first GA release of AWS Lambda Web Adapter. It includes multi-tenancy support, Lambda Managed Instances, improved error handling, zero-copy body conversion, comprehensive documentation, and a migration path from 0.x.
6+
7+
### Breaking Changes
8+
9+
- Removed `AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS` and the `readiness_check_min_unhealthy_status` field. Use `AWS_LWA_READINESS_CHECK_HEALTHY_STATUS` / `readiness_check_healthy_status` instead.
10+
- Non-prefixed environment variables (`HOST`, `READINESS_CHECK_PORT`, etc.) are deprecated and will be removed in 2.0. Use `AWS_LWA_` prefixed versions.
11+
12+
### Features
13+
14+
- **Multi-tenancy support**: Propagate `tenant_id` from Lambda context as `x-amz-tenant-id` header (#631)
15+
- **Lambda Managed Instances**: Support concurrent request handling in a single execution environment (#625)
16+
- **Error status codes**: New `AWS_LWA_ERROR_STATUS_CODES` env var to treat specific HTTP status codes as Lambda failures (#558)
17+
- **Runtime API proxy**: New `AWS_LWA_LAMBDA_RUNTIME_API_PROXY` env var to proxy Lambda runtime API calls (#588)
18+
- **Healthy status ranges**: New `AWS_LWA_READINESS_CHECK_HEALTHY_STATUS` supporting comma-separated codes and ranges (e.g., `200-399,404`) (#638)
19+
20+
### Performance
21+
22+
- Zero-copy body conversion — avoid unnecessary allocations when forwarding request bodies (#627)
23+
- Add `panic=abort` and `opt-level=s` to release profile for smaller binary size (#646)
24+
25+
### Bug Fixes
26+
27+
- Don't append trailing `?` when query string is empty (#657)
28+
- Fix `path_through_path` renamed to `pass_through_path` (#619)
29+
- Override user-set `x-amzn-{lambda,request}-context` headers to prevent spoofing (#286)
30+
- Remove `transfer-encoding` header from responses for SAM local compatibility (#442)
31+
- Warn when configured `authorization_source` header is not found in request (#479)
32+
33+
### Documentation
34+
35+
- Comprehensive rustdoc documentation for all public types and methods
36+
- Added migration guide for 0.x to 1.0 upgrade
37+
- Added SECURITY.md
38+
- Added user guide with GitHub Pages deployment (#639)
39+
40+
### CI/CD
41+
42+
- Split pipeline into separate PR, Merge, and Release workflows (#642)
43+
- Add conventional commits changelog generation and commit linting (#641)
44+
- Add workflow to verify examples without deployment (#643)
45+
- Daily security audit via `rustsec/audit-check` (#391)
46+
- Benchmark tracking with PR comments
47+
48+
---
49+
50+
## v0.9.1 - 2025-04-23
51+
52+
### Features
53+
54+
- Add `AWS_LWA_LAMBDA_RUNTIME_API_PROXY` to overwrite Lambda Runtime API endpoint (#588)
55+
56+
### Examples
57+
58+
- Bun server with GraphQL examples (#584)
59+
60+
---
61+
62+
## v0.9.0 - 2025-01-10
63+
64+
### Features
65+
66+
- Force Lambda failure on configurable HTTP error status codes (#558)
67+
- Streaming API backend-only example (#543)
68+
69+
### Examples
70+
71+
- SvelteKit SSR zip example (#561)
72+
- Remix examples (#524)
73+
- FastHTML examples (#496)
74+
75+
### Improvements
76+
77+
- Simplify debug logging for app readiness checks (#520)
78+
- Read AWS region from env var (#518)
79+
80+
---
81+
82+
## v0.8.4 - 2024-07-27
83+
84+
### Features
85+
86+
- Add `authorization_source` feature to copy custom header to `Authorization` (#478)
87+
- Warn when configured authorization source header not found (#479)
88+
89+
---
90+
91+
## v0.8.3 - 2024-04-21
92+
93+
### Bug Fixes
94+
95+
- Remove `transfer-encoding` header from responses (#442)
96+
97+
### Examples
98+
99+
- Javalin 6 example using Arm64 image (#425)
100+
- NestJS example (#394)
101+
- FastAPI Background Tasks example (#408)
102+
- FastAPI response streaming with Claude3 refactor (#416)
103+
104+
---
105+
106+
## v0.8.2 - 2024-04-10
107+
108+
### Improvements
109+
110+
- Add daily security audit (#391)
111+
- Upgrade lambda-http crate to 0.9.3 (#390)
112+
113+
### Examples
114+
115+
- Go HTTP example (#383)
116+
- Sinatra example (#365)
117+
118+
---
119+
120+
## v0.8.1 - 2024-01-24
121+
122+
### Bug Fixes
123+
124+
- Minor fixes and dependency updates
125+
126+
---
127+
128+
## v0.8.0 - 2024-01-22
129+
130+
### Features
131+
132+
- Pass-through events support for non-HTTP triggers (#342)
133+
- Adopt `cargo-lambda` for builds (#337)
134+
135+
### Examples
136+
137+
- SQS + Express.js example (#347, #348)
138+
139+
---
140+
1141
## v0.7.1 - 2023-08-18
2142
# Major Updates
3143

README.md

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ The readiness check port/path and traffic port can be configured using environme
7171
> `HOST`, `READINESS_CHECK_PORT`, `READINESS_CHECK_PATH`, `READINESS_CHECK_PROTOCOL`, `REMOVE_BASE_PATH`, `ASYNC_INIT`.
7272
> Please migrate to the `AWS_LWA_` prefixed versions. Note: `PORT` is not deprecated and remains a supported fallback for `AWS_LWA_PORT`.
7373
>
74-
> Additionally, `AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS` is deprecated. Use `AWS_LWA_READINESS_CHECK_HEALTHY_STATUS` instead.
74+
> Additionally, `AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS` has been removed in 1.0. Use `AWS_LWA_READINESS_CHECK_HEALTHY_STATUS` instead.
7575
7676
👉 [Detailed configuration docs](https://awslabs.github.io/aws-lambda-web-adapter/configuration/environment-variables.html)
7777

@@ -128,6 +128,34 @@ This project was inspired by several community projects.
128128
- [re:Web](https://github.com/apparentorder/reweb)
129129
- [Serverlessish](https://github.com/glassechidna/serverlessish)
130130

131+
## Migrating from 0.x to 1.0
132+
133+
### Environment Variables
134+
135+
All environment variables now use the `AWS_LWA_` prefix. The old non-prefixed names still work but are deprecated and will be removed in version 2.0.
136+
137+
| Old (Deprecated) | New |
138+
|------------------------------|--------------------------------------------|
139+
| `READINESS_CHECK_PORT` | `AWS_LWA_READINESS_CHECK_PORT` |
140+
| `READINESS_CHECK_PATH` | `AWS_LWA_READINESS_CHECK_PATH` |
141+
| `READINESS_CHECK_PROTOCOL` | `AWS_LWA_READINESS_CHECK_PROTOCOL` |
142+
| `REMOVE_BASE_PATH` | `AWS_LWA_REMOVE_BASE_PATH` |
143+
| `ASYNC_INIT` | `AWS_LWA_ASYNC_INIT` |
144+
145+
> **Note:** `PORT` is **not** deprecated and remains a supported fallback for `AWS_LWA_PORT`.
146+
147+
### Readiness Check Health Status
148+
149+
`AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS` has been removed. Use `AWS_LWA_READINESS_CHECK_HEALTHY_STATUS` instead, which accepts comma-separated codes and ranges:
150+
151+
```bash
152+
# Old
153+
AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS=400
154+
155+
# New (equivalent)
156+
AWS_LWA_READINESS_CHECK_HEALTHY_STATUS=100-399
157+
```
158+
131159
## Similar Projects
132160

133161
Several projects also provide similar capabilities as language specific packages/frameworks.
@@ -140,7 +168,7 @@ Several projects also provide similar capabilities as language specific packages
140168

141169
## Security
142170

143-
See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.
171+
See [SECURITY](SECURITY.md) for vulnerability reporting and [CONTRIBUTING](CONTRIBUTING.md) for more information.
144172

145173
## License
146174

SECURITY.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Security Policy
2+
3+
## Reporting a Vulnerability
4+
5+
If you discover a potential security issue in this project, we ask that you notify AWS/Amazon Security via our
6+
[vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/).
7+
8+
Please do **not** create a public GitHub issue for security vulnerabilities.
9+
10+
## Supported Versions
11+
12+
We recommend always using the latest version of AWS Lambda Web Adapter to ensure you have the most recent security patches.
13+
14+
| Version | Supported |
15+
|---------|--------------------|
16+
| 1.x | :white_check_mark: |
17+
| < 1.0 | :x: |

docs/development.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ AWS Lambda executes functions in x86_64 Amazon Linux Environment. We need to com
88
First, clone this repo to your local computer.
99

1010
```shell
11-
$ git clone https://github.com/aws-samples/aws-lambda-adapter.git
12-
$ cd aws-lambda-adapter
11+
$ git clone https://github.com/awslabs/aws-lambda-web-adapter.git
12+
$ cd aws-lambda-web-adapter
1313
```
1414

1515
### Compiling with Docker

src/lib.rs

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ const ENV_READINESS_CHECK_PORT: &str = "AWS_LWA_READINESS_CHECK_PORT";
7171
const ENV_READINESS_CHECK_PATH: &str = "AWS_LWA_READINESS_CHECK_PATH";
7272
const ENV_READINESS_CHECK_PROTOCOL: &str = "AWS_LWA_READINESS_CHECK_PROTOCOL";
7373
const ENV_READINESS_CHECK_HEALTHY_STATUS: &str = "AWS_LWA_READINESS_CHECK_HEALTHY_STATUS";
74-
const ENV_READINESS_CHECK_MIN_UNHEALTHY_STATUS: &str = "AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS";
7574
const ENV_REMOVE_BASE_PATH: &str = "AWS_LWA_REMOVE_BASE_PATH";
7675
const ENV_PASS_THROUGH_PATH: &str = "AWS_LWA_PASS_THROUGH_PATH";
7776
const ENV_ASYNC_INIT: &str = "AWS_LWA_ASYNC_INIT";
@@ -281,12 +280,6 @@ pub struct AdapterOptions {
281280
/// Default: [`Protocol::Http`]
282281
pub readiness_check_protocol: Protocol,
283282

284-
/// Deprecated: Use `readiness_check_healthy_status` instead.
285-
///
286-
/// Minimum HTTP status code considered unhealthy.
287-
#[deprecated(since = "1.0.0", note = "Use readiness_check_healthy_status instead")]
288-
pub readiness_check_min_unhealthy_status: u16,
289-
290283
/// List of HTTP status codes considered healthy for readiness checks.
291284
///
292285
/// Can be configured via `AWS_LWA_READINESS_CHECK_HEALTHY_STATUS` using:
@@ -382,36 +375,19 @@ fn get_optional_env_with_deprecation(new_name: &str, old_name: &str) -> Option<S
382375
}
383376

384377
impl Default for AdapterOptions {
385-
#[allow(deprecated)]
386378
fn default() -> Self {
387379
let port = env::var(ENV_PORT)
388380
.or_else(|_| env::var(ENV_PORT_DEPRECATED))
389381
.unwrap_or_else(|_| "8080".to_string());
390382

391383
// Handle readiness check healthy status codes
392-
// New env var takes precedence, then fall back to deprecated min_unhealthy_status
393384
let readiness_check_healthy_status = if let Ok(val) = env::var(ENV_READINESS_CHECK_HEALTHY_STATUS) {
394385
parse_status_codes(&val)
395-
} else if let Ok(val) = env::var(ENV_READINESS_CHECK_MIN_UNHEALTHY_STATUS) {
396-
tracing::warn!(
397-
"Environment variable '{}' is deprecated. \
398-
Please use '{}' instead (e.g., '100-499').",
399-
ENV_READINESS_CHECK_MIN_UNHEALTHY_STATUS,
400-
ENV_READINESS_CHECK_HEALTHY_STATUS
401-
);
402-
let min_unhealthy: u16 = val.parse().unwrap_or(500);
403-
(100..min_unhealthy).collect()
404386
} else {
405-
// Default: 100-499 (same as previous default of min_unhealthy=500)
387+
// Default: 100-499
406388
(100..500).collect()
407389
};
408390

409-
// For backward compatibility, also set the deprecated field
410-
let readiness_check_min_unhealthy_status = env::var(ENV_READINESS_CHECK_MIN_UNHEALTHY_STATUS)
411-
.unwrap_or_else(|_| "500".to_string())
412-
.parse()
413-
.unwrap_or(500);
414-
415391
AdapterOptions {
416392
host: get_env_with_deprecation(ENV_HOST, ENV_HOST_DEPRECATED, "127.0.0.1"),
417393
port: port.clone(),
@@ -420,7 +396,6 @@ impl Default for AdapterOptions {
420396
ENV_READINESS_CHECK_PORT_DEPRECATED,
421397
&port,
422398
),
423-
readiness_check_min_unhealthy_status,
424399
readiness_check_healthy_status,
425400
readiness_check_path: get_env_with_deprecation(
426401
ENV_READINESS_CHECK_PATH,
@@ -1106,13 +1081,11 @@ mod tests {
11061081
});
11071082

11081083
// Prepare adapter configuration - only 200-399 are healthy
1109-
#[allow(deprecated)]
11101084
let options = AdapterOptions {
11111085
host: app_server.host(),
11121086
port: app_server.port().to_string(),
11131087
readiness_check_port: app_server.port().to_string(),
11141088
readiness_check_path: "/healthcheck".to_string(),
1115-
readiness_check_min_unhealthy_status: 400,
11161089
readiness_check_healthy_status: (200..400).collect(),
11171090
..Default::default()
11181091
};
@@ -1137,7 +1110,6 @@ mod tests {
11371110
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
11381111
let port = listener.local_addr().unwrap().port();
11391112

1140-
#[allow(deprecated)]
11411113
let options = AdapterOptions {
11421114
host: "127.0.0.1".to_string(),
11431115
port: port.to_string(),
@@ -1158,7 +1130,6 @@ mod tests {
11581130
#[tokio::test]
11591131
async fn test_tcp_readiness_check_failure() {
11601132
// Use a port that nothing is listening on
1161-
#[allow(deprecated)]
11621133
let options = AdapterOptions {
11631134
host: "127.0.0.1".to_string(),
11641135
port: "19999".to_string(),
@@ -1203,7 +1174,6 @@ mod tests {
12031174

12041175
#[test]
12051176
fn test_adapter_new_invalid_host() {
1206-
#[allow(deprecated)]
12071177
let options = AdapterOptions {
12081178
host: "invalid host with spaces".to_string(),
12091179
port: "8080".to_string(),
@@ -1218,7 +1188,6 @@ mod tests {
12181188

12191189
#[test]
12201190
fn test_adapter_new_valid_config() {
1221-
#[allow(deprecated)]
12221191
let options = AdapterOptions {
12231192
host: "127.0.0.1".to_string(),
12241193
port: "3000".to_string(),
@@ -1273,7 +1242,6 @@ mod tests {
12731242

12741243
#[test]
12751244
fn test_compression_disabled_with_response_stream() {
1276-
#[allow(deprecated)]
12771245
let options = AdapterOptions {
12781246
compression: true,
12791247
invoke_mode: LambdaInvokeMode::ResponseStream,
@@ -1289,7 +1257,6 @@ mod tests {
12891257

12901258
#[test]
12911259
fn test_compression_enabled_with_buffered() {
1292-
#[allow(deprecated)]
12931260
let options = AdapterOptions {
12941261
compression: true,
12951262
invoke_mode: LambdaInvokeMode::Buffered,

tests/integ_tests/main.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ fn test_adapter_options_from_namespaced_env() {
6969
env::set_var("AWS_LWA_ENABLE_COMPRESSION", "true");
7070
env::set_var("AWS_LWA_INVOKE_MODE", "response_stream");
7171
env::set_var("AWS_LWA_AUTHORIZATION_SOURCE", "auth-token");
72-
env::remove_var("AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS");
7372

7473
// Initialize adapter with env options
7574
let options = AdapterOptions::default();
@@ -964,7 +963,6 @@ fn test_deprecated_env_var_fallback() {
964963
env::remove_var("AWS_LWA_INVOKE_MODE");
965964
env::remove_var("AWS_LWA_AUTHORIZATION_SOURCE");
966965
env::remove_var("AWS_LWA_READINESS_CHECK_HEALTHY_STATUS");
967-
env::remove_var("AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS");
968966

969967
// Set only deprecated (non-prefixed) env vars
970968
env::set_var("PORT", "4000");

0 commit comments

Comments
 (0)