5 个版本
0.2.0 | 2021年1月7日 |
---|---|
0.1.3 | 2020年12月16日 |
0.1.2 | 2020年12月14日 |
0.1.1 | 2020年12月7日 |
0.1.0 | 2020年12月4日 |
#1529 in 网络编程
每月下载量 292
在 4 个 Crates 中使用(通过 netlify_lambda_http)
42KB
763 行
Rust Runtime for AWS Lambda
本包使您能够轻松运行用 Rust 编写的 AWS Lambda 函数。
⚠️ ⚠️ ⚠️ 👷 👷 👷 🍴 🍴 🍴
这是 AWS Lambda 官方 Rust 运行时的分支。我们创建这个分支是为了能够推进所有在 awslabs 仓库中停滞的贡献,而没有看到发布。
此存储库中的 Crates 以 netlify-
前缀发布到 crates.io。
Netlify Lambda 包含运行时组件。 Netlify Lambda Attributes 包含创建 Lambda 函数的定义。 Netlify Lambda HTTP 包含通过 HTTP 端点访问的 Lambda 函数的定义。
⚠️ ⚠️ ⚠️ 👷 👷 👷 🍴 🍴 🍴
示例函数
下面的代码创建了一个简单的函数,该函数接收一个包含 firstName
字段的 event,并向调用者返回一条消息。注意:此 crate 对最新的稳定 Rust 进行了测试。
use netlify_lambda::{handler_fn, Context};
use serde_json::{json, Value};
type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
#[tokio::main]
async fn main() -> Result<(), Error> {
let func = handler_fn(func);
netlify_lambda::run(func).await?;
Ok(())
}
async fn func(event: Value, _: Context) -> Result<Value, Error> {
let first_name = event["firstName"].as_str().unwrap_or("world");
Ok(json!({ "message": format!("Hello, {}!", first_name) }))
}
上面的代码与 lambda
crate 中的 基本示例 相同。
部署
目前有多种方式构建此包:使用 AWS CLI 手动构建,以及使用 Serverless 框架。
AWS CLI
要使用 AWS CLI 将基本示例作为 Lambda 函数部署,我们首先需要使用 cargo
手动构建它。由于 Lambda 使用 Amazon Linux,您需要为目标平台 x86_64-unknown-linux-musl
编译可执行文件。
运行此脚本一次以添加新目标
$ rustup target add x86_64-unknown-linux-musl
- 注意:如果您正在Mac OS上运行,您需要为目标平台安装链接器。您可以通过从Homebrew安装的
musl-cross
tap来完成此操作,它为Mac OS提供了一个完整的交叉编译工具链。一旦安装了musl-cross
,在为x86_64-unknown-linux-musl
平台构建时,我们还需要通知cargo新的链接器。
$ brew install filosottile/musl-cross/musl-cross
$ mkdir .cargo
$ echo $'[target.x86_64-unknown-linux-musl]\nlinker = "x86_64-linux-musl-gcc"' > .cargo/config
编译示例之一,以发布版和特定的目标进行部署到AWS
$ cargo build -p lambda --example hello --release --target x86_64-unknown-linux-musl
对于自定义运行时,AWS Lambda会在部署包zip中查找名为bootstrap
的可执行文件。将生成的basic
可执行文件重命名为bootstrap
并将其添加到zip存档中。
$ cp ./target/release/examples/hello ./bootstrap && zip lambda.zip bootstrap && rm bootstrap
现在我们已经有了部署包(lambda.zip
),我们可以使用AWS CLI创建一个新的Lambda函数。请确保将执行角色替换为您账户中现有的角色!
$ aws lambda create-function --function-name rustTest \
--handler doesnt.matter \
--zip-file fileb://./lambda.zip \
--runtime provided \
--role arn:aws:iam::XXXXXXXXXXXXX:role/your_lambda_execution_role \
--environment Variables={RUST_BACKTRACE=1} \
--tracing-config Mode=Active
您现在可以使用AWS CLI或AWS Lambda控制台测试该函数
$ aws lambda invoke --function-name rustTest \
--payload '{"firstName": "world"}' \
output.json
$ cat output.json # Prints: {"message": "Hello, world!"}
注意:使用AWS CLI版本2时,--cli-binary-format raw-in-base64-out
是一个必需的参数。更多信息
Serverless Framework
或者,您可以使用Serverless框架Rust插件声明性地构建基于Rust的Lambda函数。
存在许多入门Serverless应用程序模板,可以帮助您快速启动
- 一个最小echo函数,以展示最小的Rust函数设置看起来像什么
- 一个最小http函数,以展示如何使用Rust的本地http crate与API Gateway接口(注意这将成为一个git依赖项,直到0.2发布)
- 一个组合多功能服务,以展示如何设置具有多个独立功能的服务
假设您的宿主机有一个相对较新的node版本,您不需要安装任何全局的serverless依赖项。要开始,运行以下命令以创建一个新的lambda Rust应用程序并安装项目级别的依赖项。
$ npx serverless install \
--url https://github.com/softprops/serverless-aws-rust \
--name my-new-app \
&& cd my-new-app \
&& npm install --silent
使用标准的serverless工作流进行部署
# build, package, and deploy service to aws lambda
$ npx serverless deploy
使用serverless框架或配置的AWS集成触发源调用它
$ npx serverless invoke -f hello -d '{"foo":"bar"}'
Docker
或者,您可以在AWS Lambda提供的运行时镜像中预先安装了Rust工具链的Docker中构建基于Rust的Lambda函数。
运行以下命令将启动一个临时的Docker容器,该容器将构建您的Rust应用程序,并生成一个包含其二进制文件的zip文件,二进制文件自动重命名为bootstrap
,以满足AWS Lambda对二进制文件的要求。通常,如果您使用cargo默认二进制文件(即main.rs
),这将是您的crate名称
# build and package deploy-ready artifact
$ docker run --rm \
-v ${PWD}:/code \
-v ${HOME}/.cargo/registry:/root/.cargo/registry \
-v ${HOME}/.cargo/git:/root/.cargo/git \
softprops/lambda-rust
应用程序构建并打包后,即可将其部署到生产环境中。您还可以使用lambdaci提供的Docker容器在本地调用它以验证其行为,该容器也是一个AWS Lambda提供的运行时镜像,但省略了构建依赖项。
# start a docker container replicating the "provided" lambda runtime
# awaiting an event to be provided via stdin
$ unzip -o \
target/lambda/release/{your-binary-name}.zip \
-d /tmp/lambda && \
docker run \
-i -e DOCKER_LAMBDA_USE_STDIN=1 \
--rm \
-v /tmp/lambda:/var/task \
lambci/lambda:provided
# provide an event payload via stdin (typically a json blob)
# Ctrl-D to yield control back to your function
lambda
lambda
是一个用于编写可靠且性能优良的基于Rust的AWS Lambda函数的库。从高层次来看,它提供了一些主要组件
Handler
,一个定义客户编写的代码与该库之间交互的trait。netlify_lambda::run
,一个运行Handler
的函数。
函数 handler_fn
将Rust函数或闭包转换为 Handler
,然后可以被 netlify_lambda::run
运行。
自定义事件对象
为了序列化和反序列化事件和响应,我们建议使用 serde
库。要接收自定义事件,请使用Serde的宏注解您的结构。
use serde::{Serialize, Deserialize};
use serde_json::json;
use std::error::Error;
#[derive(Serialize, Deserialize)]
pub struct NewIceCreamEvent {
pub flavors: Vec<String>,
}
#[derive(Serialize, Deserialize)]
pub struct NewIceCreamResponse {
pub flavors_added_count: usize,
}
fn main() -> Result<(), Box<Error>> {
let flavors = json!({
"flavors": [
"Nocciola",
"抹茶",
"आम"
]
});
let event: NewIceCreamEvent = serde_json::from_value(flavors)?;
let response = NewIceCreamResponse {
flavors_added_count: event.flavors.len(),
};
serde_json::to_string(&response)?;
Ok(())
}
依赖项
~7–19MB
~238K SLoC