lambda-web

Run Rust web server frameworks on AWS Lambda. Currently, it supports Actix web, axum, Rocket, warp.

crates.io API docs

Features

Supported web frameworks

Supported AWS infrastructure

Not supported

Example

Actix Web

Cargo.toml

```toml [[bin]] name = "bootstrap" path = "src/main.rs"

[dependencies] lambda-web = { version = "0.2.0", features=["actix4"] } ```

main.rs

```rust use lambdaweb::actixweb::{self, get, App, HttpServer, Responder}; use lambdaweb::{isrunningonlambda, runactixon_lambda, LambdaError};

[get("/")]

async fn hello() -> impl Responder { format!("Hello") }

[actix_web::main]

async fn main() -> Result<(),LambdaError> { let factory = move || { App::new().service(hello) };

if is_running_on_lambda() {
    // Run on AWS Lambda
    run_actix_on_lambda(factory).await?;
} else {
    // Local server
    HttpServer::new(factory)
        .bind("127.0.0.2.0080")?
        .run()
        .await?;
}
Ok(())

} ```

axum

Cargo.toml

```toml [[bin]] name = "bootstrap" path = "src/main.rs"

[dependencies] lambda-web = { version = "0.2.0", features=["hyper"] } axum = "0.6" tokio = { version = "1" } ```

main.rs

```rust use axum::{routing::get, Router}; use lambdaweb::{isrunningonlambda, runhyperon_lambda, LambdaError}; use std::net::SocketAddr;

// basic handler that responds with a static string async fn root() -> &'static str { "Hello, World!" }

[tokio::main]

async fn main() -> Result<(), LambdaError> { // build our application with a route let app = Router::new().route("/", get(root));

if is_running_on_lambda() {
    // Run app on AWS Lambda
    run_hyper_on_lambda(app).await?;
} else {
    // Run app on local server
    let addr = SocketAddr::from(([127, 0, 0, 1], 8080));
    axum::Server::bind(&addr).serve(app.into_make_service()).await?;
}
Ok(())

} ```

Rocket

Cargo.toml

```toml [[bin]] name = "bootstrap" path = "src/main.rs"

[dependencies] lambda-web = { version = "0.2.0", features=["rocket05"] } rocket = "0.5.0-rc.2" ```

main.rs

```rust use rocket::{self, get, routes}; use lambdaweb::{isrunningonlambda, launchrocketon_lambda, LambdaError};

[get("/hello//")]

fn hello(name: &str, age: u8) -> String { format!("Hello, {} year old named {}!", age, name) }

[rocket::main]

async fn main() -> Result<(), LambdaError> { let rocket = rocket::build().mount("/", routes![hello]); if isrunningonlambda() { // Launch on AWS Lambda launchrocketonlambda(rocket).await?; } else { // Launch local server let _ = rocket.launch().await?; } Ok(()) } ```

warp

Cargo.toml

```toml [[bin]] name = "bootstrap" path = "src/main.rs"

[dependencies] lambda-web = { version = "0.2.0", features=["hyper"] } warp = "0.3" tokio = { version = "1" } ```

main.rs

```rust use lambdaweb::{isrunningonlambda, runhyperon_lambda, LambdaError}; use warp::Filter;

[tokio::main]

async fn main() -> Result<(), LambdaError> { // GET /hello/warp => 200 OK with body "Hello, warp!" let hello = warp::path!("hello" / String).map(|name| format!("Hello, {}", name));

if is_running_on_lambda() {
    // Run on AWS Lambda
    run_hyper_on_lambda(warp::service(hello)).await?;
} else {
    // Run local server
    warp::serve(hello).run(([127, 0, 0, 1], 8080)).await;
}
Ok(())

} ```

Create deploy ZIP file

As of writing (Nov, 2021), we have two options to run Rust on AWS Lambda: Amazon Linux 2 custom runtime or Docker container image.

I recommend ZIP deploy to Amazon Linux 2 custom runtime (provided.al2) because it's faster cold start time than container image.

To build Amazon Linux 2 compatible binary, see Deploy.md for more details.

Setup AWS Lambda & function URLs

Setup AWS Lambda & API gateway

Lambda

API Gateway (HTTP)

API Gateway (REST)