From 0e2d0d2122ec890760877498b65464c3952210cb Mon Sep 17 00:00:00 2001 From: Harold Sun Date: Fri, 10 Mar 2023 21:38:44 +0800 Subject: [PATCH] Document Lambda Function URL support --- README.md | 13 +++++++++++-- docs/images/lambda-adapter-overview.png | Bin 366500 -> 235494 bytes 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 626af244..15379ec4 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,19 @@ A tool to run web applications on AWS Lambda AWS Lambda Web Adapter allows developers to build web apps (http api) with familiar frameworks (e.g. Express.js, Next.js, Flask, SpringBoot, and Laravel, anything speaks HTTP 1.1/1.0) and run it on AWS Lambda. The same docker image can run on AWS Lambda, Amazon EC2, AWS Fargate, and local computers. -AWS Lambda Web Adapter is developed as a Lambda extension (since v0.2.0). For details, checkout its [design](docs/design.md) and [development](docs/development.md) documents. - ![Lambda Web Adapter](docs/images/lambda-adapter-overview.png) +## Features + +- Run web applications on AWS Lambda +- Supports Amazon API Gateway Rest API and Http API endpoints, Lambda Function URLs, and Application Load Balancer +- Supports Lambda managed runtimes, custom runtimes and docker OCI images +- Supports any web frameworks and languages, no new code dependency to include +- Automatic encode binary response +- Enables graceful shutdown +- Supports response payload compression +- Supports web applications running over both HTTP and HTTPS + ## Usage AWS Lambda Web Adapter work with Lambda functions packaged as both docker images and Zip packages. diff --git a/docs/images/lambda-adapter-overview.png b/docs/images/lambda-adapter-overview.png index 6f0d6d34b74568cb54a2987505cabfaf2cbee779..a3420a0b736010cb6aa45eaf0b3a86a19bf1afd3 100644 GIT binary patch literal 235494 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