使用 Azure Functions 开发无服务器 Node.js 应用

使用 Azure Functions 生成和运行 HTTP API 和事件驱动的 Node.js 应用。 然后,使用本文的其余部分为应用选择正确的无服务器托管和集成路径。

什么是函数应用资源?

函数应用是一个逻辑单元,用于在特定地理位置的单个Azure资源中部署和运行函数代码。 资源可以包含单个函数或多个函数,这些函数彼此独立执行,但共享相同的计算资源、连接和设置。 Functions 提供了一系列基于触发器的模板,可帮助你快速入门。 你可以添加你的代码,以及其他可能的输入和输出绑定。

函数应用资源设置包括常见的无服务器配置,例如环境变量、身份验证、日志记录和 CORS。

持久性有状态函数

虽然Azure中的函数执行本质上是无状态的,但Durable Functions保留状态并管理Azure中长时间运行的函数。 当你需要编排、重试或生命周期超过单次请求的多步工作流时,就使用它们。 若要开始,请参阅 在 JavaScript 中创建第一个持久函数

静态 Web 应用包括函数

开发静态前端客户端应用程序(如 Angular、React 或 Vue)时,如果还需要无服务器 API,可以使用 静态 Web 应用,将两者与函数一起打包。

从客户端应用到 API 的代理

如果打算使用静态 Web 应用部署 API,则无需代理客户端应用程序的 API 调用。 将函数应用部署为托管应用时,系统会为你创建代理。

使用 Azure Functions 在本地开发静态 Web 应用时,Azure Static Web Apps CLI 提供本地代理。

需要为 Azure 函数配置的常见安全设置

要确保 Azure 函数安全,应配置下列常见设置:

  • 身份验证和授权
    • 使用 Microsoft Entra ID (以前为 Azure Active Directory)进行可靠的身份验证。 配置您的函数应用,以要求在生产环境中使用 OAuth2 令牌进行工作负载处理。
    • 避免对敏感应用程序使用函数键。 相反,可以集成 Microsoft Entra ID,或者在函数代码中验证 JWT 令牌。
    • 使用 托管标识 通过其他 Azure 资源对函数应用进行身份验证,确保每个函数仅获取所需的访问权限。
  • 配置设置
  • 网络安全
    • CORS - 配置客户端域。 请勿使用 *,指示所有域。
    • 虚拟网络集成 - 使用专用终结点或虚拟网络集成来限制网络公开,并限制来自受信任源的入站流量。
  • HTTPS 和加密
    • HTTPS 的 TLS/SSL 设置 - API 默认接受 HTTP 和 HTTPS 请求。 在 TLS/SSL 设置中启用“仅限 HTTPS”。 由于你的函数应用托管在安全子域(*.azurewebsites.net)上,因此你可以立即使用它(通过 https),并在准备好之前暂缓购买域名以及为该域名配置证书。
  • 部署和监视
    • 部署槽位 - 创建部署槽位,例如 stagepreflight,并推送到该槽位。 准备就绪后,将此暂存槽位与生产环境交换。 不要养成手动推送到生产环境的习惯。 你的代码库应能够标明某个槽位上的是哪个版本或哪次提交。 如果你使用 Flex Consumption,请使用 零停机部署,而不是部署槽。
    • 启用 Application Insights 进行实时遥测、警报和异常检测,以监视可疑活动的函数和审核日志。

有关全面的安全指南,请参阅 保护 Azure Functions

Azure Functions 宿主选项

可以根据要求以不同的方式托管 Azure Functions:

Azure Functions 资源托管计划

创建函数应用资源时,请从以下 Functions 托管计划中进行选择:

  • 消耗计划(旧版):仅需按函数的实际运行时间付费,并支持自动缩放。
  • 弹性消耗计划:通过始终就绪的实例提供增强的控制,以减少冷启动、虚拟网络集成和可配置实例大小(512 MB 到 4 GB)。 对于需要企业安全性和性能功能的基于 Linux 的新工作负载,建议使用此计划。 该计划采用与 Consumption 计划类似的按执行次数计费模式,但始终就绪实例等功能需额外付费。
  • 高级计划:通过预热实例、虚拟网络连接和较长的执行持续时间提供增强的性能。
  • 专用(应用服务)计划:在专用虚拟机上运行函数,以预测成本并完全控制运行时环境。

有关选择正确的托管计划的详细信息,请参阅 Azure Functions 托管选项

Azure 容器应用资源

或者,可以将 Azure Functions 作为容器化工作负荷部署到 Azure 容器应用资源。 此选项可完全控制容器环境,在需要自定义依赖项、长时间运行的进程或希望将函数与其他容器化微服务组合时,这是理想的选择。 有关详细信息,请参阅Azure 容器应用上的 Azure Functions 概述

开发 Azure Functions 的先决条件

  • Node.js LTS - 使用最新的长期支持(LTS)版本,以获得最佳与 Azure Functions 的兼容性和安全更新。
  • Azure Functions Core Tools - 使用当前主版本进行本地开发和调试。

用于 HTTP 请求的简单 JavaScript 函数

函数是含有请求和上下文信息的导出异步函数。 Azure 门户的以下部分屏幕截图显示了函数代码。

使用以下 v4 编程模型示例之一作为函数项目的起点。

import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";

export async function status(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    return {
        status: 200,
        jsonBody: {
            env: process.env
        }
    };
};

app.http('status', {
    route: "status",
    methods: ['GET'],
    authLevel: 'anonymous',
    handler: status
});

应用启动后,访问 http://localhost:7071/api/status 以在本地测试该端点。

使用 Visual Studio Code 和扩展在本地开发函数

使用 Visual Studio Code 创建第一个函数。 Visual Studio Code 使用 Azure Functions 扩展简化了许多详细信息。

此扩展有助于使用常用模板创建 JavaScript 和 TypeScript 函数。

与其他 Azure 服务集成

无服务器函数消除了许多服务器配置和管理,因此你可以只关注所需的代码。

  • 低代码函数:使用 Azure Functions 时,可以使用 触发器绑定创建由其他 Azure 服务触发的函数或输出到其他 Azure 服务的函数。 v4 编程模型直接在代码中注册所有触发器和绑定,使配置类型安全且直观。
  • 高代码函数:若要进行更多控制,请使用 Azure SDK 协调和控制其他 Azure 服务。 使用 托管标识 通过其他 Azure 资源安全地对函数进行身份验证,而无需管理凭据。

后续步骤