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服务器

Download history 440/week @ 2024-03-14 480/week @ 2024-03-21 501/week @ 2024-03-28 413/week @ 2024-04-04 298/week @ 2024-04-11 305/week @ 2024-04-18 385/week @ 2024-04-25 464/week @ 2024-05-02 384/week @ 2024-05-09 507/week @ 2024-05-16 536/week @ 2024-05-23 363/week @ 2024-05-30 443/week @ 2024-06-06 334/week @ 2024-06-13 390/week @ 2024-06-20 221/week @ 2024-06-27

1,457 每月下载次数
6 个crate(5直接) 中使用

MIT 许可证

105KB
2K SLoC

lambda-web

在AWS Lambda上运行Rust Web服务器框架。目前,它支持Actix web、axum、Rocket、warp。

crates.io API docs

特性

支持的Web框架

支持的AWS基础设施

不支持

示例

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