Crates.io | lambda-web |
lib.rs | lambda-web |
version | 0.2.1 |
source | src |
created_at | 2021-06-13 15:37:49.68574 |
updated_at | 2023-01-08 14:40:36.729312 |
description | Run Rust web frameworks on AWS Lambda |
homepage | |
repository | https://github.com/hanabu/lambda-web |
max_upload_size | |
id | 409614 |
size | 169,126 |
Run Rust web server frameworks on AWS Lambda. Currently, it supports Actix web, axum, Rocket, warp.
Cargo.toml
[[bin]]
name = "bootstrap"
path = "src/main.rs"
[dependencies]
lambda-web = { version = "0.2.0", features=["actix4"] }
main.rs
use lambda_web::actix_web::{self, get, App, HttpServer, Responder};
use lambda_web::{is_running_on_lambda, run_actix_on_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(())
}
Cargo.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
use axum::{routing::get, Router};
use lambda_web::{is_running_on_lambda, run_hyper_on_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(())
}
Cargo.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
use rocket::{self, get, routes};
use lambda_web::{is_running_on_lambda, launch_rocket_on_lambda, LambdaError};
#[get("/hello/<name>/<age>")]
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 is_running_on_lambda() {
// Launch on AWS Lambda
launch_rocket_on_lambda(rocket).await?;
} else {
// Launch local server
let _ = rocket.launch().await?;
}
Ok(())
}
Cargo.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
use lambda_web::{is_running_on_lambda, run_hyper_on_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(())
}
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.
provided.al2
custom runtime. Choose "Provide your own bootstrap on Amazon Linux 2" .https://<url-id>.lambda-url.<region>.on.aws
provided.al2
custom runtime. Choose "Provide your own bootstrap on Amazon Linux 2" ./
and attach Lambda proxy integration./{proxy+}
and attach Lambda proxy integration.*/*
binary media type.