采用 Rust 的 Lambda 函数处理程序 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

采用 Rust 的 Lambda 函数处理程序

注意

Rust 运行时系统客户端是实验性程序包。它随时可能更改,并且仅用于评估目的。

Lambda 函数处理程序是函数代码中处理事件的方法。当调用函数时,Lambda 运行处理程序方法。您的函数会一直运行,直到处理程序返回响应、退出或超时。

将 Lambda 函数代码编写为 Rust 可执行文件。实施处理程序函数代码和主函数,并包括以下内容:

例 – 处理 JSON 事件的 Rust 处理程序

以下示例使用 serde_json crate 来处理基本 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 }