azure-functions 插件发布,Apache APISIX 支持 Azure Functions 集成

Bisakh Mondal

更新时间 12/1/2021

Apache APISIX 支持 Azure Functions 集成

Apache APISIX 为 Microsoft Azure Functions 提供了对 serverless 框架的支持。Apache APISIX 建议定义一个启用了无服务器插件的路由,而不是在应用程序中采用硬编码函数 URL。它使开发者能够灵活地热更新函数 URI。此外,因为 Apache APISIX 有非常强大的认证支持,这种方法还可以减轻应用逻辑中的授权和认证问题,可以用来识别和授权客户消费者访问带有 FAAS 的特定路由。本文介绍了 Apache APISIX 最近新增的插件 azure-functions,并详细说明了如何将 Azure Functions(一种广泛使用的 serverless 解决方案)集成到 Apache APISIX 中。

azure-functions 插件工作原理

azure-functions 插件让用户为网关 URI 定义一个上游的 azure HTTP Trigger serverless 功能。如果启用,该插件将终止正在进行的对该 URI 的请求,并代表客户向 azure FAAS(新的上游)发起一个新的请求,其中包括用户设置的合适的授权细节、请求头、请求体、参数(这三个部分都是从原始请求中传递的),并将响应体、状态码和头返回给向 Apache APISIX 代理发出请求的原始客户。

该插件支持通过 API 密钥和 azure active directory 对 azure FAAS 服务进行授权。

如何在 Apache APISIX 中使用 azure-functions 插件

该插件的主要目标是将路由配置中指定的网关路由代理到 azure function URI 上。本节为您介绍如何在 azure 云上配置和创建 serverless HTTP Trigger。

  1. 首先进入 Azure 并设置一个试用计划,最多可免费调用 100 万次。要了解更多关于定价的情况,请访问这里

  2. 访问Azure Portal

    1. 首先,创建一个资源组,为 FAAS 创建逻辑分区。

    创建资源组

    1. 用你选择的 URL 创建一个 function 应用。

    创建一个 function 应用

  3. 在 VSCode 编辑器中安装 Azure Functions 插件。安装后,通过插件认证,并安装 azure function core tool,用于本地开发。

    1npm install -g azure-functions-core-tools@3 --unsafe-perm true
  4. 将下面的代码段部署到我们刚才通过 VSCode 中的 Azure Functions 扩展面板创建的同一个function 应用中。

    1module.exports = async function (context, req) {
    2context.log('HTTP trigger invoked on Test-APISIX.')
    3
    4const name = req.query.name || (req.body && req.body.name)
    5const responseMessage = name
    6    ? 'Hello, ' + name
    7    : 'This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response.'
    8
    9context.res = {
    10    // status: 200, /* Defaults to 200 */
    11    body: responseMessage,
    12}
    13}

这个代码段从查询参数中获取用户名字(如果不存在,则从请求体中获取)并向用户问好。

启用 azure-functions 插件

下面我们将通过一个示例为大家说明如何为一个特定的路由启用 azure-functions 插件。我们假设你的 HTTP Trigger 已经部署并准备好提供服务。

1# enable plugin for a specific route
2curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
3{
4    "plugins": {
5        "azure-functions": {
6            "function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger",
7            "authorization": {
8                "apikey": "<Generated API key to access the Azure-Function>"
9            }
10        }
11    },
12    "uri": "/azure"
13}'

现在,任何对 Apache APISIX 网关上的 URI /azure 的请求(HTTP/1.1、HTTPS、HTTP2)都将触发对上述函数 URI 的 HTTP 调用,响应体与响应头和响应代码将被代理回给客户端。例如:

1curl -i -XGET http://localhost:9080/azure\?name=Bisakh
2HTTP/1.1 200 OK
3Content-Type: text/plain; charset=utf-8
4Transfer-Encoding: chunked
5Connection: keep-alive
6Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
7Date: Wed, 19 Nov 2021 18:46:55 GMT
8Server: APISIX/2.10.2
9
10Hello, Bisakh

