4个版本

0.1.3 2023年10月11日
0.1.2 2023年10月11日
0.1.1 2023年10月11日
0.1.0 2023年10月11日

#19 in #event-handling

Apache-2.0

14KB
157

Lambda Handler

lambda_handler 是一个Rust库,用于创建处理多个请求的AWS Lambda函数,根据请求的类型和名称(例如,S3事件名称、SNS主题名称等)进行路由。

它使代码非常简单

use lambda_runtime::{Error as LambdaError, LambdaEvent};
use serde::Serialize;

use lambda_handler::events::{S3Event, SnsEvent, SqsEvent};
use lambda_handler::LambdaHandler;


#[derive(Debug, Serialize)]
pub struct Response {
    pub req_id: String,
    pub body: String,
}


async fn handle_s3_event(event: LambdaEvent<S3Event>) -> Result<Response, LambdaError> {
    Ok(Response {
        req_id: event.context.request_id,
        body: "I handled an S3 event!".to_string(),
    })
}

async fn handle_sns_event(event: LambdaEvent<SnsEvent>) -> Result<Response, LambdaError> {
    Ok(Response {
        req_id: event.context.request_id,
        body: "I handled an SNS event!".to_string(),
    })
}

async fn handle_sqs_event(event: LambdaEvent<SqsEvent>) -> Result<Response, LambdaError> {
    Ok(Response {
        req_id: event.context.request_id,
        body: "I handled an SQS event!".to_string(),
    })
}

#[tokio::main]
async fn main() -> Result<(), LambdaError> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .with_target(false)
        .without_time()
        .init();

    let handler = LambdaHandler::<Response>::new()
        .route("ObjectCreated:Put", handle_s3_event)
        .route("ObjectCreated:Delete", handle_s3_event)
        .route("arn:aws:sns:us-east-1:246796806071:snsNetTest", handle_sns_event)
        .route("arn:aws:sqs:us-west-2:123456789012:SQSQueue", handle_sqs_event);

    lambda_runtime::run(handler).await
}

说明

代码从我们的导入开始;我们需要lambda_runtime来运行,以及serde来序列化我们的响应数据。从 lambda _route::events 我们导入三种事件类型;这些是从 aws_lambda_events 创建并重新导出的,但我们必须在这里使用它们,因为我们添加了一个内部使用的trait。

Response 结构体只是我们在这里决定的结构体;这里有三个要求

  • 它必须实现 DebugSerialize(如这里所示,这些很容易派生)
  • 它必须在所有处理函数的返回类型中使用
  • 它用于创建一个 LambdaHandler 实例,该实例期望处理函数返回它,使用 LambdaHandler::<Response>

接下来我们定义了三个处理事件的异步函数;你的二进制文件中的大部分代码实际上都驻留在这里。每个函数都接受一个 event,类型为 LambdaEvent<T>,其中 T 是它处理的事件类型。它返回一个 Result<Response, LambdaError>

最后,我们有我们的异步 main 函数。我们设置跟踪,然后创建我们的路由器

    let handler = LambdaHandler::<Response>::new()
        .route("ObjectCreated:Put", handle_s3_event)
        .route("ObjectCreated:Delete", handle_s3_event)
        .route("arn:aws:sns:us-east-1:246796806071:snsNetTest", handle_sns_event)
        .route("arn:aws:sqs:us-west-2:123456789012:SQSQueue", handle_sqs_event);

这将在路由器中添加正确的事件名称的处理程序。请注意,如果我们愿意,我们可以使用同一处理程序处理多个事件。

依赖关系

~7–16MB
~207K SLoC