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
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
结构体只是我们在这里决定的结构体;这里有三个要求
- 它必须实现
Debug
和Serialize
(如这里所示,这些很容易派生) - 它必须在所有处理函数的返回类型中使用
- 它用于创建一个
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