#azure #function #func #bindings #generation #input #azure-functions

azure-functions-codegen

Rust代码生成支持Azure Functions

25个版本 (10个破坏性版本)

0.11.0 2019年11月12日
0.10.0 2019年7月15日
0.9.0 2019年6月11日
0.6.0 2019年3月19日
0.1.5 2018年7月28日

#13 in #func


azure-functions 中使用

MIT 许可证

250KB
6K SLoC

注意

⚠️

该项目不再由原始作者积极维护。

鼓励进行分叉或衍生作品!

Rust的Azure Functions

crates-status docs-status all-contributors-status gitter-status build-status dependabot-status license-status

一个用于在Rust中实现Azure Functions的框架。

🚩 免责声明
此项目不是微软官方认可的产品,也不代表微软对任何未来产品推出的认可。

Microsoft和Azure是微软公司的注册商标。

如果您希望Azure Functions团队考虑支持Rust,请为此反馈投票

示例

一个简单的HTTP触发的Azure Function

use azure_functions::{
    bindings::{HttpRequest, HttpResponse},
    func,
};

#[func]
pub fn greet(req: HttpRequest) -> HttpResponse {
    format!(
        "Hello from Rust, {}!\n",
        req.query_params().get("name").map_or("stranger", |x| x)
    )
    .into()
}

Azure Functions for Rust也支持异步函数

use azure_functions::{
    bindings::{HttpRequest, HttpResponse},
    func,
};
use futures::future::ready;

#[func]
pub async fn greet_async(req: HttpRequest) -> HttpResponse {
    // Use ready().await to simply demonstrate the async/await feature
    ready(format!(
        "Hello from Rust, {}!\n",
        req.query_params().get("name").map_or("stranger", |x| x)
    ))
    .await
    .into()
}

有关更多信息,请参阅构建异步Azure Functions应用程序

入门

目录

安装

要求

.NET Core SDK

需要.NET Core SDK来同步Azure Functions Host绑定扩展。

例如,使用Cosmos DB绑定需要在Azure Functions Host中安装以下扩展:Microsoft.Azure.WebJobs.Extensions.CosmosDB

这会在Rust初始化应用程序时自动发生。

按照2.2 .NET Core SDK下载说明安装Windows、macOS或Linux发行版。

Azure Functions Core Tools

安装Azure Functions Core Tools的版本2或更高版本。

如果您使用的是Windows,必须将%ProgramFiles%\nodejs\node_modules\azure-functions-core-tools\bin(其中func.exe所在位置)添加到环境变量PATH中。

安装Azure Functions for Rust SDK

使用cargo install安装Azure Functions for Rust SDK。

cargo install azure-functions-sdk

这会安装一个名为func的新cargo命令,可用于创建和运行新的Azure Functions应用程序。

创建新的Azure Functions应用程序

使用cargo func new-app命令创建一个新的Azure Functions应用程序。

cargo func new-app hello

这将在./hello目录中创建一个名为functions的新模块,其中预期放置导出的Azure Functions。

添加简单的HTTP触发应用程序

使用cargo func new命令创建一个名为hello的新HTTP触发器Azure Function。

cargo func new http -n hello

函数的源代码将在src/functions/hello.rs中。

构建Azure Functions应用程序

要构建您的Azure Functions应用程序,只需使用cargo build

cargo build

如果您使用的是nightly编译器,可以在编译期间启用改进的错误消息。

将以下内容添加到您的Cargo.toml

[features]
unstable = ["azure-functions/unstable"]

构建您的应用程序

cargo build --features unstable

这使Azure Functions for Rust能够在诊断消息中发出包含属性中错误位置的属性。

构建异步Azure Functions应用程序

要构建支持异步Azure Functions的版本,将以下内容添加到您的Cargo.toml

[dependencies]
futures-preview = "0.3.0-alpha.19"

然后进行构建

cargo build

运行Azure Functions应用程序

要构建和运行您的Azure Functions应用程序,请使用cargo func run

cargo func run

如果您需要启用unstable功能,请向cargo传递--features选项。

cargo func run -- --features unstable

cargo func run命令会使用由Azure Functions Core Tools安装的Azure Function Host在本地构建和运行您的应用程序。

默认情况下,主机将配置为监听在0.0.0.0:8080

对于之前添加的hello函数,可以通过https://127.0.0.1:8080/api/hello进行调用。

调试Azure Functions应用程序

使用Visual Studio CodeCodeLLDB扩展调试Azure Functions应用程序是最简单的方法。

默认情况下,当您运行cargo func new-app时,Rust SDK的Azure Functions将创建一个Visual Studio Code启动配置。

这将启用一个Debug启动配置,在将lldb调试器附加到Rust工作进程之前,会在本地构建并运行您的应用程序。

部署Azure Functions应用程序

未来,将有一个cargo func deploy命令,可以直接将Azure Functions应用程序部署到Azure。

在此之前,您必须手动构建并将Docker镜像推送到Azure可以访问的仓库。

注意:这需要至少18.06版本的Docker来支持实验性的BuildKit功能。

要启用BuildKit支持,在运行docker build之前,将DOCKER_BUILDKIT环境变量设置为1

首先使用docker build -t $TAG_NAME .构建您的镜像。

docker build -t $TAG_NAME .

其中$TAG_NAME是要使用的标签名称(例如,username/my-functions-app)。

使用docker push将镜像推送到Azure Functions可以访问的仓库。

docker push $TAG_NAME

使用“Linux(预览)”操作系统在Azure中创建“Function App (Classic)”,在“发布”设置下选择“Docker镜像”。