考虑到,Apache APISIX 也是在config-default.yaml上以 enable_http2: true 运行,端口为 9081,客户端和 Apache APISIX 代理之间的任何 HTTP/2 通信将被代理到 azure faas,类似于 HTTP/1.1,响应将被代理回给客户端,并有适当的标题,例如:

1curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh
2HTTP/2 200
3content-type: text/plain; charset=utf-8
4request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
5Date: Wed, 19 Nov 2021 18:46:56 GMT
6server: APISIX/2.10.2
7
8Hello, Bisakh

停用 azure-functions 插件

如果需要停用 azure-functions 该插件,只需在插件配置中删除相应的 JSON 配置,禁用azure-functions插件,并添加合适的上游配置。Apache APISIX 插件是热加载的,因此不需要重新启动 Apache APISIX。

1curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
2{
3    "uri": "/azure",
4    "plugins": {},
5    "upstream": {
6        "type": "roundrobin",
7        "nodes": {
8            "127.0.0.1:1980": 1
9        }
10    }
11}'

自定义配置

在启用 azure-functions 插件创建新路由时,在最小的配置中,function_uri 是插件配置的强制性属性,指向函数的 URL。有很多额外的选项,可以通过插件参数和元数据参数进行调整。

插件参数解释

名称类型必填默认值有效值描述
function_uristringn/an/a触发 serverless functions 代码的 azure functions Endpoint(例如:http://test-apisix.azurewebsites.net/api/HttpTrigger)。
authorizationobjectn/an/a访问云 functions 的授权凭证。
authorization.apikeystringn/an/a授权内的字段。生成API密钥来授权对该端点的请求。
authorization.clientidstringn/an/a授权内的字段。客户端ID(azure active directory),用于授权对该端点的请求。
timeoutinteger3000[100,...]代理请求超时,以毫秒为单位。
ssl_verifybooleantruetrue/false是否启用执行服务器的SSL验证。
keepalivebooleantruetrue/false是否重复使用同一个代理连接。设置为false则禁用keepalives并立即关闭连接。
keepalive_poolinteger5[1,...]池中的最大连接数。
keepalive_timeoutinteger60000[1000,...]最大的空闲超时,以毫秒为单位。

这为严格约束 azure FAAS 的行为提供了很大的灵活性--从配置超时到 keepalive 池以及验证无服务器FAAS 的 SSL 证书。说实话,当涉及到无服务器时,这实际上意味着很多,因为服务是事件驱动的,而且资源是由云提供商即时分配的。

Metadata 参数解释

同样,有一些属性可以通过使用元数据进行调整。

名称类型必填默认值有效值描述
master_apikeystring""n/a可用于访问 azure functions URI 的 API KEY。
master_clientidstring""n/a可用于授权 function URI的客户ID(active directory)。

azure-functions 插件的元数据提供了授权回退的功能。它定义了 master_apikeymaster_clientid (azure active directory client id),用户可以为关键任务的应用部署定义主 API 密钥或客户端 ID。因此,如果在插件属性中没有找到授权细节,元数据中的授权细节就会启动。

优先级排序如下

  • 首先,该插件在 Apache APISIX 代理的请求头中寻找 x-functions-keyx-functions-clientid 键。

  • 如果没有找到,azure-functions 插件会检查插件属性中的授权细节。如果存在,它会将相应的标头添加到发送到 Azure cloud function 的请求中。

  • 如果在插件属性中没有找到授权细节,Apache APISIX 将为该插件获取元数据配置并使用主密钥。

要添加一个新的主 APIKEY,请用更新的元数据向 /apisix/admin/plugin_metadata 端点提出请求,如下所示:

1curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
2-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
3{
4    "master_apikey" : "<Your azure master access key>"
5}'

总结

azure-functions 插件是 Apache APISIX 为 serverless 设计的第二个插件。我们正在开发其他 serverless 插件,并会在即将发布的 Apache APISIX 版本中介绍这些插件。如果大家感兴趣,请提交 Issue来分享你的意见,也可以在我们的邮件列表中分享开发新插件的建议!