Instale a integração Upstash Rate Limiting
Instale Upstash Rate Limiting pelo Azion Marketplace e execute-a em um firewall para limitar requisições por janela e penalizar quem excede o limite.
Você instala a integração Upstash Rate Limiting pelo Azion Marketplace e a executa em um Firewall, pelo Azion Console. A integração limita o tráfego de entrada para evitar gargalos, gerenciar picos de tráfego e proteger suas aplicações contra ameaças como DDoS, fuzzing ou ataques de força bruta. Ela usa a biblioteca upstash/ratelimit e conta o rate limit de forma global: soma as requisições recebidas em toda a infraestrutura distribuída da Azion, em vez de contá-las separadamente em cada localização.
Cinco objetos precisam existir antes que uma requisição seja contada: a função instalada, um firewall com o módulo Functions, uma instância de função com os argumentos, uma regra do Rules Engine com o behavior Run Function e um deployment de workload vinculado ao firewall. Cada seção abaixo cria um deles.
Pré-requisitos
- Uma conta Azion. Para entrar, consulte Como acessar o Azion Console.
- Uma aplicação servida por um workload, cujo deployment você vincula ao firewall na última seção.
- Uma conta na Upstash.
- Um Global Database, criado no Upstash Console. A URL e o token dele são argumentos da instância de função.
- A Azion CLI instalada e autorizada, para a última seção.
- Ativar um produto ou um módulo pode gerar custos de uso. Para mais informações, consulte Preços.
Instale a integração
A função é instalada uma vez por conta. Para instalá-la:
Acesse Azion Console > Marketplace.
Digite Upstash Rate Limiting no campo Search on Marketplace e selecione o card da integração. Navegar pelos cards e pelas categorias leva à mesma página.
O card mostra Successfully installed! e Latest version installed!, e a função aparece na lista Function do drawer Create Instance.
Crie o firewall
O firewall é onde a função é instanciada e onde fica a regra que a executa. Para criar um:
Acesse Azion Console > Firewalls e crie um firewall.
Na seção General, digite um Name. Por exemplo: rate-limiting-firewall.
Na seção Modules, ative o switch Functions.
O firewall mostra a aba Functions Instances enquanto o módulo Functions estiver ativo. Para usar um firewall existente, ative o módulo Functions dele e salve-o. Para todas as configurações deste formulário, consulte Defina as configurações principais de um firewall.
Crie a instância de função
A instância guarda suas credenciais da Upstash e as janelas de rate limit. Para criá-la:
Em Firewalls, selecione seu firewall e a aba Functions Instances.
Um firewall sem nenhuma instância mostra a mesma ação como Function Instance. O drawer Create Instance é aberto.
Em Name, digite um nome. Por exemplo: upstash-rate-limiting.
Em Function, selecione a função Upstash Rate Limiting. A lista contém apenas as funções que são executadas em um firewall.
Em Arguments, o editor vem preenchido com os argumentos padrão da integração em JSON. Insira suas credenciais da Upstash e suas variáveis, como descreve a próxima seção.
A instância aparece na aba Functions Instances.
Argumentos
A instância recebe suas credenciais da Upstash e suas variáveis:
| Variável | Descrição |
|---|---|
upstash_redis_rest_url | A URL do seu banco de dados na Upstash, que armazena os dados de rate limit e de penalidade |
upstash_redis_rest_token | Seu token de acesso à API da Upstash |
rate_limit_prefix | O prefixo de toda chave de rate limit. Use-o para evitar sobreposição entre instâncias diferentes da função |
rate_limit_key_metadata | As variáveis de metadados que geram a chave de rate limit na plataforma da Azion |
rate_limit_key_header | Os headers que geram a chave de rate limit na plataforma da Azion |
rate_limit_key_hostname | Se true, a URL gera a chave de rate limit |
rate_limit_repenalize | Se true, o tempo de penalidade é recalculado toda vez que um usuário penalizado faz uma requisição |
rate_limits | As janelas de rate limit, como objetos. Você precisa adicionar pelo menos um objeto |
algorithm | O algoritmo de rate limit a aplicar. Valores possíveis: fixed_window, sliding_window, token_bucket |
requests | O número máximo de requisições até que o rate limit seja atingido |
interval | O intervalo de tempo da janela de rate limit. Segue o padrão da Upstash XXXX y, em que X é o número e y é a unidade: s para segundos ou m para minutos. Exemplo: 120 s |
start e end | A janela de tempo, no formato de 24 horas e no fuso horário UTC |
penalty_in_seconds | O tempo de penalidade, um bloqueio que retorna o código de status 403, aplicado aos usuários que violam o rate limit |
Janelas e algoritmos de rate limit
Você pode definir janelas de rate limit diferentes para períodos diferentes do dia. Por exemplo: um limite de 10 requests/minute das 00:00 às 12:00 e de 15 requests/minute das 12:01 às 23:59.
- Se
startnão for definido, o valor padrão é00:00. Seendnão for definido, o valor padrão é23:59. - Se dois rate limits se sobrepõem, vale o primeiro nos argumentos JSON.
- Se
penalty_in_secondsestiver vazio, o rate limit não aplica penalidade e funciona como um rate limit simples.
A variável algorithm aceita três valores:
fixed_windowdivide o tempo em durações fixas, ou janelas.sliding_windowparte da janela fixa, mas usa uma janela móvel. Por exemplo: para um rate limit de 10 requisições por minuto, o tempo é dividido em fatias de 1 minuto, como no algoritmo de janela fixa.token_bucketdefine o número máximo de tokens que enchem um bucket e o intervalo em que o bucket é esvaziado. Cada requisição remove um token. Se não houver token restante, a requisição é rejeitada.
O algoritmo token_bucket recebe mais duas variáveis:
max_tokens: o número de tokens, ou chaves, que o rate limit permite.refil_rate: o número de buckets esvaziados a cada intervalo de tempo.
Neste exemplo, 5 buckets são esvaziados a cada 10 seconds, de um máximo de 5 "busy" buckets.
Crie a regra
A instância não conta nada até que uma regra a execute. Uma regra do Rules Engine for Firewall seleciona as requisições que chegam à instância, por meio de um behavior Run Function. Para criar a regra:
Em Firewalls, selecione seu firewall e a aba Rules Engine.
Em Name, digite um nome. Por exemplo: Run Upstash Rate Limiting.
Na seção Criteria, selecione os domínios que executam a integração. Por exemplo: if Host matches yourdomain.com.
Na seção Behaviors, selecione Run Function e selecione a instância pelo nome que você deu a ela.
O firewall executa a instância em toda requisição ao domínio do critério.
Vincule o firewall ao workload
O vínculo fica no deployment do workload, então crie um deployment que indique a aplicação e o firewall:
O comando exibe o id do novo deployment:
As requisições ao domínio do workload chegam ao firewall, e a regra executa a instância de Upstash Rate Limiting em cada uma.
Como funciona
A integração aplica uma configuração de penalidade que verifica a validade de cada requisição:
- Se a requisição não é válida, a função a bloqueia e retorna o código de status
403 Forbidden. - Se a requisição é válida, a função a conta. Quando a contagem atinge o rate limit, a função interrompe a requisição e retorna o código de status
429 Too Many Requests.
Assista a um tutorial sobre rate limiting com penalidade na Azion e no Upstash DB no canal da Azion no YouTube.