在 AWS Lambda 中使用 Rust 编写无服务器函数:完整指南

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

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

开始课程

引言:为什么 Rust 是无服务器的理想语言



无服务器架构已成为现代云应用的标准。然而,传统语言(Python、Node.js)常常受困于缓慢的冷启动和高内存消耗。Rust 解决了这些问题:其编译后的二进制文件可在毫秒内启动,且内存消耗极低。在本文中,我们将探讨如何创建、部署和优化基于 Rust 的 AWS Lambda 函数——从环境设置到生产环境部署。



1. 环境与工具设置



安装 Rust 和 Cargo Lambda

要在 AWS Lambda 上使用 Rust,您需要:

  • Rust(通过 rustup 安装)
  • Cargo Lambda——用于构建和部署的官方工具
  • 配置了凭证的 AWS CLI


# 安装 Rustcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 安装 Cargo Lambdacargo install cargo-lambda

# 检查cargo lambda --version


创建新项目

Cargo Lambda 会自动生成一个支持 Lambda Runtime API 的模板:



cargo lambda new my-rust-lambdacd my-rust-lambda


项目结构包含带有 lambda_runtime 和 serde 依赖项的 Cargo.toml,以及包含基本处理函数的 src/main.rs 文件。



2. 编写第一个 Rust 无服务器函数



处理函数的基本结构

让我们看一个简单的 Lambda 函数,它接收包含名字的 JSON 并返回问候语:



use lambda_runtime::{service_fn, LambdaEvent, Error};use serde::{Deserialize, Serialize};

#[derive(Deserialize)]struct Request { name: String,}

#[derive(Serialize)]struct Response { message: String, request_id: String,}

async fn handler(event: LambdaEvent<Request>) -> Result<Response, Error> { let req = event.payload; let resp = Response { message: format!("你好,{}!你在用 Rust!", req.name), request_id: event.context.request_id, }; Ok(resp)}

#[tokio::main]async fn main() -> Result<(), Error> { lambda_runtime::run(service_fn(handler)).await}


关键点:

  • service_fn 将异步函数包装成处理函数
  • LambdaEvent 包含 payload 和上下文(request_id、deadline 等)
  • 通过 serde 进行序列化/反序列化


本地测试

在部署之前,先在本地测试函数:



cargo lambda watch# 在另一个终端中:cargo lambda invoke --data-ascii '{"name": "世界"}'


您应该会收到响应:{"message":"你好,世界!你在用 Rust!","request_id":"..."}



3. 与 AWS 服务集成(S3、DynamoDB)



通过 AWS SDK 集成 S3

在 Cargo.toml 中添加:



[dependencies]aws-sdk-s3 = "1.0"aws-config = "1.0"


一个从 S3 读取对象的函数示例:



use aws_sdk_s3::Client;

async fn handler(event: LambdaEvent<Request>) -> Result<Response, Error> { let config = aws_config::load_from_env().await; let s3_client = Client::new(&config);

let bucket = "my-bucket"; let key = &event.payload.name;

let object = s3_client .get_object() .bucket(bucket) .key(key) .send() .await?;

let body = object.body.collect().await?; let content = String::from_utf8(body.to_vec())?;

Ok(Response { message: format!("文件内容:{}", content), request_id: event.context.request_id, })}


在

博客

书籍推荐