Plugin Serverless do Apache APISIX para Event Hooks
February 15, 2023
Apache APISIX é um gateway de API de alto desempenho e código aberto, construído sobre o Nginx. Uma de suas funcionalidades mais poderosas é a capacidade de criar funções serverless, que são programas pequenos e sem estado que podem estender a funcionalidade do Apache APISIX. Neste artigo, abordaremos o básico do plugin serverless do Apache APISIX e como ele pode ser usado para acionar funções serverless em resposta a eventos.
Objetivos de aprendizagem
Você aprenderá o seguinte ao longo do artigo:
- O que é o plugin serverless do Apache APISIX?
- Como o plugin serverless funciona e como usá-lo?
- Casos de uso do plugin serverless.
- Como você pode usar o plugin serverless para integrar com um webhook.
O que é o plugin serverless do Apache APISIX?
O plugin serverless do Apache APISIX para ganchos de eventos permite que você escreva funções serverless e as integre ao gateway de API. O plugin oferece uma maneira simples e flexível de executar código personalizado em resposta a eventos, sem a necessidade de gerenciar a infraestrutura subjacente.
O plugin serverless separa a lógica para lidar com eventos em funções serverless distintas, o que permite simplificar a arquitetura da sua API e facilitar o gerenciamento. O Apache APISIX oferece suporte para frameworks serverless de provedores de nuvem populares, como Azure Functions e AWS Lambda.
Como usar o plugin serverless?
Para usar o plugin serverless do Apache APISIX para ganchos de eventos, você precisará escrever um código de função serverless na linguagem de programação Lua que implemente a lógica que deseja executar em resposta a um evento e habilitar o plugin serverless-pre-function
ou serverless-post-function
, dependendo das fases do ciclo de solicitação-resposta de sua escolha.
Atualmente, o APISIX suporta apenas Lua para escrever um código de função. Se você preferir outras linguagens de programação, pode sempre usar plugin runners para criar um novo plugin personalizado do zero.
Casos de uso do plugin serverless
Aqui estão alguns casos de uso para o plugin serverless do Apache APISIX para ganchos de eventos:
-
Roteamento Dinâmico: O plugin serverless pode ser usado para rotear dinamicamente solicitações de API recebidas com base em critérios específicos, como o método da solicitação, o caminho da URL ou os valores dos cabeçalhos. Isso permite implementar cenários de roteamento complexos sem a necessidade de modificar a configuração subjacente do Apache APISIX.
-
Autenticação e Autorização: Você pode usar o plugin serverless para implementar verificações de autenticação e autorização para sua API. Por exemplo, você pode escrever uma função serverless que verifica a presença de uma chave de API válida nos cabeçalhos da solicitação antes de permitir que a solicitação continue. Ou pode ser usado como um serviço de autorização externa em combinação com o plugin forward-auth.
-
Transformação de Solicitação: O plugin serverless pode ser usado para transformar solicitações de API recebidas antes que sejam processadas pelo serviço de backend. Por exemplo, você pode escrever uma função serverless que modifica os cabeçalhos ou o corpo da solicitação para corresponder ao formato esperado pelo serviço de backend.
-
Transformação de Resposta: Você também pode usar o plugin serverless para transformar a resposta do serviço de backend antes que ela seja enviada de volta ao cliente. Por exemplo, você pode escrever uma função serverless que modifica os cabeçalhos ou o corpo da resposta para corresponder ao formato esperado pelo cliente.
-
Registro e Monitoramento: Você pode usar o plugin serverless para implementar registro e monitoramento para sua API. Por exemplo, você pode escrever uma função serverless que registra informações detalhadas sobre cada solicitação de API, como o método da solicitação, URL, cabeçalhos e corpo, para análise posterior.
Integrando o Apache APISIX com webhooks (Demo)
Para integrar o Apache APISIX com webhooks, você precisa criar uma função serverless que escuta solicitações POST recebidas no endpoint da URL, verifica se o método da solicitação é POST e envia uma notificação de webhook para o serviço de terceiros sempre que uma nova mensagem for postada.
A função serverless também deve retornar a resposta do webhook, para que você possa ver o status do webhook e quaisquer mensagens de erro se algo der errado. Em ambos os casos, o APISIX pode se comunicar com o serviço de destino, informando ao destino que um evento foi acionado chamando uma URL fornecida com informações sobre esse evento.
Pré-requisitos
- Docker instalado em sua máquina para executar o APISIX.
- Conhecimento básico sobre alguns conceitos principais do APISIX, como Rota, Upstream e Plugin.
Configuração do projeto
A primeira coisa é clonar o repositório do projeto apisix-docker do GitHub:
git clone https://github.com/apache/apisix-docker.git
Abra a pasta do projeto no seu editor de código favorito. Este tutorial utiliza o VS Code.
Instalar e executar o Apache APISIX
Para executar o Apache APISIX, siga estes passos:
Abra uma nova janela do terminal e execute o comando docker compose up
na pasta raiz do projeto:
docker compose up -d
O comando acima executará o Apache APISIX e o etcd juntos com o Docker.
Instalamos o APISIX usando Docker nesta demonstração. No entanto, existem outras opções para instalá-lo no guia de instalação.
Configurar a função serverless no Apache APISIX
Para configurar a função serverless no Apache APISIX, você precisa criar uma nova rota para o endpoint e configurar o plugin serverless com nosso código de função personalizado em Lua.
Aqui está um exemplo de uma função serverless em Lua que escuta solicitações POST recebidas no endpoint e envia uma notificação de webhook:
function webhook(conf, ctx)
-- Importar bibliotecas necessárias
local http = require("resty.http")
local core = require("apisix.core")
-- Enviar a notificação de webhook apenas se o método da solicitação for POST, caso contrário, pular e enviar para o upstream como de costume
if core.request.get_method() == "POST" then
-- Enviar a notificação de webhook para a URL especificada
local httpc = http.new()
local res, err = httpc:request_uri("http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d", {
method = "POST",
headers = {
["Content-Type"] = "application/json"
},
body = core.request.get_body(),
})
-- Verificar a resposta do webhook
if not res then
core.log.error("Falha ao enviar webhook: ", err)
return 500, err
end
end
-- Retornar a resposta do serviço upstream
return conf.status, conf.body
end
Como você pode ver no código de exemplo da função webhook acima, ele faz solicitações POST JSON para uma URL fornecida com o corpo da solicitação (o corpo da solicitação do cliente para o Gateway de API) como carga útil. O site de teste de webhooks é usado para simular nosso endpoint de webhook: https://webhook.site.
Para criar e configurar seu endpoint de webhook:
- Gere uma URL navegando até https://webhook.site no seu navegador.
- Selecione Copiar para a área de transferência ao lado de Sua URL única.
- Cole-a no método request_uri da solicitação HTTP no código da função.
Além disso, todas as outras solicitações, incluindo POST, serão encaminhadas para o serviço upstream. No próximo passo, configuramos uma rota e um upstream.
Configurar uma Rota e Upstream
Agora criaremos uma nova rota com o plugin de função serverless habilitado e um upstream que atua como nosso serviço de backend.
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-H 'Content-Type: application/json' \
-d '{
"uri": "/post",
"plugins": {
"serverless-pre-function": {
"phase": "rewrite",
"functions" : ["
return function(conf, ctx)
-- Importar bibliotecas necessárias
local http = require(\"resty.http\")
local core = require(\"apisix.core\")
-- Enviar a notificação de webhook apenas se o método da solicitação for POST, caso contrário, pular e enviar para o upstream como de costume
if core.request.get_method() == \"POST\" then
-- Enviar a notificação de webhook para a URL especificada
local httpc = http.new()
local res, err = httpc:request_uri(\"http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d\", {
method = \"POST\",
headers = {
[\"Content-Type\"] = \"application/json\"
},
body = core.request.get_body(),
})
-- Verificar a resposta do webhook
if not res then
core.log.error(\"Falha ao enviar webhook: \", err)
return 500, err
end
end
-- Retornar a resposta do serviço upstream
return conf.status, conf.body
end"]
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'
No exemplo de configuração de rota anterior, criamos nossa primeira rota enviando uma solicitação curl
para a API Admin do APISIX. No corpo da solicitação da Rota, especificamos que qualquer solicitação para o caminho /post
acionará o código da função serverless e será encaminhada posteriormente para o destino httpbin.org
. Isso significa que a solicitação será roteada para o endpoint httpbin.org/post
após verificar se o método da solicitação é POST e se o evento deve ser enviado para o endpoint de webhook do serviço de terceiros ou não. O serviço de backend pode ser substituído pelo seu serviço de backend.
Você também pode notar que adicionamos o código da função nas propriedades functions
do serverless-pre-function
no objeto Json.
Testar a configuração
Finalmente, testamos chamando o endpoint /post
do Gateway de API para verificar se tudo funciona como esperado e o evento POST será enviado para o site de webhook.
curl -i http://127.0.0.1:9080/post -X POST -d \
'{
"message": "Uma nova mensagem de webhook"
}'
Depois, navegue até a URL do webhook na página https://webhook.site que você gerou nas etapas anteriores. Você deve ver uma solicitação POST, notificando nosso endpoint de webhook sobre o evento e enviando o corpo da solicitação.
Além disso, obtemos a resposta de volta do serviço de upstream simulado httpbin.org
:
HTTP/1.1 200 OK
Content-Type: application/json
{
...
"form": {
"{\n \"message\": \"Uma nova mensagem de webhook\"\n}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "127.0.0.1",
"X-Forwarded-Host": "127.0.0.1"
},
"json": null,
"url": "http://127.0.0.1/post"
}
Obviamente, se você enviar outros métodos de solicitações HTTP além de POST, o código da função serverless não acionará o endpoint de webhook.
Este é um exemplo básico de configuração de uma função serverless no Apache APISIX. Você pode estender essa funcionalidade adicionando lógicas mais complexas à sua função serverless, como acionar outra função em resposta a webhooks.
Conclusão
O plugin serverless do Apache APISIX para ganchos de eventos oferece uma maneira flexível e escalável de acionar funções serverless em resposta a eventos que ocorrem durante o processamento de solicitações de API. Ao usar o plugin, você pode simplificar a arquitetura da sua API, melhorar o desempenho e a confiabilidade dos seus serviços e reduzir o custo de gerenciamento da infraestrutura do seu aplicativo.
Recursos relacionados
Conteúdo recomendado
Comunidade
🙋 Junte-se à Comunidade do Apache APISIX 🐦 Siga-nos no Twitter 📝 Encontre-nos no Slack