Integração do Apache APISIX com o Azure Serverless
API7.ai
December 1, 2021
O Apache APISIX oferece suporte para frameworks serverless de fornecedores de nuvem populares (com mais a caminho). Em vez de codificar a URL da função diretamente no aplicativo, o Apache APISIX sugere definir uma rota com o plugin serverless habilitado. Isso dá aos desenvolvedores a flexibilidade de atualizar dinamicamente o URI da função, além de mudar completamente o fornecedor de FaaS para um provedor de nuvem diferente sem complicações. Além disso, essa abordagem mitiga preocupações de autorização e autenticação da lógica do aplicativo, pois o Apache APISIX possui um suporte robusto de autenticação que pode ser usado para identificar e autorizar clientes a acessar a rota específica com o FaaS. Este artigo fala sobre a recente adição de um novo plugin azure-functions
e fornece instruções detalhadas sobre como integrar o Azure Functions, uma solução serverless amplamente utilizada, ao conjunto serverless do Apache APISIX.
Como o plugin azure-functions funciona
O plugin azure-functions
permite que os usuários definam um upstream para a função serverless HTTP Trigger
do Azure para um URI de gateway. Se habilitado, este plugin interrompe a solicitação em andamento para aquele URI específico e inicia uma nova solicitação para o FaaS do Azure (o novo upstream) em nome do cliente, com os detalhes de autorização adequados definidos pelos usuários, cabeçalhos da solicitação, corpo da solicitação e parâmetros (todos esses três componentes são passados da solicitação original) e retorna o corpo da resposta, o código de status e os cabeçalhos de volta ao cliente original que invocou a solicitação ao agente do Apache APISIX.
O plugin suporta autorização ao serviço FaaS do Azure por meio de chaves de API e do Azure Active Directory.
Como usar o Azure Functions com o Apache APISIX
O objetivo principal do plugin é fazer o proxy da rota de gateway especificada na configuração da rota para o URI do Azure Functions. Esta seção fornece um guia prático sobre como configurar e criar um HTTP Trigger serverless na nuvem do Azure.
-
Primeiro, faça login/cadastro no Microsoft Azure e configure um plano de avaliação. O Azure Functions é gratuito para sempre até 1 milhão de invocações. Para saber mais sobre os preços, visite aqui.
-
Acesse o Portal do Azure (FYI, os serviços do Azure podem ser acessados via portal web, CLI e VSCode. Para facilidade, estamos usando o portal web).
- Primeiro, crie um grupo de recursos para particionar logicamente o FaaS que você vai criar.
- Crie um aplicativo de função com a URL de sua escolha (vou escolher test-apisix).
- Primeiro, crie um grupo de recursos para particionar logicamente o FaaS que você vai criar.
-
Instale a extensão Azure Functions no editor VSCode. Após a instalação, autentique-se via extensão e instale a ferramenta principal do Azure Functions para desenvolvimento local com:
npm install -g azure-functions-core-tools@3 --unsafe-perm true
-
Implante o seguinte snippet no mesmo aplicativo de função que acabamos de criar via painel de extensão do Azure Functions no VSCode:
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, }; };
Este snippet pega o nome dos parâmetros de consulta (se presente, caso contrário, do corpo da solicitação) e cumprimenta o usuário.
Ativar o plugin azure-functions
A seguir está um exemplo de como habilitar o plugin azure-functions para uma rota específica. Estamos assumindo que seu HTTP Trigger está implantado e pronto para ser servido.
# habilitar o plugin para uma rota específica
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": "<Chave de API gerada para acessar o Azure-Function>"
}
}
},
"uri": "/azure"
}'
Agora, qualquer solicitação (HTTP/1.1, HTTPS, HTTP2) para o URI /azure
no gateway do Apache APISIX acionará uma invocação HTTP ao URI da função mencionado, e o corpo da resposta, junto com os cabeçalhos e o código de resposta, será repassado ao cliente. Por exemplo (aqui a função de nuvem do Azure apenas pega o parâmetro de consulta name
e retorna Hello $name
):
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
Considerando que o Apache APISIX também está sendo executado com enable_http2: true
no config-default.yaml para a porta 9081 (digamos), qualquer comunicação HTTP/2
entre o cliente e o agente APISIX será repassada para o FaaS do Azure de forma semelhante ao HTTP/1.1, e as respostas serão repassadas ao cliente com os cabeçalhos apropriados. Por exemplo:
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
Desativar o plugin azure-functions
Agora, para desabilitar o plugin, basta remover a configuração JSON correspondente na configuração do plugin para desabilitar o plugin azure-functions
e adicionar a configuração de upstream adequada. Os plugins do Apache APISIX são recarregados dinamicamente, portanto, não há necessidade de reiniciar o 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
}
}
}'
Configuração Personalizada
Em uma configuração mínima ao criar uma nova rota com o plugin azure-functions
habilitado, function_uri
é o atributo obrigatório da configuração do plugin que aponta para a URL da função. Há muitas opções adicionais que podem ser ajustadas com o esquema do plugin e o esquema de metadados.
Esquema do Plugin
Nome | Tipo | Obrigatório | Padrão | Válido | Descrição |
---|---|---|---|---|---|
function_uri | string | obrigatório | n/a | n/a | O endpoint do Azure Function que aciona o código da função serverless (por exemplo, http://test-apisix.azurewebsites.net/api/HttpTrigger). |
authorization | object | opcional | n/a | n/a | Credenciais de autorização para acessar a função de nuvem. |
authorization.apikey | string | opcional | n/a | n/a | Campo dentro de authorization. A chave de API gerada para autorizar solicitações a esse endpoint. |
authorization.clientid | string | opcional | n/a | n/a | Campo dentro de authorization. O Client ID (Azure Active Directory) para autorizar solicitações a esse endpoint. |
timeout | integer | opcional | 3000 | [100,...] | Tempo limite da solicitação de proxy em milissegundos. |
ssl_verify | boolean | opcional | true | true/false | Se habilitado, realiza a verificação SSL do servidor. |
keepalive | boolean | opcional | true | true/false | Para reutilizar a mesma conexão de proxy no futuro próximo. Defina como false para desabilitar keepalives e fechar imediatamente a conexão. |
keepalive_pool | integer | opcional | 5 | [1,...] | O número máximo de conexões no pool. |
keepalive_timeout | integer | opcional | 60000 | [1000,...] | O tempo limite de inatividade máximo (ms). |
Isso oferece muita flexibilidade para ajustar o comportamento do FaaS do Azure - desde configurar o tempo limite até o pool de keepalive e validar o certificado SSL do FaaS serverless. Para ser honesto, isso significa muito quando se trata de serverless, pois os serviços são orientados por eventos e os recursos são alocados pelo provedor de nuvem dinamicamente.
Esquema de Metadados
Da mesma forma, há alguns atributos que podem ser ajustados usando os metadados.
Nome | Tipo | Obrigatório | Padrão | Válido | Descrição |
---|---|---|---|---|---|
master_apikey | string | opcional | "" | n/a | A chave de API mestra que pode ser usada para acessar o URI do Azure Function. |
master_clientid | string | opcional | "" | n/a | O Client ID (Active Directory) que pode ser usado para autorizar o URI da função. |
Os metadados para o plugin azure-functions
fornecem a funcionalidade de fallback de autorização. Ele define master_apikey
e master_clientid
(client ID do Azure Active Directory) onde os usuários (opcionalmente) podem definir a chave de API mestra ou o Client ID para implantações de aplicativos críticos. Portanto, se nenhum detalhe de autorização for encontrado dentro do atributo do plugin, os detalhes de autorização presentes nos metadados entram em ação.
A ordem de prioridade relativa é a seguinte:
- Primeiro, o plugin procura pelas chaves
x-functions-key
oux-functions-clientid
dentro do cabeçalho da solicitação para o agente do Apache APISIX. - Se não forem encontradas, o plugin azure-functions verifica os detalhes de autorização dentro dos atributos do plugin. Se presentes, ele adiciona o cabeçalho respectivo à solicitação enviada para a função de nuvem do Azure.
- Se nenhum detalhe de autorização for encontrado dentro dos atributos do plugin, o Apache APISIX busca a configuração de metadados para este plugin e usa as chaves mestras.
Para adicionar uma nova chave de API mestra, faça uma solicitação ao endpoint /apisix/admin/plugin_metadata com os metadados atualizados da seguinte forma:
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"master_apikey" : "<Sua chave de acesso mestra do Azure>"
}'
Resumo
O plugin azure-functions
é o segundo plugin do Apache APISIX projetado para serverless. Estamos desenvolvendo outros plugins serverless e os apresentaremos com os próximos lançamentos do Apache APISIX. Se você estiver interessado, não hesite em abrir uma issue para compartilhar suas opiniões. Você também pode discutir suas propostas de desenvolvimento de um novo plugin em nossa lista de discussão!