第 1 步:在门户中创建远程服务(Azure 函数)

本主题详细说明了如何创建 Azure 函数以用作外部函数的远程服务。

本主题内容:

上一步

为 Azure 规划外部函数

创建 Azure Functions 应用程序

创建远程服务有多种可能的方法。本节介绍如何创建作为 JavaScript 函数实现的远程服务。

此外部函数是 同步 函数。有关创建 异步 外部函数的信息,请参阅 在 Azure 上创建异步函数

创建一个 Azure Functions 应用程序,以用作稍后创建的函数的容器:

  1. 如果尚未导入,请登录 Azure 门户。

  2. 按照 Microsoft 文档“Azure Functions 应用程序 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-function-app-portal)”中的说明,创建 Azure Functions 应用程序。

    按照说明操作时,请记住以下几点:

    • Function App Name 字段中输入名称时,还要在跟踪工作表的 Azure Function app name 字段中记录该名称。

    • 当需要选择如何 Publish 时,请选择 Code

    • 在同一资源组中创建多个应用程序时存在一些限制。有关详细信息,请参阅 Microsoft 文档:Azure 应用程序服务 (https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-intro#limitations)。

    Snowflake在 Node.js 中提供了一个示例“echo”函数。要使用此示例函数开始入门,请执行以下操作:

    • 当需要 Runtime stack 时,选择 Node.js。

    • 当需要 Node.js 的版本时,选择版本 12。

    • 当需要在哪个 OS 上运行该函数时,选择“Windows”或“Linux”。

      • 如果您只是创建演示函数,Snowflake 建议选择“Windows”。

        无法在 Azure 门户中编辑 Linux 函数应用程序。用户必须通过 Visual Studio Code 界面发布代码。

      • 如果要在 Linux(而不是 Microsoft Windows)上运行 Azure Functions,请参阅 Microsoft 文档:Azure Functions (https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code?pivots=programming-language-javascript)。

        使用 Azure Functions 的“消费”定价方案时,Azure AD 身份验证在 Linux 上不可用。您必须使用“应用程序服务”定价方案或“高级”定价方案才能通过 Azure AD 进行身份验证。

        有关更多详细信息,请参阅 Microsoft 文档:Azure AD (https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad)。

创建 HTTP 触发的 Azure 函数

创建 Azure Functions 应用程序(容器)后,需要在容器中创建 Azure Functions。此函数充当远程服务。

Microsoft 允许以不同方式调用(“触发”)Azure Functions。Snowflake 外部函数通过 HTTP POST 命令调用远程服务,因此您创建的 Azure 函数必须是“HTTP 触发的函数”。

小技巧

您可以使用 Microsoft 提供的说明来创建 HTTP 触发的函数:

  • 创建应用程序门户 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-function-app-portal)

  • 创建 Azure 函数 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function#create-function)

但是,Snowflake 提供自定义说明,其中包括其他详细信息和示例代码,并建议与 Microsoft 不同的授权级别。建议使用自定义说明来代替 Microsoft 的说明。

创建函数

要执行本节中描述的任务,您应进入 Azure 门户中的 Function App 屏幕。通常在屏幕左上角旁边,应显示 Azure Functions 应用程序的名称。

要创建 HTTP 触发的函数,请执行以下操作:

  1. 在左侧菜单树中,查找标题为 Functions 的部分。在该部分中,点击标记为 Functions 的项目来添加函数。

  2. 点击 + Add 按钮。

  3. 从右侧的潜在触发器列表中选择 HTTP trigger

  4. 输入用于 HTTP 触发函数的名称。

    将此名称记录在跟踪工作表的 HTTP-Triggered Function name 字段中。

  5. 输入 Authorization level

    Snowflake 建议选择 Function 作为授权级别。

    有关可能的授权级别的更多信息,请参阅 Microsoft 文档:HTTP 触发的函数 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#configuration)。

  6. 点击标题为 Add 的按钮。

    您会进入一个屏幕,其中显示了函数名称及其下方的 Function 一词。

  7. 在左侧的树形菜单中,点击 Code + Test

  8. 将默认代码替换为您自己的代码。

    下面提供了 JavaScript“echo”函数的示例代码。

    该函数读取每一行,然后将相应行复制到输出(结果)。行号也包含在输出中。输出作为多级字典的一部分返回。

    此函数接受并返回的数据的格式与 Snowflake 发送和读取的格式 (JSON) 相同。有关数据格式的更多详细信息,请参阅 远程服务输入和输出数据格式

    通常,该函数返回 HTTP 代码 200。如果没有行传递给函数(即,如果请求正文为空),则该函数返回错误代码 400。

    module.exports = async function(context, request) {
        context.log('JavaScript HTTP trigger function processed a request.');
    
        if (request.body) {
            var rows = request.body.data;
            var results = [];
            rows.forEach(row => {
                results.push([row[0], row]);
            });
    
            results = {data: results}
            context.res = {
                status: 200,
                body: JSON.stringify(results)
            };
       }
       else {
           context.res = {
               status: 400,
               body: "Please pass data in the request body."
           };
       }
    };
    
    Copy
  9. 点击代码上方的 Save 按钮。

