采用 Rust 的 Lambda 函数处理程序
注意
Rust 运行时系统客户端
Lambda 函数处理程序是函数代码中处理事件的方法。当调用函数时,Lambda 运行处理程序方法。您的函数会一直运行,直到处理程序返回响应、退出或超时。
将 Lambda 函数代码编写为 Rust 可执行文件。实施处理程序函数代码和主函数,并包括以下内容:
-
来自 crates.io 的 lambda_runtime
crate,可实现适用于 Rust 的 Lambda 编程模型。 -
将 Tokio
包含在依赖项中。适用于 Lambda 的 Rust 运行时系统客户端 使用 Tokio 来处理异步调用。
例 – 处理 JSON 事件的 Rust 处理程序
以下示例使用 serde_json
use lambda_runtime::{service_fn, LambdaEvent, Error}; use serde_json::{json, Value}; async fn handler(event: LambdaEvent<Value>) -> Result<Value, Error> { let payload = event.payload; let first_name = payload["firstName"].as_str().unwrap_or("world"); Ok(json!({ "message": format!("Hello, {first_name}!") })) } #[tokio::main] async fn main() -> Result<(), Error> { lambda_runtime::run(service_fn(handler)).await }
请注意以下几点:
-
use
:导入 Lambda 函数所需的库。 -
async fn main
:运行 Lambda 函数代码的入口点。Rust 运行时系统客户端使用 Tokio作为异步运行时系统,因此您必须使用 #[tokio::main]
为主函数添加注释。 -
async fn handler(event: LambdaEvent<Value>) -> Result<Value,
Error
>
:这是 Lambda 处理程序签名。包括调用函数时运行的代码。-
LambdaEvent<Value>
:这是一种泛型类型,用于描述 Lambda 运行时系统以及 Lambda 函数上下文接收到的事件。 -
Result<Value, Error>
:函数返回Result
类型。如果函数成功,则结果为 JSON 值。如果函数不成功,则结果为错误。
-
使用共享状态
您可以声明独立于 Lambda 函数的处理程序代码的共享变量。这些变量可以帮助您在函数接收任何事件之前的 Init 阶段 期间加载状态信息。
例 – 跨函数实例共享 Amazon S3 客户端
请注意以下几点:
-
use aws_sdk_s3::Client
:此示例要求您将aws-sdk-s3 = "0.26.0"
添加到Cargo.toml
文件中的依赖项列表。 -
aws_config::from_env
:此示例要求您将aws-config = "0.55.1"
添加到Cargo.toml
文件中的依赖项列表。
use aws_sdk_s3::Client; use lambda_runtime::{service_fn, Error, LambdaEvent}; use serde::{Deserialize, Serialize}; #[derive(Deserialize)] struct Request { bucket: String, } #[derive(Serialize)] struct Response { keys: Vec<String>, } async fn handler(client: &Client, event: LambdaEvent<Request>) -> Result<Response, Error> { let bucket = event.payload.bucket; let objects = client.list_objects_v2().bucket(bucket).send().await?; let keys = objects .contents() .map(|s| s.iter().flat_map(|o| o.key().map(String::from)).collect()) .unwrap_or_default(); Ok(Response { keys }) } #[tokio::main] async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().load().await; let client = Client::new(&shared_config); let shared_client = &client; lambda_runtime::run(service_fn(move |event: LambdaEvent<Request>| async move { handler(&shared_client, event).await })) .await }