#lambda #netlify #locally #local #test

llambda

用于本地测试您的 Netlify Rust lambda 函数的类型

3 个版本

0.1.2 2021年2月18日
0.1.1 2021年2月16日
0.1.0 2021年2月16日

#5 in #netlify

MIT/Apache

10KB
140 行代码(不含注释)

Netlify Rust 本地测试

本地测试您的 Netlify Rust 函数。无需 docker 容器。

完整工作示例 在此。我将它用作我的入门模板。

上下文

此库提供类型和转换器,允许您使用本地服务器在本地测试您的 Netlify 函数。技巧是将 lambda 请求和 hyper 请求类型转换为通用类型,单独处理,并返回转换为 lambda 响应类型或 hyper 响应类型的通用响应类型。

lambda 请求参数有点奇怪,我在 request 模块中复制了它们。即使它们对我来说并不完全有意义,我也想忠于生产环境中的实际情况。

通用处理程序

type Error = Box<dyn std::error::Error + Send + Sync + 'static>;

use aws_lambda_events::encodings::Body;
use http::Response;
use llambda::request::Request;

pub async fn handle(_: Request) -> Result<Response<Body>, Error> {
    let response = Response::builder()
        .status(200)
        .header("Content-Type", "text/plain; charset=utf-8")
        .body(Body::from("🦀 Hello, Netlify 🦀"))
        .expect("failed to render response");

    Ok(response)
}

lambda 函数

use netlify_lambda_http::{
    lambda::{lambda, Context},
    IntoResponse, Request,
};

type Error = Box<dyn std::error::Error + Send + Sync + 'static>;

pub mod handler;

#[lambda(http)]
#[tokio::main]
async fn main(request: Request, _: Context) -> Result<impl IntoResponse, Error> {
    let req = llambda::request::Request::from_lambda(request).await?;
    handler::handle(req).await
}

hyper 服务器

use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response, Server};
use std::convert::Infallible;
type Error = Box<dyn std::error::Error + Send + Sync + 'static>;

pub mod handler;

#[tokio::main]
pub async fn main() -> Result<(), Error> {
    let make_svc = make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(handle)) });
    let addr = ([127, 0, 0, 1], 7878).into();
    let server = Server::bind(&addr).serve(make_svc);
    server.await?;
    Ok(())
}

async fn handle(request: Request<Body>) -> Result<Response<Body>, Error> {
    let req = llambda::request::Request::from_hyper(request).await?;
    let lambda_response = handler::handle(req).await?;
    let resp = llambda::response::from_lambda(lambda_response);
    Ok(resp)
}

如何构建

  1. 创建一个 server.rs 和一个 handler.rs,其中实现处理程序和服务器。
  2. 将二进制文件添加到 Cargo.toml `
[[bin]]
name = "function"
path = "src/main.rs"

[[bin]]
name = "server"
path = "src/server.rs"
  1. $cargo build
  2. ./target/debug/server

依赖项

~11–21MB
~315K SLoC