测试函数

要测试刚创建的 HTTP 触发的 Azure 函数,请将以下示例数据粘贴到 Body 字段中,然后点击 Test/Run 按钮:

{
    "data": [ [ 0, 43, "page" ], [ 1, 42, "life, the universe, and everything" ] ]
}
Copy

输出的内容应类似于以下内容:

{ "data":
    [
        [ 0, [ 0, 43, "page" ] ],
        [ 1, [ 1, 42, "life, the universe, and everything" ]  ]
    ]
}
Copy

请注意,格式可能与上面显示的不同。

设置 Azure Functions 应用程序的授权要求

当调用外部函数时,Snowflake 会向代理服务(例如 Azure API 管理服务)发送 HTTP POST命令,代理服务会将 POST 转发到远程服务(例如 Azure 函数)。

这两个步骤都应该有授权要求,因此您通常会指定以下授权:

  • 调用 API 管理服务所需的授权。

  • 调用包含 Azure Functions 的 Azure Functions 应用程序中的函数所需的授权。

本节介绍如何请求 Azure Functions 应用程序的授权。API 管理服务是稍后创建的,因此其授权要求也是稍后指定的。

当 Snowflake 使用您的 Azure Functions 应用程序进行身份验证时,Snowflake 会将 OAuth 客户端凭据授予流程与 Azure AD 结合使用。

有关客户端凭据授予流程的更多详细信息,请参阅 Microsoft 文档:客户端凭据 (https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-oauth2-client-creds-grant-flow)。

此客户端凭据流程需要代表 Azure Functions 应用程序的 Azure AD 应用程序注册。

本节说明了如何为 Azure Functions 应用程序创建 Azure AD 应用程序注册。例如,您可以将 Azure Functions 应用程序设置为需要 Azure AD 身份验证。要通过 Azure AD 配置授权,必须执行以下操作:

  • 创建一个 Azure AD 应用程序注册,这是一个基于 Azure AD 的实体,表示身份或资源标识符(即,您想要保护的内容)。

  • 将 Azure AD 应用程序注册与需要身份验证的 Azure Functions 应用程序关联。

备注

对于 Azure Functions,创建 Azure AD 应用程序注册的最快方法是为服务启用 Azure AD 身份验证,如下所述。如果您使用的是 Azure 函数以外的远程服务,请使用 App registrations 页面为远程服务创建新的 Azure AD 应用程序注册。

有关应用程序注册的更多详细信息,请参阅 Microsoft 文档:

应用程序注册文档 (https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app)

为 Azure Functions 应用程序启用应用程序服务身份验证

在执行以下步骤之前,您应进入 Azure Functions 应用程序的 Function App 屏幕。

  1. 在左侧菜单窗格中,查找名为 Settings 的部分并点击 Authentication

    如果左侧边距显示 Developer 菜单(包含 Code + TestIntegration 等),并且屏幕底部有滚动条,请尝试向左滑动滚动条以返回到 Function AppApp Service 部分,然后查找 Settings

  2. 点击 Add identity provider 按钮。

  3. Identity provider 下拉菜单中,选择 Microsoft

  4. 对于 App registration type,选择 Create new app registration

  5. Name 字段中,键入应用程序的名称。

  6. 对于 Supported account types,选择 Current tenant - Single tenant

  7. 对于 Restrict access,选择 Require authentication

  8. 对于 Unauthenticated requests,选择 HTTP 401 Unauthorized

  9. 点击 Next: Permissions。检查权限。

  10. 点击 Add。新的 Azure AD 应用程序创建完毕,并显示应用程序页面。

  11. 点击显示应用程序名称的链接,可转到 Azure AD 应用程序的页面。

  12. 查找 Application (client) ID 字段。

    将此 ID 记录在跟踪工作表的 Azure Function App AD Application ID 字段中。

    重要

    确保您复制的是 ID,而不是 Azure AD 应用程序名称。ID 应包含 UUID。

下一步

第 2 步:在门户中创建代理服务(Azure API 管理服务)

语言: 中文