在“配置容器”部分,选择仓库并输入您推送到那里的镜像。

就是这样!一旦Azure中的Function App启动,您应该能够查看并运行函数。

Azure Functions绑定

Azure Functions支持许多输入和输出绑定,这些绑定可以被函数使用。

在C#等语言中,参数可以用描述参数如何绑定的属性进行注释。

Rust不支持参数上的属性,因此#[binding]属性应用于与参数标识符匹配名称的函数。属性的参数取决于绑定类型。

#[func]属性用于将普通的Rust函数转换为Azure Function。它通过检查函数的参数和返回类型,并将其自动映射到相应的绑定来实现。

当前支持的绑定列表

Rust类型 Azure Functions绑定 方向 Vec<T>
Blob 输入和输出Blob in, inout, out
BlobTrigger Blob触发器 in, inout
CosmosDbDocument 输入和输出Cosmos DB文档 in, out
CosmosDbTrigger Cosmos DB触发器 in
DurableActivityContext 持久性活动触发器 in
DurableOrchestrationClient 持久性编排客户端 in
DurableOrchestrationContext 持久性编排触发器 in
EventGridEvent 事件网格触发器 in
EventHubMessage 事件中心输出消息 out
EventHubTrigger 事件中心触发器 in
GenericInput 通用输入 in
通用输出 通用输出 out
通用触发器 通用触发器 in
HTTP请求 HTTP触发器 in
HTTP响应 输出HTTP响应 out
队列消息 输出队列消息 out
队列触发器 队列触发器 in
SendGrid消息 SendGrid电子邮件消息 out
服务总线消息 服务总线输出消息 out
服务总线触发器 服务总线触发器 in
SignalR连接信息 SignalR连接信息 in
SignalR组操作 SignalR组操作 out
SignalR消息 SignalR消息 out
输入和输出表 in, out
定时器信息 定时器触发器 in
Twilio短信消息 Twilio短信消息输出 out

未来将实现更多绑定,包括支持从自定义绑定中检索数据。

Rust中的绑定

Azure Functions for Rust会自动推断绑定的方向,这取决于绑定在函数声明中的使用方式。

输入绑定

类型为T&T的参数,其中T是触发器或输入绑定类型,被推断为具有in方向的绑定。

#[func]
...
pub fn example(..., blob: Blob) {
    ...
}
#[func]
...
pub fn example(..., blob: &Blob) {
    ...
}

此外,一些输入绑定类型支持类型为Vec<T>&Vec<T>的参数,其中T是输入绑定类型。

#[func]
...
pub fn example(..., documents: Vec<CosmosDbDocument>) {
    ...
}

以下输入绑定支持类型为Vec<T>的参数。

  • CosmosDbDocument

输入-输出(inout)绑定

类型为&mut T的参数,其中T是支持inout方向的触发器或输入绑定类型,被推断为具有inout方向的绑定。

#[func]
...
pub fn example(..., blob: &mut Blob) {
    ...
}

注意:目前除C#之外的语言不支持inout方向的绑定。

有关Azure Functions Host中此问题的信息,请参阅此问题

输出绑定

返回类型为T的函数,其中T是输出绑定类型,或输出绑定类型的元组,被推断为具有out方向的绑定。

#[func]
...
pub fn example(...) -> Blob {
    ...
}

函数还可以返回任何输出绑定类型TOption<T>;一个None值将跳过输出值。

#[func]
...
pub fn example(...) -> Option<Blob> {
    ...
}
#[func]
...
pub fn example(...) -> (HttpResponse, Option<Blob>) {
    ...
}

此外,一些输出绑定类型支持返回类型为Vec<T>的值,其中T是输出绑定类型。

#[func]
...
pub fn example(...) -> Vec<CosmosDbDocument>) {
    ...
}

以下输出绑定支持返回类型为Vec<T>的值。

  • CosmosDbDocument
  • EventHubMessage
  • 队列消息
  • SendGrid消息
  • 服务总线消息
  • SignalR组操作
  • SignalR消息
  • Twilio短信消息

对于返回单个输出绑定类型的函数,绑定具有特殊名称$return,并被视为函数的返回值。

对于返回输出绑定类型的元组的函数,元组的第一个值具有绑定名称 $return,并将其视为函数的返回值。其余值具有绑定名称 output1output2、...、output(N-1),其中 N 是元组中类型的数量,并且仅作为输出绑定处理。

单元元组 () 可以在元组中使用以“跳过”一个绑定

#[func]
...
pub fn example(...) -> ((), Blob) {
    ...
}

对于上述示例,没有 $return 绑定,Azure Function 不返回任何值。相反,使用一个名为 output1 的单个输出绑定。

贡献者

感谢这些优秀的人们 (emoji key)


Peter Huene

💻 🐛 📖 🤔 🚇 🚧 📦 👀 ⚠️

Ryan Levick

💻 🤔 🚧 👀 🚇

Thomas Eckert

💻 🖋 🎨 📖 🤔 🚇 🚧 👀

R. Tyler Croy

💻 📖 👀 🤔

Denis Molokanov

💻 ⚠️ 🎨 🤔

Scott Lyons

💻 ⚠️ 🎨 🤔

Rohan Prinja

💻

克里斯蒂安·布雷维克

🐛 💻

丹尼·布朗宁

💻 🚧

本项目遵循 all-contributors 规范。欢迎任何形式的贡献!


lib.rs:

Rust的Azure Functions

此软件包支持为 azure-functions 软件包进行代码生成。

依赖项

约11-14MB
约251K SLoC