---
name: azion-instale-a-integracao-upstash-rate-limiting
description: >-
  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.
---

# Instale a integração Upstash Rate Limiting

Você instala a integração Upstash Rate Limiting pelo Azion Marketplace e a executa em um [Firewall](/pt-br/documentacao/plataforma/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](/pt-br/documentacao/guias/plataforma/conta-e-billing/como-acessar-o-azion-console/).
- Uma aplicação servida por um [workload](/pt-br/documentacao/plataforma/workloads/), cujo deployment você vincula ao firewall na última seção.
- Uma [conta na Upstash](https://console.upstash.com/).
- Um Global Database, criado no [Upstash Console](https://console.upstash.com/). A URL e o token dele são argumentos da instância de função.
- A [Azion CLI](/pt-br/documentacao/devtools/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](/pt-br/documentacao/fundamentos/precos/).

---

## Instale a integração

A função é instalada uma vez por conta. Para instalá-la:

1. **Abra Marketplace**

   Acesse [Azion Console](https://console.azion.com/) > **Marketplace**.

2. **Encontre a integração**

   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.

3. **Selecione Install**

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:

1. **Abra a página Firewalls**

   Acesse [Azion Console](https://console.azion.com/) > **Firewalls** e crie um firewall.

2. **Dê um nome ao firewall**

   Na seção **General**, digite um **Name**. Por exemplo: `rate-limiting-firewall`.

3. **Ative o módulo Functions**

   Na seção **Modules**, ative o switch **Functions**.

4. **Salve o firewall**

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](/pt-br/documentacao/guias/seguranca-de-aplicacoes/firewall-e-waf/firewall-definir-main-settings/).

---

## Crie a instância de função

A instância guarda suas credenciais da Upstash e as janelas de rate limit. Para criá-la:

1. **Abra a aba Functions Instances**

   Em **Firewalls**, selecione seu firewall e a aba **Functions Instances**.

2. **Selecione + Function**

   Um firewall sem nenhuma instância mostra a mesma ação como **Function Instance**. O drawer **Create Instance** é aberto.

3. **Dê um nome à instância**

   Em **Name**, digite um nome. Por exemplo: `upstash-rate-limiting`.

4. **Selecione a função instalada**

   Em **Function**, selecione a função Upstash Rate Limiting. A lista contém apenas as funções que são executadas em um firewall.

5. **Insira os argumentos**

   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.

6. **Selecione Save**

A instância aparece na aba **Functions Instances**.

### Argumentos

A instância recebe suas credenciais da Upstash e suas variáveis:

```json
{
  "upstash_redis_rest_url": "https://your-database.upstash.io",
  "upstash_redis_rest_token": "Your upstash token",
 "rate_limit_prefix": "my_rate_limit",
  "rate_limit_key_metadata": [
	"remote_addr"
  ],
  "rate_limit_key_header": [
	"x-a-custom-header"
  ],
  "rate_limit_key_hostname": true,
  "rate_limit_repenalize": true,
  "rate_limits": [	
	{
  	      "algorithm": "sliding_window",
  	      "requests": 2,
  	      "interval": "20 s",
  	      "start": "00:00",
  	      "end": "12:00",
  	      "penalty_in_seconds": 45
	},
	{
  	      "algorithm": "fixed_window",
  	      "requests": 3,
  	      "interval": "120 s",
  	      "start": "12:01",
  	      "end": "23:00",

	},
       {
  	    "algorithm": "token_bucket",
  	    "refil_rate": 5,
  	    "max_tokens": 5,
  	    "interval": "10 s",
           "start": "23:01",
            "penalty_in_seconds": 55
	}
  ]
}
```

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

> **nota**
>
> A chave de um rate limit é a combinação de todas essas variáveis. Neste exemplo de código, a chave final é:
> `my_rate_limit + User IP + X-a-custom-reader Value + Hostname used in the request`.
>
> Exemplo:
> `my_rate_limit_127.0.0.1_Value_azion.com`.

#### 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 `start` não for definido, o valor padrão é `00:00`. Se `end` nã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_seconds` estiver vazio, o rate limit não aplica penalidade e funciona como um rate limit simples.

A variável `algorithm` aceita três valores:

- `fixed_window` divide o tempo em durações fixas, ou janelas.
- `sliding_window` parte 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_bucket` define 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.

```json
"algorithm": "token_bucket",
  	    "refil_rate": 5,
  	    "max_tokens": 5,
  	    "interval": "10 s",
           "start": "23:01",
            "penalty_in_seconds": 55
```

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](/pt-br/documentacao/plataforma/firewall/rules-engine/) seleciona as requisições que chegam à instância, por meio de um behavior **Run Function**. Para criar a regra:

1. **Abra a aba Rules Engine**

   Em **Firewalls**, selecione seu firewall e a aba **Rules Engine**.

2. **Selecione + Rule**

3. **Dê um nome à regra**

   Em **Name**, digite um nome. Por exemplo: `Run Upstash Rate Limiting`.

4. **Defina o critério**

   Na seção **Criteria**, selecione os domínios que executam a integração. Por exemplo: if `Host` *matches* `yourdomain.com`.

5. **Adicione o behavior Run Function**

   Na seção **Behaviors**, selecione **Run Function** e selecione a instância pelo nome que você deu a ela.

6. **Selecione Save**

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:

```bash
azion create workload-deployment --workload-id <workload-id> --name <deployment-name> \
  --application-id <application-id> --firewall-id <firewall-id> --strategy-type default \
  --active true --current true
```

O comando exibe o id do novo deployment:

```text
Created Workload Deployment with ID 123456
```

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.

[How to Install Upstash Rate Limiting](https://www.youtube.com/watch?v=3qsiKK2GzRw)

Esta integração permite controlar o tráfego de entrada antes que ele chegue à sua origem e proteger suas aplicações.

---

## Próximos passos

- [Integrações do Marketplace](/pt-br/documentacao/plataforma/marketplace/integracoes.md): Todas as integrações que Azion Marketplace oferece e onde cada uma é executada.
- [Rules Engine for Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine.md): Todos os critérios e behaviors que uma regra de firewall aceita.
- [Atualize uma integração](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/atualizar-uma-integracao.md): Leve uma integração instalada para a versão mais recente.
