Integração do Apache APISIX com o Azure Serverless

API7.ai

December 1, 2021

Ecosystem

Integração do Apache APISIX com o Azure Serverless

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.

  1. 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.

  2. 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).

    1. Primeiro, crie um grupo de recursos para particionar logicamente o FaaS que você vai criar. Criar um grupo de recursos
    2. Crie um aplicativo de função com a URL de sua escolha (vou escolher test-apisix). Criar um aplicativo de função
  3. 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
    
  4. 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

NomeTipoObrigatórioPadrãoVálidoDescrição
function_uristringobrigatórion/an/aO endpoint do Azure Function que aciona o código da função serverless (por exemplo, http://test-apisix.azurewebsites.net/api/HttpTrigger).
authorizationobjectopcionaln/an/aCredenciais de autorização para acessar a função de nuvem.
authorization.apikeystringopcionaln/an/aCampo dentro de authorization. A chave de API gerada para autorizar solicitações a esse endpoint.
authorization.clientidstringopcionaln/an/aCampo dentro de authorization. O Client ID (Azure Active Directory) para autorizar solicitações a esse endpoint.
timeoutintegeropcional3000[100,...]Tempo limite da solicitação de proxy em milissegundos.
ssl_verifybooleanopcionaltruetrue/falseSe habilitado, realiza a verificação SSL do servidor.
keepalivebooleanopcionaltruetrue/falsePara reutilizar a mesma conexão de proxy no futuro próximo. Defina como false para desabilitar keepalives e fechar imediatamente a conexão.
keepalive_poolintegeropcional5[1,...]O número máximo de conexões no pool.
keepalive_timeoutintegeropcional60000[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.

NomeTipoObrigatórioPadrãoVálidoDescrição
master_apikeystringopcional""n/aA chave de API mestra que pode ser usada para acessar o URI do Azure Function.
master_clientidstringopcional""n/aO 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 ou x-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!

Tags: