乐趣区

关于azure:生态扩大进行中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 创立逻辑分区。
    2. 用你抉择的 URL 创立一个 function 利用。
  3. 在 VSCode 编辑器中装置 Azure Functions 插件。装置后,通过插件认证,并装置 azure function core tool,用于本地开发。

    npm install -g azure-functions-core-tools@3 --unsafe-perm true
  4. 将上面的代码段部署到咱们方才通过 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_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 端点提出申请,如下所示:

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 来分享你的意见,也能够在咱们的邮件列表中分享开发新插件的倡议!

退出移动版