How to pass in stateful client to lambda function?

I am working on a simple Lambda function and I was wondering if I could pass in client (dynamodb this time) to the handler, so we do not re-connect for every request.

The macro is defined here:

https://docs.rs/lambda_http/0.1.1/lambda_http/macro.lambda.html

My function so far:

fn main() -> Result<(), Box<dyn Error>> {
    simple_logger::init_with_level(log::Level::Debug)?;
    info!("Starting up...");
    let dynamodb_client = DynamoDbClient::new(Region::EuCentral1);
    lambda!(router);
    return Ok(());
}

Is it possible to extend this macro to have a second option so I can add the client all the way down to the functions which are actually talking to the database.

Let me answer my own question here. I found lazy_static to be a great solution for this problem.

#[macro_use]
extern crate lazy_static;

lazy_static! {
    static ref DYNAMODB_CLIENT: DynamoDbClient = DynamoDbClient::new(Region::EuCentral1);
}

If you use a closure instead of router in the macro, you can move the client into the closure.

1 Like

Thanks @alice, not sure how that would work. The client is needed later on by the actual handler functions. Would that work?

I'm not familiar with lambda_http. By moving it into the closure, you can have it available inside the router function. If you can pass it on from there, yes.