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。
- 首先进入 Azure 并设置一个试用打算,最多可收费调用 100 万次。要理解更多对于定价的状况,请拜访这里。
-
拜访 Azure Portal。
- 首先,创立一个资源组,为 FAAS 创立逻辑分区。
- 用你抉择的 URL 创立一个 function 利用。
- 首先,创立一个资源组,为 FAAS 创立逻辑分区。
-
在 VSCode 编辑器中装置 Azure Functions 插件。装置后,通过插件认证,并装置 azure function core tool,用于本地开发。
npm install -g azure-functions-core-tools@3 --unsafe-perm true
-
将上面的代码段部署到咱们方才通过 VSCode 中的 Azure Functions 扩大面板创立的同一个 function 利用中。
module.exports = async function (context, req) {context.log('HTTP trigger invoked on Test-APISIX.') const name = req.query.name || (req.body && req.body.name) const responseMessage = name ? 'Hello,' + name : 'This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response.' context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage, } }
这个代码段从查问参数中获取用户名字(如果不存在,则从申请体中获取)并向用户问好。
启用 azure-functions 插件
上面咱们将通过一个示例为大家阐明如何为一个特定的路由启用 azure-functions
插件。咱们假如你的 HTTP Trigger 曾经部署并筹备好提供服务。
# enable plugin for a specific route
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"plugins": {"azure-functions": {"function_uri":"http://test-apisix.azurewebsites.net/api/HttpTrigger","authorization": {"apikey":"<Generated API key to access the Azure-Function>"}
}
},
"uri": "/azure"
}'
当初,任何对 Apache APISIX 网关上的 URI /azure
的申请(HTTP/1.1、HTTPS、HTTP2)都将触发对上述函数 URI 的 HTTP 调用,响应体与响应头和响应代码将被代理回给客户端。例如:
curl -i -XGET http://localhost:9080/azure\?name=Bisakh
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:55 GMT
Server: APISIX/2.10.2
Hello, Bisakh
思考到,Apache APISIX 也是在 config-default.yaml 上以 enable_http2: true
运行,端口为 9081,客户端和 Apache APISIX 代理之间的任何 HTTP/2
通信将被代理到 azure faas,相似于 HTTP/1.1,响应将被代理回给客户端,并有适当的题目,例如:
curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh
HTTP/2 200
content-type: text/plain; charset=utf-8
request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:56 GMT
server: APISIX/2.10.2
Hello, Bisakh
停用 azure-functions 插件
如果须要停用 azure-functions 该插件,只需在插件配置中删除相应的 JSON 配置,禁用 azure-functions
插件,并增加适合的上游配置。Apache APISIX 插件是热加载的,因而不须要重新启动 Apache APISIX。
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"uri":"/azure","plugins": {},"upstream": {"type":"roundrobin","nodes": {"127.0.0.1:1980": 1}
}
}'
自定义配置
在启用 azure-functions
插件创立新路由时,在最小的配置中,function_uri
是插件配置的强制性属性,指向函数的 URL。有很多额定的选项,能够通过插件参数和元数据参数进行调整。
插件参数解释
名称 | 类型 | 必填 | 默认值 | 有效值 | 形容 |
---|---|---|---|---|---|
function_uri | string | 是 | n/a | n/a | 触发 serverless functions 代码的 azure functions 端点(例如:http://test-apisix.azurewebsi…)。 |
authorization | object | 否 | n/a | n/a | 拜访云 functions 的受权凭证。 |
authorization.apikey | string | 否 | n/a | n/a | 受权内的字段。生成 API 密钥来受权对该端点的申请。 |
authorization.clientid | string | 否 | n/a | n/a | 受权内的字段。客户端 ID(azure active directory),用于受权对该端点的申请。 |
timeout | integer | 否 | 3000 | [100,…] | 代理申请超时,以毫秒为单位。 |
ssl_verify | boolean | 否 | true | true/false | 是否启用执行服务器的 SSL 验证。 |
keepalive | boolean | 否 | true | true/false | 是否重复使用同一个代理连贯。设置为 false 则禁用 keepalives 并立刻敞开连贯。 |
keepalive_pool | integer | 否 | 5 | [1,…] | 池中的最大连接数。 |
keepalive_timeout | integer | 否 | 60000 | [1000,…] | 最大的闲暇超时,以毫秒为单位。 |
这为严格束缚 azure FAAS 的行为提供了很大的灵活性 – 从配置超时到 keepalive 池以及验证无服务器 FAAS 的 SSL 证书。说实话,当波及到无服务器时,这实际上意味着很多,因为服务是事件驱动的,而且资源是由云提供商即时调配的。
Metadata 参数解释
同样,有一些属性能够通过应用元数据进行调整。
名称 | 类型 | 必填 | 默认值 | 有效值 | 形容 |
---|---|---|---|---|---|
master_apikey | string | 否 | “” | n/a | 可用于拜访 azure functions URI 的 API KEY。 |
master_clientid | string | 否 | “” | n/a | 可用于受权 function URI 的客户 ID(active directory)。 |
azure-functions
插件的元数据提供了受权回退的性能。它定义了 master_apikey
和 master_clientid
(azure active directory client id),用户能够为要害工作的利用部署定义主 API 密钥或客户端 ID。因而,如果在插件属性中没有找到受权细节,元数据中的受权细节就会启动。
优先级排序如下
- 首先,该插件在 Apache APISIX 代理的申请头中寻找
x-functions-key
或x-functions-clientid
键。 - 如果没有找到,azure-functions 插件会查看插件属性中的受权细节。如果存在,它会将相应的标头增加到发送到 Azure cloud function 的申请中。
- 如果在插件属性中没有找到受权细节,Apache APISIX 将为该插件获取元数据配置并应用主密钥。
要增加一个新的主 APIKEY,请用更新的元数据向 /apisix/admin/plugin_metadata
端点提出申请,如下所示:
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"master_apikey":"<Your azure master access key>"}'
总结
azure-functions
插件是 Apache APISIX 为 serverless 设计的第二个插件。咱们正在开发其余 serverless 插件,并会在行将公布的 Apache APISIX 版本中介绍这些插件。如果大家感兴趣,请提交 Issue 来分享你的意见,也能够在咱们的邮件列表中分享开发新插件的倡议!