12个版本
0.2.1 | 2023年1月8日 |
---|---|
0.2.0 | 2022年7月9日 |
0.1.9 | 2022年2月28日 |
0.1.8 | 2021年11月13日 |
0.1.5 | 2021年6月21日 |
#167 in HTTP服务器
1,457 每月下载次数
在 6 个crate(5直接) 中使用
105KB
2K SLoC
lambda-web
在AWS Lambda上运行Rust Web服务器框架。目前,它支持Actix web、axum、Rocket、warp。
特性
支持的Web框架
支持的AWS基础设施
不支持
- API Gateway HTTP API with payload format version 1.0
- 应用负载均衡器(ALB)
示例
Actix Web
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(())
}
axum
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(())
}
Rocket
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(())
}
warp
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(())
}
创建部署ZIP文件
截至写作时间(2021年11月),我们有两种在AWS Lambda上运行Rust的方法:Amazon Linux 2自定义运行时或Docker容器镜像。
我建议使用ZIP部署到Amazon Linux 2自定义运行时(provided.al2
),因为它比容器镜像具有更快的冷启动时间。
有关构建Amazon Linux 2兼容的二进制文件的详细信息,请参阅Deploy.md。
设置AWS Lambda和函数URL
- 使用
provided.al2
自定义运行时创建lambda函数。选择“在Amazon Linux 2上提供自己的引导程序”。 - 上传上述ZIP文件。
- IAM角色、内存设置等按您的需求设置。
如上示例代码仅消耗30MB内存,许多简单的Rust应用程序都可以适应128MB的设置。 - 创建函数URL,然后您可以使用
https://<url-id>.lambda-url.<region>.on.aws
调用您的Lambda函数。 - 您可以使用CloudFront进行自定义域名。
设置AWS Lambda和API网关
Lambda
- 使用
provided.al2
自定义运行时创建lambda函数。选择“在Amazon Linux 2上提供自己的引导程序”。 - 上传上述ZIP文件。
- IAM角色、内存设置等按您的需求设置。
如上示例代码仅消耗30MB内存,许多简单的Rust应用程序都可以适应128MB的设置。
API网关(HTTP)
- 创建HTTP API
- 创建单个路由 "$default" 并附加 Lambda 集成。确保,有效载荷格式版本为 "2.0"
API 网关 (REST)
- 创建 REST API
- 创建两个资源
- 路由
/
上的任何方法并附加 Lambda 代理集成。 - 路由
/{proxy+}
上的任何方法并附加 Lambda 代理集成。
- 路由
- 在设置选项卡中,添加
*/*
二进制媒体类型。 - 然后,将 API 部署到阶段。
依赖关系
~6–43MB
~688K SLoC