#azure #function #bindings #input #http-response #input-output #http-request

azure-functions-shared

azure-functions-codegen 和 azure-functions crate 之间的共享实现

21 个版本 (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日

#70#input-output

每月41次 下载
2 crates 中使用

MIT 许可证

210KB
5K 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 扩展。

当应用程序初始化时,Azure Functions for 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

这将创建一个名为 functions 的模块,该模块位于 ./hello 目录中,并期望将导出的 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

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

将以下内容添加到您的 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 Code 以及 CodeLLDB 扩展来调试 Azure Functions 应用程序。

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

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

部署 Azure Functions 应用程序

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

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

注意:这需要至少为实验性的 BuildKit 支持配置 Docker18.06 版本。

要启用 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 (Preview)" 操作系统在 Azure 中创建 "Function App (Classic)"。在 "发布" 设置下,选择 "Docker Image"。

在 "配置容器" 部分中,选择存储库并输入您推送的镜像。

这就完成了!一旦 Azure 中的 Functions 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
GenericOutput 通用输出 out
GenericTrigger 通用触发器 in
HttpRequest HTTP 触发器 in
HttpResponse 输出 HTTP 响应 out
QueueMessage 输出队列消息 out
QueueTrigger 队列触发器 in
SendGridMessage SendGrid 邮件消息 out
ServiceBusMessage 服务总线输出消息 out
ServiceBusTrigger 服务总线触发器 in
SignalRConnectionInfo SignalR 连接信息 in
SignalRGroupAction SignalR 群组操作 out
SignalR 消息 SignalR 消息 out
表格 输入和输出表格 in, out
计时器信息 计时器触发 in
TwilioSmsMessage Twilio SMS 消息输出 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
  • QueueMessage
  • SendGridMessage
  • ServiceBusMessage
  • SignalRGroupAction
  • SignalR 消息
  • TwilioSmsMessage

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

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

单元元组 () 可用于元组中以“跳过”绑定

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

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

贡献者

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


胡恩彼得

💻 🐛 📖 🤔 🚇 🚧 📦 👀 ⚠️

莱维克·瑞恩

💻 🤔 🚧 👀 🚇

埃克特·托马斯

💻 🖋 🎨 📖 🤔 🚇 🚧 👀

克洛伊·R·泰勒

💻 📖 👀 🤔

莫洛卡诺夫·德尼斯

💻 ⚠️ 🎨 🤔

莱昂斯·斯科特

💻 ⚠️ 🎨 🤔

普里纳·罗汉

💻

布维克·克里斯蒂安

🐛 💻

布朗宁·丹尼

💻 🚧

此项目遵循all-contributors规范。欢迎所有类型的贡献!


lib.rs:

Rust 的 Azure Functions

此包在azure-functions-codegenazure-functions包之间共享类型。

依赖项

~10–14MB
~247K SLoC