#azure #azure-sdk #function #debugging #format #running #developer

app azure-functions-sdk

Rust开发者工具的Azure Functions

15个版本 (9个破坏性版本)

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.3.0 2018年11月27日

#66 in #developer

Download history 5/week @ 2024-03-28 6/week @ 2024-04-04

每月52次下载

MIT许可证

61KB
1.5K SLoC

Rust 1.5K SLoC // 0.0% comments Handlebars 209 SLoC

注意

⚠️

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

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

Azure Functions for Rust

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

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

🚩 免责声明
此项目不是官方认可的Microsoft产品,也不是对Microsoft未来产品提供的任何支持的认可。

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

如果您希望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.0 或更高版本。(请参阅安装指南)

如果您使用的是 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 应用程序的方法。

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

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

部署Azure Functions应用程序

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

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

注意:这需要至少 18.06 的 Docker,以便支持实验性的 BuildKit 支持。Docker

要启用 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

Azure 中使用 "Linux (Preview)" 操作系统创建 "Function App (Classic)"。在 "发布" 设置下,选择 "Docker Image"。

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

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

Azure Functions绑定

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

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

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

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

当前支持的绑定列表

Rust 类型 Azure Functions 绑定 方向 Vec<T>
Blob 输入和输出 Blob in, inout, out No
BlobTrigger Blob 触发器 in, inout No
CosmosDbDocument 输入和输出 Cosmos DB 文档 in, out Yes
CosmosDbTrigger Cosmos DB 触发器 in No
DurableActivityContext 持久活动触发器 in No
DurableOrchestrationClient 持久编排客户端 in No
DurableOrchestrationContext 持久编排触发器 in No
EventGridEvent 事件网格触发器 in No
EventHubMessage 事件中心输出消息 out Yes
EventHubTrigger 事件中心触发器 in No
GenericInput 通用输入 in No
GenericOutput 通用输出 out No
GenericTrigger 通用触发器 in No
HttpRequest HTTP 触发器 in No
HttpResponse 输出 HTTP 响应 out No
QueueMessage 输出队列消息 out Yes
QueueTrigger 队列触发器 in No
SendGridMessage SendGrid电子邮件消息 out Yes
ServiceBusMessage 服务总线输出消息 out Yes
ServiceBusTrigger 服务总线触发器 in No
SignalRConnectionInfo SignalR连接信息 in No
SignalRGroupAction SignalR群组操作 out Yes
SignalRMessage SignalR消息 out Yes
输入和输出表 in, out No
TimerInfo 计时器触发器 in No
TwilioSmsMessage Twilio短信消息输出 out Yes

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

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
  • SignalRMessage
  • TwilioSmsMessage

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

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

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

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

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

贡献者

感谢这些优秀的人(emoji key


彼得·胡恩

💻 🐛 📖 🤔 🚇 🚧 📦 👀 ⚠️

瑞安·莱维克

💻 🤔 🚧 👀 🚇

托马斯·埃克特

💻 🖋 🎨 📖 🤔 🚇 🚧 👀

R. 泰勒·克罗伊

💻 📖 👀 🤔

德尼斯·莫洛坎诺夫

💻 ⚠️ 🎨 🤔

斯科特·莱昂斯

💻 ⚠️ 🎨 🤔

Rohan Prinja

💻

Christian Brevik

🐛 💻

Danny Browning

💻 🚧

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

依赖项

~8–18MB
~233K SLoC