基于 Rust 的 Serverless 函数:从零到精通 AWS Lambda

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 Rust 用于 Serverless 是一次突破

\n\n

Serverless 架构早已成为构建可扩展且经济高效应用程序的标准。然而,传统的语言选择(Python、Node.js、Java)常常面临冷启动问题和内存消耗高的问题。Rust 凭借其零成本抽象和没有垃圾回收器的特性,提供了一种革命性的解决方案。在本文中,我们将详细讲解如何为 AWS Lambda 创建、配置和部署基于 Rust 的 serverless 函数——从工具安装到生产环境发布。

\n\n

在本文结束时,您将能够:

\n
    \n
  • 配置 Rust + AWS Lambda 的开发环境
  • \n
  • 编写一个高效的事件处理函数
  • \n
  • 优化二进制文件以实现最短的冷启动时间
  • \n
  • 使用 Cargo Lambda 在 AWS 上部署函数
  • \n
\n\n

环境准备:Cargo Lambda 和 AWS CLI

\n\n

为了在 AWS Lambda 上使用 Rust,我们需要一个专门的工具——cargo-lambda。它可以自动化构建、测试和部署过程。通过 Cargo 安装它:

\n\n
cargo install cargo-lambda
\n\n

同时,请确保您已安装 aws-cli(配置了 IAM 密钥)和 Docker(用于本地测试)。创建一个新项目:

\n\n
cargo lambda new my-rust-lambda\ncd my-rust-lambda
\n\n

该命令将创建一个包含 Cargo.toml 和 src/main.rs 文件的基本结构。请注意 Cargo.toml 中的依赖项:

\n\n
[package]\nname = "my-rust-lambda"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nlambda_runtime = "0.11"\ntokio = { version = "1", features = ["macros", "rt-multi-thread"] }\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntracing = { version = "0.1", features = ["log"] }\ntracing-subscriber = { version = "0.3", features = ["fmt"] }
\n\n

关键的库是 lambda_runtime。它提供了我们将要实现的 LambdaHandler trait。

\n\n

编写第一个函数:处理 API Gateway 请求

\n\n

考虑一个经典场景:一个函数接收包含用户名的 JSON,并返回问候语。打开 src/main.rs 并编写以下代码:

\n\n
use lambda_runtime::{run, service_fn, Error, LambdaEvent};\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize)]\nstruct Request {\n    name: String,\n}\n\n#[derive(Serialize)]\nstruct Response {\n    message: String,\n}\n\nasync fn function_handler(event: LambdaEvent<Request>) -> Result<Response, Error> {\n    let name = event.payload.name;\n    let message = format!("你好,{}!你刚刚在 Lambda 上运行了 Rust!", name);\n    Ok(Response { message })\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n    tracing_subscriber::fmt()\n        .with_max_level(tracing::Level::INFO)\n        .init();\n\n    run(service_fn(function_handler)).await\n}
\n\n

我们来分析关键点:

\n
    \n
  • LambdaEvent<Request> — 包含请求体和执行上下文的结构体。
  • \n
  • #[tokio::main] — 异步运行时,Lambda 运行时需要它。
  • \n
  • serde — 用于反序列化传入的 JSON 和序列化响应。
  • \n
\n\n

本地测试:

\n\n
cargo lambda watch
\n\n

然后在另一个终端中:

\n\n
cargo lambda invoke --data-ascii '{"name": "阿列克谢"}'
\n\n

您应该看到:{"message":"你好,阿列克谢!你刚刚在 Lambda 上运行了 Rust!"}

\n\n

优化冷启动和二进制文件大小

\n\n

Rust 的主要优势在于极短的冷启动时间。然而,要实现这一点,需要正确构建二

博客

书籍推荐