10个版本 (重大更改)

0.11.0 2024年6月26日
0.10.0 2024年2月26日
0.9.0 2023年12月20日
0.8.2 2023年11月15日
0.0.0 2021年11月30日

#184 in HTTP服务器

Download history 1069/week @ 2024-05-03 1008/week @ 2024-05-10 1155/week @ 2024-05-17 915/week @ 2024-05-24 833/week @ 2024-05-31 1414/week @ 2024-06-07 1095/week @ 2024-06-14 999/week @ 2024-06-21 602/week @ 2024-06-28 655/week @ 2024-07-05 415/week @ 2024-07-12 441/week @ 2024-07-19 684/week @ 2024-07-26 748/week @ 2024-08-02 718/week @ 2024-08-09 1360/week @ 2024-08-16

每月3,620次下载
用于 tracing-layer-core

Apache-2.0

110KB
2K SLoC

Rust中的AWS Lambda运行时扩展

Docs

lambda-extension 是一个库,它使您能够轻松地在Rust中编写 AWS Lambda 运行时扩展。它还帮助使用 Lambda 日志 API

示例扩展

简单扩展

以下代码创建了一个简单的扩展,该扩展注册到了每个 INVOKESHUTDOWN 事件。

use lambda_extension::{service_fn, Error, LambdaEvent, NextEvent};

async fn my_extension(event: LambdaEvent) -> Result<(), Error> {
    match event.next {
        NextEvent::Shutdown(_e) => {
            // do something with the shutdown event
        }
        NextEvent::Invoke(_e) => {
            // do something with the invoke event
        }
    }
    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    let func = service_fn(my_extension);
    lambda_extension::run(func).await
}

日志处理器扩展

use lambda_extension::{service_fn, Error, Extension, LambdaLog, LambdaLogRecord, SharedService};
use tracing::info;

async fn handler(logs: Vec<LambdaLog>) -> Result<(), Error> {
    for log in logs {
        match log.record {
            LambdaLogRecord::Function(_record) => {
                // do something with the function log record
            },
            LambdaLogRecord::Extension(_record) => {
                // do something with the extension log record
            },
            _ => (),
        }
    }

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    let logs_processor = SharedService::new(service_fn(handler));

    Extension::new().with_logs_processor(logs_processor).run().await?;

    Ok(())
}

遥测处理器扩展

use lambda_extension::{service_fn, Error, Extension, LambdaTelemetry, LambdaTelemetryRecord, SharedService};
use tracing::info;

async fn handler(events: Vec<LambdaTelemetry>) -> Result<(), Error> {
    for event in events {
        match event.record {
            LambdaTelemetryRecord::Function(record) => {
                // do something with the function log record
            },
            LambdaTelemetryRecord::PlatformInitStart {
                initialization_type: _,
                phase: _,
                runtime_version: _,
                runtime_version_arn: _,
            } => {
                // do something with the PlatformInitStart event
            },
            // more types of telemetry events are available
            _ => (),
        }
    }

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    let telemetry_processor = SharedService::new(service_fn(handler));

    Extension::new().with_telemetry_processor(telemetry_processor).run().await?;

    Ok(())
}

部署

您可以使用 Lambda 层 或将它们添加到 容器镜像 中来将 Lambda 扩展添加到您的函数中。

无论您如何部署它们,扩展必须与您的 Lambda 函数运行的相同架构编译。

构建扩展

cargo lambda build --release --extension

如果您想在ARM处理器上运行扩展,请将 --arm64 标志添加到之前的命令中

cargo lambda build --release --extension --arm64

此前的命令将在 target/lambda/extensions 中生成一个名为 basic 的二进制文件。当扩展与 运行时扩展 API 注册时,这是扩展将注册的名称。如果您想以不同的名称注册扩展,只需重命名此二进制文件并使用新名称部署即可。

部署扩展

  • 请确保您的终端中已设置正确的凭证,通过运行 AWS CLI configure 命令来实现
aws configure
  • 使用以下命令将扩展作为层进行部署:
cargo lambda deploy --extension

依赖项

~7–17MB
~219K SLoC