---
name: azion-migre-da-cloudflare-para-a-azion
description: >-
  Migre um projeto da Cloudflare para a Azion: faça o deploy, recrie Workers, regras e cache, mova dados de KV, R2 e D1 e troque o DNS.
---

# Migre da Cloudflare para a Azion

Um projeto na Cloudflare se distribui entre builds do Pages, Workers, arquivos de roteamento, namespaces KV, buckets R2, bancos de dados D1, regras de segurança e DNS. Movê-lo significa recriar cada um desses itens na Azion e confirmar que o projeto responde corretamente antes da mudança de DNS.

Na Azion, uma [aplicação](/pt-br/documentacao/plataforma/applications/) e suas regras assumem a entrega, o roteamento e o cache. [Functions](/pt-br/documentacao/plataforma/functions/) executa o código dos Workers. [KV Store](/pt-br/documentacao/plataforma/kv-store/), [Object Storage](/pt-br/documentacao/plataforma/object-storage/) e [SQL Database](/pt-br/documentacao/plataforma/sql-database/) guardam os dados. [Firewall](/pt-br/documentacao/plataforma/firewall/) filtra o tráfego, um [workload](/pt-br/documentacao/plataforma/workloads/) atende o domínio e [Edge DNS](/pt-br/documentacao/plataforma/edge-dns/) responde pela zona. [Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/), [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/) e [Data Stream](/pt-br/documentacao/plataforma/data-stream/) mostram o que acontece com cada requisição.

![Produtos da Cloudflare e os produtos da Azion que os substituem](/assets/docs/images/uploads/cf-to-azion.png)

Cada etapa deste guia move uma camada, na ordem em que uma migração acontece: inventário, deployment, código e regras, dados, segurança, monitoramento e DNS. A maior parte do código migra com mudanças pontuais: como uma função lê variáveis, como abre o armazenamento e como chama um modelo. Quando um downtime próximo de zero não é um requisito, migre em fases com janelas de manutenção. As gravações param durante cada passo, então os dados não precisam de sincronização paralela.

---

Os pré-requisitos e os procedimentos desta página mudam conforme a interface que você seleciona:

## Pré-requisitos

- Uma conta Azion. Para abrir uma, [cadastre-se no Azion Console](https://console.azion.com/signup). Para mais informações, consulte [Crie uma conta](/pt-br/documentacao/fundamentos/criar-uma-conta/).
- A conta Cloudflare, com acesso aos seus projetos, Workers, armazenamentos de dados e zonas DNS.
- Acesso aos registros DNS ou ao registrador de cada domínio que você move.
- `curl` e `dig`, para verificar as respostas HTTP e as respostas DNS.

**Console**

- Acesso ao Azion Console. Para entrar, consulte [Acesse Azion Console](/pt-br/documentacao/guias/plataforma/conta-e-billing/como-acessar-o-azion-console/).

**CLI**

- [Azion CLI](/pt-br/documentacao/devtools/cli/), instalada e autorizada com sua conta. Os comandos desta página correspondem à Azion CLI 4.23.0.

**API**

- Um personal token, enviado no header `Authorization` como `Token [TOKEN VALUE]`. Para criar um, consulte [Gerencie um personal token](/pt-br/documentacao/guias/plataforma/conta-e-billing/personal-tokens/). Toda requisição desta página vai para `https://api.azion.com/v4`.

---

## Faça o inventário da conta Cloudflare

Mova um projeto primeiro. Escolha um que teste o caminho completo e ainda migre rápido. Um bom primeiro projeto tem um build, alguns redirecionamentos, algumas variáveis de ambiente, um Worker e uma quantidade de dados gerenciável. Use-o para documentar o processo e depois mova os próximos projetos na mesma ordem. Mantenha o primeiro deployment pequeno e comprove que ele faz o build e roda na Azion antes de mover domínios, armazenamento ou bancos de dados.

Antes de criar qualquer coisa na Azion, liste o que o projeto usa:

- Projetos do Pages, seus comandos de build, diretórios de saída e presets de framework.
- `wrangler.toml` e as configurações de CI/CD que fazem o deploy do projeto.
- Variáveis de ambiente e secrets, das configurações do Pages, do `wrangler.toml`, dos secrets gerenciados pela CLI e das configurações de CI/CD.
- Workers, suas rotas e os bindings que cada um lê.
- Arquivos `_redirects` e `_headers` e regras de redirecionamento, origens, transformações e cache.
- Pools do Load Balancing e suas origens.
- Transformações de imagem e chamadas ao Workers AI.
- Namespaces do Workers KV, buckets R2 e bancos de dados D1.
- Domínios personalizados, zonas e registros DNS, DNSSEC e certificados.
- Regras de WAF, configurações de bots, regras de rate limiting e configurações de DDoS.
- Dashboards de analytics e exportações de logs.

Cada item da lista corresponde a uma etapa deste guia. A tabela em Mapeie cada produto da Cloudflare para a Azion indica o destino de cada um.

---

## Mapeie cada produto da Cloudflare para a Azion

Todo produto da Cloudflare do inventário tem um destino na Azion. Encontre o produto na primeira coluna e mova-o com a etapa que indica seu destino. Um traço (`-`) na última coluna significa que a Azion não tem um equivalente direto.

| Produto da Cloudflare         | O que cobre                                                        | Destino na Azion                                                                                                                                                                                                            |
| ----------------------------- | ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Agents                        | Agentes com IA na plataforma de desenvolvimento                    | [AI Inference](/pt-br/documentacao/plataforma/ai-inference/) e Functions                                                                                                                                                    |
| AI Crawl Control              | Controle de acesso para crawlers de IA                             | Firewall, [Network Shield](/pt-br/documentacao/plataforma/firewall/network-shield/primeiros-passos/) e Functions                                                                                                            |
| AI Gateway                    | Observação, cache, rate limiting e controle de tráfego de IA       | Functions, Cache, Real-Time Events e Data Stream                                                                                                                                                                            |
| AI Search                     | Pipelines gerenciados de recuperação e busca                       | SQL Database, com vector search, e AI Inference                                                                                                                                                                             |
| Analytics                     | Analytics dos serviços da Cloudflare                               | Real-Time Metrics, Real-Time Events, Data Stream e [Edge Pulse](/pt-br/documentacao/plataforma/edge-pulse/)                                                                                                                 |
| API Shield                    | Descoberta de APIs, validação de schema, mTLS e controles          | Firewall, [Web Application Firewall](/pt-br/documentacao/plataforma/firewall/waf/primeiros-passos/), Network Shield e [Certificate Manager](/pt-br/documentacao/plataforma/workloads/certificate-manager/primeiros-passos/) |
| Bots                          | Detecção e mitigação de tráfego automatizado                       | [Bot Manager](/pt-br/documentacao/plataforma/firewall/bot-manager/primeiros-passos/) e [Bot Manager Lite](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/bot-manager-lite/)                            |
| Cache                         | Comportamento do cache da CDN                                      | Cache, incluindo Tiered Cache                                                                                                                                                                                               |
| Cloudflare for Platforms      | Plataformas construídas sobre serviços da Cloudflare               | Azion API e [Marketplace](/pt-br/documentacao/plataforma/marketplace/)                                                                                                                                                      |
| Cloudflare Images             | Armazenamento, redimensionamento, otimização e entrega de imagens  | [Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/primeiros-passos/), com as imagens armazenadas no Object Storage                                                                              |
| Cloudflare Network Firewall   | Firewall como serviço para tráfego de rede                         | Firewall e Network Shield                                                                                                                                                                                                   |
| D1                            | Banco de dados SQL serverless construído sobre SQLite              | SQL Database                                                                                                                                                                                                                |
| DDoS Protection               | Proteção contra ataques DDoS                                       | [DDoS Protection](/pt-br/documentacao/plataforma/workloads/#ddos-protection)                                                                                                                                                |
| Digital Experience Monitoring | Experiência de usuário, dispositivo, rede e aplicação              | Edge Pulse e Real-Time Metrics                                                                                                                                                                                              |
| DNS                           | DNS autoritativo e segurança de DNS                                | Edge DNS                                                                                                                                                                                                                    |
| Dynamic Workers               | Workers isolados criados sob demanda                               | Functions                                                                                                                                                                                                                   |
| KV                            | Armazenamento chave-valor global                                   | KV Store                                                                                                                                                                                                                    |
| Load Balancing                | Distribuição de tráfego entre origens                              | [Load Balancer](/pt-br/documentacao/plataforma/connectors/load-balancer/primeiros-passos/), um módulo de [Connectors](/pt-br/documentacao/plataforma/connectors/)                                                           |
| Logs                          | Exportação, consulta e gerenciamento de logs                       | Real-Time Events e Data Stream                                                                                                                                                                                              |
| Origin Rules                  | Configurações de origem e roteamento de requisições para origens   | Applications e Connectors                                                                                                                                                                                                   |
| Pages                         | Deployments de frontend e full-stack                               | Applications, atendido por um workload, e [Azion CLI](/pt-br/documentacao/devtools/cli/)                                                                                                                                    |
| R2                            | Armazenamento de objetos compatível com S3                         | Object Storage                                                                                                                                                                                                              |
| Rate limiting                 | Limites de taxa de requisições                                     | Firewall e Functions                                                                                                                                                                                                        |
| Rules                         | Lógica de requisição, roteamento, cache, transformação e segurança | Applications, Firewall e Functions. Functions também pode rodar dentro de um firewall                                                                                                                                       |
| Secrets Store                 | Secrets para workloads de desenvolvimento                          | [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables/), armazenadas como secrets                                                                                                          |
| Smart Shield                  | Proteção e otimização do acesso à origem                           | Cache com Tiered Cache, [Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/configuracoes/) e Origin Shield, um módulo de Connectors                                              |
| SSL/TLS                       | Certificados, modos de criptografia e configurações de TLS         | Certificate Manager e Edge DNS                                                                                                                                                                                              |
| Terraform                     | Gerenciamento de recursos com Terraform                            | Terraform Provider                                                                                                                                                                                                          |
| Transform Rules               | Alterações de requisição e resposta                                | Applications, por meio do [Rules Engine](/pt-br/documentacao/plataforma/applications/rules-engine/), e Functions                                                                                                            |
| Vectorize                     | Banco de dados vetorial para embeddings e busca semântica          | SQL Database, com vector search                                                                                                                                                                                             |
| WAF                           | Regras de web application firewall                                 | Web Application Firewall                                                                                                                                                                                                    |
| Workers                       | Computação serverless                                              | Functions                                                                                                                                                                                                                   |
| Workers AI                    | Inferência de IA em modelos hospedados                             | AI Inference                                                                                                                                                                                                                |

A Azion possui um relatório SOC 2 Type 2 e um relatório SOC 3 e é PCI DSS 4.0.1 Level 1 Service Provider. Para as atestações, consulte [SOC 2 e SOC 3](/pt-br/documentacao/fundamentos/soc/) e [Certificação PCI DSS](/pt-br/documentacao/fundamentos/pci-dss-certification/).

---

## Faça o deploy do projeto na Azion

Na Azion, um projeto do Pages se torna uma aplicação, e um workload atende essa aplicação em um domínio. A Cloudflare guarda a configuração de build no `wrangler.toml`. A Azion a guarda no [`azion.config.js`](/pt-br/documentacao/devtools/cli/azion-config-js/), que também pode ser `azion.config.mjs` ou `azion.config.cjs`, conforme o preset.

| Tarefa           | Cloudflare                         | Azion CLI                                                                      |
| ---------------- | ---------------------------------- | ------------------------------------------------------------------------------ |
| Instalar         | `npm i -D wrangler@latest`         | `curl -fsSL https://cli.azion.app/install.sh \| bash`, ou `brew install azion` |
| Entrar           | `npx wrangler login`               | `azion login`                                                                  |
| Rodar localmente | `npx wrangler pages dev ./dist`    | `azion dev`                                                                    |
| Fazer o deploy   | `npx wrangler pages deploy ./dist` | `azion link`, depois `azion deploy`                                            |

A Azion suporta 19 frameworks e 5 presets genéricos. Azion Console importa um repositório com um de seis presets, e Azion CLI pede o preset em um seletor.

**Console**

Para importar o repositório no Azion Console:

1. **Abra o diálogo de criação**

   Acesse [Azion Console](https://console.azion.com/) > **Create**. O diálogo **New** abre.

2. **Abra a aba Import from GitHub**

   No diálogo **New**, selecione a aba **Import from GitHub** e depois selecione o card.

3. **Conecte sua conta do GitHub**

   Na seção **GitHub Connection**, selecione **Connect with GitHub** e instale o Azion GitHub App para o repositório.

4. **Selecione o repositório**

   Em **Git Scope**, selecione a conta do GitHub. Em **Repository**, selecione o repositório a mover.

5. **Selecione o preset**

   Em **Preset**, selecione o framework: *Next.js*, *Angular*, *Astro*, *Hexo*, *React* ou *Vue*.

6. **Informe o comando de instalação**

   Em **Install Command**, informe o comando que instala o projeto. Por exemplo: `npm install`.

7. **Selecione Deploy**

A Azion faz o build do projeto e cria sua aplicação e seu workload. Para cada campo da página, consulte [Importe um projeto do GitHub](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/automacao/importar-um-projeto-existente-do-github/).

**CLI**

Azion CLI faz o deploy do projeto a partir da sua máquina. Na raiz do projeto da Cloudflare, vincule o projeto à Azion e selecione o preset quando a CLI pedir:

```bash
azion link
```

Depois faça o deploy. O `azion deploy` precisa das configurações do projeto que o `azion link` grava:

```bash
azion deploy
```

A CLI faz o build do projeto e o deploy na Azion. Para definir o preset no código, coloque-o em `build.preset` do `azion.config.js`:

```javascript
import { defineConfig } from '@aziontech/config'

export default defineConfig({
  build: {
    preset: 'javascript',
    polyfills: true
  }
})
```

O preset de um projeto Next.js é `next`. O pacote `azion` que exemplos antigos importam está obsoleto: importe `defineConfig` de `@aziontech/config` e instale esse pacote no projeto antes, com `npm install -D @aziontech/config`. Sem ele, a CLI falha com `Failed to load configuration file`. Para os comandos, consulte [Primeiros passos com Azion CLI](/pt-br/documentacao/devtools/cli/primeiros-passos/) e [azion deploy](/pt-br/documentacao/devtools/cli/deploy/).

**API**

A API cria a aplicação, suas regras e o workload, um recurso por vez. Para montar essa cadeia, consulte [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/).

O deployment responde em um domínio de workload que a Azion atribui sob `map.azionedge.net`. Antes de mover qualquer domínio de produção, envie uma requisição para o caminho raiz, com esse domínio no lugar de `<your-workload-domain>`:

```bash
curl -i https://<your-workload-domain>/
```

A resposta traz o status, os headers e o corpo que o projeto retorna para `/`. Envie a mesma requisição para cada rota crítica.

Se o build falhar na Azion, compare o preset com o framework do projeto e verifique `build.preset`, `build.entry` e `build.bundler` no `azion.config.js`. O bloco `build` não tem campo de comando.

---

## Mova as variáveis de ambiente

Variáveis de ambiente guardam chaves de API, credenciais de banco de dados, secrets de autenticação, endpoints de serviços, feature flags e configurações por ambiente. Uma variável que não chega à Azion quebra o projeto em tempo de execução, mesmo quando o deployment tem sucesso.

Na Cloudflare, um Worker lê uma variável do parâmetro `env`. Na Azion, as variáveis pertencem à conta, até 100 delas, e uma função as lê com `Azion.env.get()`. Cada variável tem uma chave, um valor e uma flag que a marca como secret.

**Console**

Para criar as variáveis no Azion Console, abra a página **Variables** do menu **Account** e crie cada variável com sua chave e seu valor. Transforme em secret uma variável que guarda uma credencial.

**CLI**

Para criar cada variável com Azion CLI:

```bash
azion create variables --key API_KEY --value <your-value> --secret false
```

A CLI responde com o UUID da nova variável:

```text
Created variable with UUID 00000000-0000-0000-0000-000000000001
```

Defina `--secret true` para uma credencial. Para listar as variáveis, execute `azion list variables`. Para os outros comandos, consulte [variables](/pt-br/documentacao/devtools/cli/recursos/variables/).

**API**

Azion CLI e Azion Console criam as variáveis. Para as interfaces que criam, listam e alteram uma variável, consulte [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables/).

Depois altere o código que lê as variáveis:

```javascript diff
-// Before: Cloudflare
-const apiKey = env.API_KEY;
 
+// After: Azion
+const apiKey = Azion.env.get('API_KEY');
```

Uma função em produção também lê uma variável como `process.env.API_KEY`. No `azion dev`, uma função lê o arquivo `.env` do projeto em vez das variáveis da conta, ou todo o ambiente do shell quando não há arquivo `.env`. Se uma função informar que uma variável não foi encontrada, confirme que a variável existe na conta e que o código a lê com `Azion.env.get()`.

> **Atenção**
>
> Mantenha os secrets em sistemas aprovados e limite o acesso aos processos que precisam deles. Nunca copie um secret para notas locais, tickets, mensagens de chat ou documentos temporários.

---

## Mova Workers para Functions

Os Workers costumam carregar a lógica mais crítica de um projeto: autenticação, personalização, orquestração de APIs e integrações com serviços de terceiros. Na Azion, esse código roda em [Functions](/pt-br/documentacao/plataforma/functions/). Uma função guarda o código, uma [instância de função](/pt-br/documentacao/plataforma/applications/functions-instances/) o executa em uma aplicação, e uma regra decide quais requisições chegam até ela.

| Aspecto    | Cloudflare Workers         | Azion Functions                        |
| ---------- | -------------------------- | -------------------------------------- |
| Handler    | `fetch(request, env, ctx)` | `fetch(request, env, ctx)`             |
| Variáveis  | `env.VARIABLE`             | `Azion.env.get('VARIABLE')`            |
| Memória    | 128 MB em todos os planos  | 512 MB por isolate, em todos os planos |
| Cold start | Possível                   | Nenhum                                 |

O handler mantém sua assinatura, mas `env` é um objeto vazio em uma função em produção, e `ctx` traz `args` e `waitUntil`. Qualquer valor que um Worker lê de um binding em `env` passa para uma variável, ou para a API de runtime do seu armazenamento:

```javascript diff
-// Before: Cloudflare
-export default {
-  async fetch(request, env, ctx) {
-    const apiKey = env.API_KEY;
-    return fetch(apiUrl, { headers: { 'Authorization': `Bearer ${apiKey}` }});
-  }
-};
 
+// After: Azion
+export default {
+  async fetch(request, env, ctx) {
+    const apiKey = Azion.env.get('API_KEY');
+    return fetch(apiUrl, { headers: { 'Authorization': `Bearer ${apiKey}` }});
+  }
+};
```

A geolocalização passa de `request.cf` para `request.metadata`:

```javascript diff
-// Before: Cloudflare
-const country = request.cf.country;
 
+// After: Azion
+const country = request.metadata['geoip_country_code'];
```

No `azion dev`, `request.metadata` é `undefined`. Teste o código que o lê em uma função em produção.

O código que lê Workers KV, D1 ou Workers AI também muda suas chamadas. As etapas Mova dados do Workers KV para KV Store, Mova bancos de dados D1 para SQL Database e Mova Workers AI para AI Inference mostram as novas chamadas. Para as APIs de runtime, consulte [Web APIs](/pt-br/documentacao/devtools/runtime/api-reference/javascript/).

---

## Recrie redirecionamentos e reescritas

Redirecionamentos protegem rankings de busca, links de campanhas, backlinks e favoritos. Quando um redirecionamento quebra, o resultado é perda de tráfego e jornadas de usuário interrompidas. A Cloudflare os guarda em um arquivo `_redirects`. A Azion os guarda nas regras da aplicação, que você escreve no Azion Console, na API ou no `azion.config.js`.

| Aspecto                    | Cloudflare               | Azion                                                                                                               |
| -------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| Configuração               | Arquivo `_redirects`     | [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/)                         |
| Correspondência de padrões | Padrões glob (`/*`)      | Expressões regulares com o operador `matches`, como `^/.*$`, além de `starts_with` e `is_equal`                     |
| Valores capturados         | `:splat`, `:placeholder` | `%{name[index]}`, como `%{capture[1]}` e `%{capture[2]}`, de um comportamento *Capture Match Groups* na mesma regra |

Converta cada padrão em uma expressão regular:

| Padrão da Cloudflare | Expressão regular da Azion                        |
| -------------------- | ------------------------------------------------- |
| `/old-page`          | `^/old-page$`                                     |
| `/blog/*`            | `^/blog/(.*)$`                                    |
| `:splat`             | `%{capture[1]}`, com `capture` como nome do array |

Os critérios de uma regra selecionam as requisições, mas não capturam nada. Para reutilizar parte do caminho no destino, adicione um comportamento *Capture Match Groups* antes do redirecionamento, na mesma regra. *Capture Match Groups* requer [Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/configuracoes/) na aplicação. O array é local, então só a regra que o captura pode lê-lo.

**Console**

Para criar o redirecionamento no Azion Console:

1. **Abra a aplicação**

   Acesse [Azion Console](https://console.azion.com/) > **Applications** e selecione a aplicação.

2. **Vá para a aba Rules Engine**

3. **Selecione + Rule**

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

   Informe um nome como `old-blog-redirect` e selecione **Request Phase**.

5. **Defina os critérios**

   Em **Criteria**, selecione `${uri}` e o operador *matches*. Como argumento, informe `^/old-blog/(.*)$`.

6. **Adicione o comportamento Capture Match Groups**

   Em **Behaviors**, selecione *Capture Match Groups*. Informe `capture` como nome do array, `${uri}` como **Subject** e `^/old-blog/(.*)$` como **Regex**.

7. **Adicione o redirecionamento**

   Adicione um segundo comportamento, *Redirect To (301 Moved Permanently)*, com `/blog/%{capture[1]}` como argumento.

8. **Selecione Save**

A regra aparece na lista de regras de requisição.

**CLI**

Para criar o redirecionamento com Azion CLI, adicione a regra às `rules` da aplicação no `azion.config.js`. Dê a ela os comportamentos `capture_match_groups` e `redirect_to_301` e execute `azion deploy`. Para os campos de uma regra, consulte [azion.config.js](/pt-br/documentacao/devtools/cli/azion-config-js/).

**API**

Para criar o redirecionamento, envie uma requisição `POST` para as regras de requisição da aplicação:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/applications/<application-id>/request_rules \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "old-blog-redirect",
  "criteria": [[{ "conditional": "if", "variable": "${uri}", "operator": "matches", "argument": "^/old-blog/(.*)$" }]],
  "behaviors": [
    { "type": "capture_match_groups", "attributes": { "subject": "${uri}", "regex": "^/old-blog/(.*)$", "captured_array": "capture" } },
    { "type": "redirect_to_301", "attributes": { "value": "/blog/%{capture[1]}" } }
  ]
}'
```

A resposta traz `"state": "pending"` e a regra com seu `id`.

Para verificar o redirecionamento, requisite um caminho antigo:

```bash
curl -I https://<your-workload-domain>/old-blog/post
```

A resposta traz `301 Moved Permanently` e um header `location` que termina em `/blog/post`. Uma regra nova pode levar alguns minutos para se propagar. Diante de uma resposta inesperada, aguarde e tente de novo antes de diagnosticar.

Para servir conteúdo de outro caminho sem redirecionamento, use *Rewrite Request* com as mesmas capturas. Em mudanças sensíveis para SEO, prefira redirecionamentos permanentes, evite cadeias de redirecionamento, mantenha os caminhos canônicos consistentes e teste os caminhos com e sem barra final.

---

## Recrie headers personalizados

Headers controlam o cache, a segurança e o comportamento do navegador. A Cloudflare os guarda em um arquivo `_headers`, apenas para respostas. A Azion os adiciona com regras em qualquer uma das fases: *Add Request Header* altera a requisição enviada à origem, e o mesmo comportamento em uma regra da Response Phase altera a resposta enviada ao usuário.

| Aspecto           | Cloudflare         | Azion                                                                            |
| ----------------- | ------------------ | -------------------------------------------------------------------------------- |
| Configuração      | Arquivo `_headers` | Rules Engine para Applications, no Azion Console, na API ou no `azion.config.js` |
| Fases             | Apenas resposta    | Requisição e resposta                                                            |
| Valores dinâmicos | Não suportado      | Variáveis de regra, como `${uri}`, `${host}` ou `${geoip_city_country_code}`     |

Este `azion.config.js` adiciona dois headers de segurança a toda resposta da aplicação:

```javascript
import { defineConfig } from '@aziontech/config'

export default defineConfig({
  applications: [{
    name: 'my-app',
    rules: {
      response: [{
        name: 'Security Headers',
        active: true,
        criteria: [[{
          variable: '${uri}',
          conditional: 'if',
          operator: 'starts_with',
          argument: '/'
        }]],
        behaviors: [
          { type: 'add_response_header', attributes: { value: 'X-Frame-Options: SAMEORIGIN' } },
          { type: 'add_response_header', attributes: { value: 'X-Content-Type-Options: nosniff' } }
        ]
      }]
    }
  }]
})
```

O valor tem o formato `Name: value`, e o Console recusa qualquer outro formato com `Header must follow the header-name: value format`. Um workload precisa atender a aplicação para que os headers cheguem a um domínio. Execute `azion deploy` e depois verifique uma resposta:

```bash
curl -I https://<your-workload-domain>/
```

A resposta traz `x-frame-options: SAMEORIGIN` e `x-content-type-options: nosniff`.

---

## Recrie as configurações de cache

Na Azion, uma [configuração de cache](/pt-br/documentacao/plataforma/applications/cache/cache-settings/) define por quanto tempo uma resposta fica em cache e o que faz duas requisições compartilharem uma cópia em cache. Uma regra com *Set Cache Policy* aplica a configuração às requisições a que corresponde. A regra seleciona uma configuração, e a configuração guarda o TTL e a chave de cache.

| Aspecto           | Cloudflare                                                           | Azion                                                                                                             |
| ----------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Níveis de cache   | Regional Tiered Cache, Smart Tiered Cache, cache da rede e navegador | Cache, [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/) e cache do navegador       |
| Chave de cache    | Personalizável                                                       | Personalizável na configuração de cache, com os controles **Cache vary by**, que requerem Application Accelerator |
| TTL               | Por page rule                                                        | **Max Age** de cada configuração de cache, de 0 a 31.536.000 segundos                                             |
| Purge             | URL, tag, host e prefixo                                             | URL, chave de cache e wildcard                                                                                    |
| Conteúdo expirado | `stale-while-revalidate`                                             | **Stale cache**, que entrega uma cópia expirada quando a revalidação falha                                        |

**Max Age** tem padrão de 60 segundos. Um valor abaixo de 60 requer Application Accelerator, e uma configuração de cache com Tiered Cache ativado precisa de pelo menos 3 segundos e de *Override cache behavior*. **Stale cache** respeita o `stale-while-revalidate` que a origem envia, ou mantém uma janela de 300 segundos com *Override cache behavior*. Ele vem ativado por padrão no Azion Console e desativado na API e na CLI.

**Console**

Para criar a configuração de cache no Azion Console:

1. **Abra a aplicação**

   Acesse [Azion Console](https://console.azion.com/) > **Applications** e selecione a aplicação.

2. **Vá para a aba Cache Settings**

3. **Selecione + Cache**

4. **Dê um nome à configuração de cache**

   Em **Name**, informe `static-assets`.

5. **Mantenha Override cache behavior selecionado**

   Em **Cache**, mantenha *Override cache behavior* selecionado, para que **Max Age** substitua o TTL que a origem envia.

6. **Defina Max Age**

   Em **Max Age**, informe o TTL em segundos. Por exemplo: `300`.

7. **(Opcional) Ative Tiered Cache**

   Ative **Tiered Cache** e selecione a **Tiered Cache Region**.

8. **Selecione Save**

A nova configuração aparece na lista **Cache Settings**. Para aplicá-la, crie uma regra da Request Phase na aba **Rules Engine**. Use critérios como `${uri}` *starts with* `/static/` e o comportamento **Set Cache Policy** definido como `static-assets`.

**CLI**

As flags da CLI não definem o TTL do cache, o comportamento do cache nem Tiered Cache. Envie o corpo completo da configuração de cache a partir de um arquivo com `--file`, como mostra [Primeiros passos com Cache](/pt-br/documentacao/plataforma/applications/cache/primeiros-passos/).

**API**

Para criar a configuração de cache, envie uma requisição `POST` para as configurações de cache da aplicação:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/applications/<application-id>/cache_settings \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "static-assets",
  "browser_cache": { "behavior": "override", "max_age": 86400 },
  "modules": {
    "cache": {
      "behavior": "override",
      "max_age": 300,
      "stale_cache": { "enabled": true },
      "tiered_cache": { "enabled": true, "topology": "nearest-region" }
    }
  }
}'
```

Para alterar uma configuração, envie os mesmos campos em uma requisição `PATCH` para `/v4/workspace/applications/<application-id>/cache_settings/<cache-setting-id>`. Depois aplique a configuração com uma regra de requisição:

```json
{
  "name": "apply-static-assets-cache",
  "active": true,
  "criteria": [[{ "variable": "${uri}", "operator": "starts_with", "conditional": "if", "argument": "/static/" }]],
  "behaviors": [{ "type": "set_cache_policy", "attributes": { "value": <cache-setting-id> } }]
}
```

A regra aplica `static-assets` a toda requisição cujo caminho começa com `/static/`.

Para variar o cache por query string, cookie ou dispositivo, use os controles **Cache vary by** da configuração de cache: **Cache vary by Query String**, **Cache vary by Cookies** e **Cache vary by Devices**. Eles requerem Application Accelerator na aplicação. **Cache vary by Devices** com o comportamento *Allowlist* mantém uma cópia para cada grupo de dispositivos que você seleciona, entre os grupos da aba **Device Groups** da aplicação. Para os controles, consulte [Variação de cache](/pt-br/documentacao/plataforma/applications/application-accelerator/variacao-de-cache/).

Para fazer purge de conteúdo em cache, envie uma requisição `POST` para o endpoint de purge do tipo correspondente:

```bash
# Purge by URL
curl --request POST \
  --url https://api.azion.com/v4/workspace/purge/url \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "items": ["https://example.com/image.jpg", "https://example.com/styles.css"],
  "layer": "cache"
}'

# Purge by wildcard
curl --request POST \
  --url https://api.azion.com/v4/workspace/purge/wildcard \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "items": ["https://example.com/images/*"],
  "layer": "cache"
}'
```

Purge é um endpoint de nível superior, não aninhado em applications. Um purge por URL aceita até 50 itens, e um purge por wildcard aceita uma expressão. Só um purge por chave de cache, em `/v4/workspace/purge/cachekey`, alcança Tiered Cache com `"layer": "tiered_cache"`. Um purge por URL ou wildcard com essa camada falha com `30001`. Para os tipos de purge, consulte [Real-Time Purge](/pt-br/documentacao/plataforma/applications/cache/real-time-purge/).

---

## Balanceie o tráfego entre origens

Na Azion, [Load Balancer](/pt-br/documentacao/plataforma/connectors/load-balancer/metodos-de-balanceamento/) é um módulo de um connector, não um recurso separado. Um connector do tipo `http` guarda cada origem como um endereço, até 15 endereços com Load Balancer ativado e um endereço sem ele. Uma regra com *Set Connector* envia as requisições da aplicação para o connector.

| Aspecto                  | Cloudflare Load Balancing                                          | Azion Load Balancer                                                                                                                             |
| ------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Métodos de balanceamento | Round-robin, menos conexões, aleatório e direcionamento geográfico | *Round Robin*, *Least Connections* e *IP Hash*, que são `round_robin`, `least_conn` e `ip_hash` na API. Nenhum método direciona por localização |
| Health checks            | Monitores HTTP, HTTPS e TCP                                        | Nenhum. O failover é passivo: **Max Retries** e os timeouts tratam uma conexão que falhou                                                       |
| Failover                 | Ativo-passivo e ativo-ativo                                        | Vários endereços *Primary* com pesos e endereços *Backup* que recebem tráfego apenas quando todos os primários falham                           |
| Afinidade de sessão      | Cookie e hash de IP                                                | Apenas *IP Hash*, que associa cada endereço IP de cliente a um endereço                                                                         |
| Origens                  | Pools de origens                                                   | Endereços de um connector                                                                                                                       |

Cada endereço tem um **Weight** de 1 a 100, que define sua parcela do tráfego. *IP Hash* recusa endereços *Backup*, com `28005` na API. **Max Retries** aceita de 0 a 20, **Connection Timeout** de 1 a 300 segundos e **Read/Write Timeout** de 1 a 600 segundos. Esses campos existem apenas com Load Balancer ativado. Quando você o ativa no Azion Console, o formulário preenche *Round Robin*, `3`, `30` e `60`. Os padrões da API são `0`, `60` e `120`.

**Console**

Para ativar Load Balancer no Azion Console:

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

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

2. **Abra o connector da origem**

3. **Ative Load Balancer**

   Em **Modules**, ative **Load Balancer**.

4. **Selecione o método de balanceamento**

   Em **Load Balancer Configuration**, defina **Method** como *Round Robin*, *Least Connections* ou *IP Hash*.

5. **Configure o primeiro endereço**

   Em **Address Management**, no endereço existente, defina **Server Role** e **Weight**.

6. **Selecione Add Address**

7. **Informe a próxima origem**

   No novo **Address**, informe o host da origem, sem protocolo nem porta. Depois defina seu **Server Role** e seu **Weight**.

8. **Selecione Save**

O Console mostra `Connector has been updated`. O connector tem Load Balancer ativado e um endereço para cada origem.

**CLI**

O comando de atualização precisa do corpo completo do connector. Coloque-o em um arquivo JSON e envie-o com `--file`, como mostra [Primeiros passos com Load Balancer](/pt-br/documentacao/plataforma/connectors/load-balancer/primeiros-passos/).

**API**

Para ativar Load Balancer, envie uma requisição `PATCH` para o connector. O endereço traz `server_role` e `weight`, e o método, as tentativas e os timeouts ficam em `attributes.modules.load_balancer.config`:

```bash
curl --request PATCH \
  --url https://api.azion.com/v4/workspace/connectors/<connector-id> \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "attributes": {
    "addresses": [
      { "address": "origin1.example.com", "modules": { "load_balancer": { "server_role": "primary", "weight": 3 } } },
      { "address": "origin2.example.com", "modules": { "load_balancer": { "server_role": "primary", "weight": 1 } } }
    ],
    "modules": {
      "load_balancer": {
        "enabled": true,
        "config": { "method": "round_robin", "max_retries": 3, "connection_timeout": 10, "read_write_timeout": 30 }
      }
    }
  }
}'
```

A resposta traz `"state": "pending"`. Dois endereços com Load Balancer desativado são recusados com `28004`, e `"enabled": true` com um `config` vazio é recusado com `28014`.

Para os campos do connector, consulte [Configurações de connectors](/pt-br/documentacao/plataforma/connectors/configuracoes/).

---

## Entregue imagens otimizadas

[Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/primeiros-passos/) redimensiona, recorta, converte e aplica filtros a imagens sob demanda. Ele não armazena nada: lê a imagem de origem da origem da aplicação, que pode ser um bucket do Object Storage atrás de um connector.

| Aspecto        | Cloudflare Images                         | Azion Image Processor                                                                                                                   |
| -------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Armazenamento  | Armazenamento integrado                   | A origem da aplicação, como Object Storage                                                                                              |
| Transformações | Redimensionamento, formato e qualidade    | Redimensionamento, formato, qualidade, recorte, rotação, preenchimento e marca d'água                                                   |
| Formato de URL | `/cdn-cgi/image/<OPTIONS>/<SOURCE-IMAGE>` | `/image.png?ims=<OPTIONS>`                                                                                                              |
| Formatos       | WebP e AVIF                               | WebP, AVIF, JPEG, GIF e PNG                                                                                                             |
| URLs assinadas | Suportadas                                | Por meio da integração [Secure Token](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/secure-token/) em um firewall |

Image Processor funciona em dois passos: ative o módulo na aplicação e depois crie uma regra com o comportamento *Optimize Images*. Uma requisição que nenhuma regra desse tipo atende é entregue sem processamento.

**Console**

Para ativar Image Processor no Azion Console:

1. **Abra a aplicação**

   Acesse [Azion Console](https://console.azion.com/) > **Applications** e selecione a aplicação.

2. **Ative Image Processor**

   Na aba **Main Settings**, em **Modules**, ative **Image Processor**. Para mais informações, consulte [Main Settings](/pt-br/documentacao/plataforma/applications/main-settings/).

3. **Selecione Save**

4. **Adicione a regra Optimize Images**

   Na aba **Rules Engine**, crie uma regra da Request Phase com `${uri}` *matches* `\.(jpg|jpeg|gif|bmp|png|ico|webp|avif)` e o comportamento *Optimize Images*.

As requisições de imagem que atendem à regra agora são processadas.

**CLI**

Para ativar Image Processor com Azion CLI, siga o painel CLI de [Primeiros passos com Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/primeiros-passos/).

**API**

Para ativar o módulo, envie uma requisição `PATCH` para a aplicação:

```bash
curl --request PATCH \
  --url https://api.azion.com/v4/workspace/applications/<application-id> \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "modules": {
    "image_processor": { "enabled": true }
  }
}'
```

Depois crie uma regra de requisição com o comportamento `optimize_images`, como mostra [Primeiros passos com Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/primeiros-passos/).

Image Processor lê a transformação do parâmetro de query `ims`:

```text
# Cloudflare
https://example.com/cdn-cgi/image/width=400,quality=85/image.jpg

# Azion
https://example.com/image.jpg?ims=400x/filters:quality(85)
```

| Sintaxe                               | Resultado                                                                                  | Exemplo                                   |
| ------------------------------------- | ------------------------------------------------------------------------------------------ | ----------------------------------------- |
| `?ims=WxH`                            | Redimensiona para a largura e a altura, recortando para caber quando ambas estão definidas | `?ims=400x300`                            |
| `?ims=Wx`                             | Redimensiona para a largura, com a altura proporcional                                     | `?ims=400x`                               |
| `?ims=xH`                             | Redimensiona para a altura, com a largura proporcional                                     | `?ims=x300`                               |
| `?ims=fit-in/WxH`                     | Encaixa a imagem dentro das dimensões, sem nunca ampliá-la                                 | `?ims=fit-in/400x300`                     |
| `?ims=fit-in/WxH/filters:fill(Color)` | Encaixa a imagem e preenche o restante da área com uma cor                                 | `?ims=fit-in/400x300/filters:fill(white)` |

Image Processor converte para WebP quando o header `Accept` do cliente permite. AVIF precisa de `?ims=filters:format(avif)` e de um cliente que aceite `image/avif`. Para manter em cache uma cópia para cada valor de `ims`, ative Application Accelerator e varie o cache por query string. Para cada parâmetro, consulte [Parâmetros de URL](/pt-br/documentacao/plataforma/applications/image-processor/parametros-de-url/).

---

## Mova Workers AI para AI Inference

[AI Inference](/pt-br/documentacao/plataforma/ai-inference/) executa um catálogo de [modelos](/pt-br/documentacao/plataforma/ai-inference/modelos/) open source: large language models, vision language models, um modelo de embedding e um reranker. Um modelo não é um objeto que você cria, e a Azion não hospeda um endpoint de inferência para ele. Uma função chama um modelo pelo seu ID com `Azion.AI.run()` e não precisa de credencial:

| Aspecto         | Cloudflare Workers AI              | Azion AI Inference                                                                   |
| --------------- | ---------------------------------- | ------------------------------------------------------------------------------------ |
| Modelos         | Modelos hospedados pela Cloudflare | Um catálogo de modelos open source. Para adaptar um modelo, use fine-tuning com LoRA |
| Interface       | API REST                           | `Azion.AI.run()` dentro de uma função                                                |
| Tipos de modelo | Geração de texto, imagem e fala    | LLMs, vision language models, um modelo de embedding e um reranker                   |

```javascript
const modelResponse = await Azion.AI.run("Qwen/Qwen3-30B-A3B-Instruct-2507-FP8", {
  "stream": false,
  "messages": [
    { "role": "system", "content": "You are a helpful assistant." },
    { "role": "user", "content": "Name three European capitals." }
  ]
})
const answer = modelResponse?.choices?.[0]?.message?.content
```

No `azion dev`, `Azion.AI` é `undefined`. Teste a chamada em uma função em produção. Para os campos da requisição, consulte [Invocação de modelos](/pt-br/documentacao/plataforma/ai-inference/invocacao-de-modelos/) e a [API de runtime de IA](/pt-br/documentacao/devtools/runtime/api-reference/ai/).

Para um endpoint `/v1/chat/completions` compatível com OpenAI, faça o deploy do template [AI Inference Starter Kit](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/frameworks/ai-inference-starter-kit/). Ele cria uma aplicação e uma função que atendem esse endpoint. Para fazer o deploy, acesse [Azion Console](https://console.azion.com/) > **Create**, selecione o template e selecione **Deploy**. Azion CLI não tem flag de template.

---

## Mova dados do Workers KV para KV Store

[KV Store](/pt-br/documentacao/plataforma/kv-store/) guarda configurações, feature flags, estado de sessão, tabelas de roteamento e preferências por usuário. Uma função abre um namespace com `Azion.KV.open()`, um global do runtime que não precisa de linha de import:

```javascript diff
-// Before: Cloudflare
-await env.MY_KV_NAMESPACE.put('key1', 'value1');
-const value = await env.MY_KV_NAMESPACE.get('key1');
 
+// After: Azion
+const kv = await Azion.KV.open('my-store');
+await kv.put('key1', 'value1');
+const value = await kv.get('key1', 'text');
```

`Azion.KV.open()` é o único ponto de entrada e é assíncrono. O namespace precisa existir antes, ou `open()` lança `NotFound`. `get()` retorna `null` para uma chave inexistente, assim como para uma chave expirada.

KV Store não tem importação em massa, e nenhuma API, comando da CLI ou tela do Console lê ou grava chaves. Para mover os dados:

1. Exporte as chaves da Cloudflare pela API dela.
2. Crie o namespace com uma requisição `POST` para `https://api.azion.com/v4/workspace/kv/namespaces`. O nome aceita de 3 a 63 caracteres, diferencia maiúsculas de minúsculas e é permanente: um namespace não pode ser renomeado nem excluído.
3. Grave as chaves a partir de uma função em produção com `kv.put()`.

A função grava uma chave no máximo uma vez por segundo. Um valor aceita até 25 MB, uma chave até 512 bytes e os metadados até 1.024 bytes. Associe cada TTL da Cloudflare à opção `expiration`, em segundos Unix, ou a `expirationTtl`, em segundos com mínimo de 60. Uma gravação fica visível em todos os lugares em até 60 segundos, ou dentro do `cacheTtl` da leitura. Antes da importação, revise os prefixos das chaves, os formatos dos valores e o código que trata uma chave inexistente. Para o cliente, consulte [API de runtime do KV Store](/pt-br/documentacao/devtools/runtime/api-reference/kv-store/).

---

## Mova buckets do R2 para Object Storage

[Object Storage](/pt-br/documentacao/plataforma/object-storage/) guarda imagens, documentos, assets estáticos, mídia, uploads e arquivos gerados. Ele fala o protocolo S3, então ferramentas e SDKs S3 o alcançam com um novo endpoint, uma região e um par de chaves.

| Aspecto                | Cloudflare R2                           | Azion Object Storage                                                                                                                                     |
| ---------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Endpoint               | `<ACCOUNT_ID>.r2.cloudflarestorage.com` | `s3.us-east-005.azionstorage.net`                                                                                                                        |
| Região                 | `auto`                                  | `us-east-005`                                                                                                                                            |
| Transferência de dados | Gratuita                                | Sem cobrança de transferência de dados no Object Storage. A entrega aos usuários passa por um workload, cobrada como transferência de dados de Workloads |

O par de chaves vem de uma credencial do Object Storage. Crie-a no Azion Console ou com uma requisição `POST` para `https://api.azion.com/v4/workspace/storage/credentials`. A `secret_key` só volta na resposta de criação. Para migrar, a credencial precisa de pelo menos `listBuckets`, `listFiles` e `writeFiles`, além de `listAllBucketNames` para listar os buckets.

Um script de migração em Node.js alcança Object Storage com o AWS SDK:

```javascript
import { S3Client } from '@aws-sdk/client-s3';

const client = new S3Client({
  region: 'us-east-005',
  endpoint: 'https://s3.us-east-005.azionstorage.net',
  credentials: {
    accessKeyId: process.env.AZION_ACCESS_KEY,
    secretAccessKey: process.env.AZION_SECRET_KEY
  }
});
```

Para copiar os dados com o [s3cmd](https://s3tools.org/s3cmd), crie antes o bucket de destino no Azion Console, na API ou na CLI. O s3cmd não cria nem remove um bucket na Azion: `s3cmd mb` e `s3cmd rb` são recusados com `403 AccessDenied`. Um nome de bucket aceita de 6 a 63 caracteres, é único entre todas as contas e não pode começar com `azion`.

1. Execute `s3cmd --configure -c ~/.s3cfg-azion` e informe estes valores:

   - **Access Key** e **Secret Key**: o par de chaves da credencial.
   - **Default Region**: `us-east-005`.
   - **S3 Endpoint**: `s3.us-east-005.azionstorage.net`.
   - **DNS-style bucket+hostname:port template**: `%(bucket).s3.us-east-005.azionstorage.net`.
   - **Use HTTPS protocol**: `true`.

2. Configure um segundo arquivo, `~/.s3cfg-r2`, com o endpoint e as chaves do bucket R2. Uma configuração do s3cmd guarda um endpoint.

3. Baixe os objetos do R2:

   ```bash
   s3cmd -c ~/.s3cfg-r2 sync s3://r2-bucket/ ./export/
   ```

4. Envie-os para a Azion:

   ```bash
   s3cmd -c ~/.s3cfg-azion sync ./export/ s3://azion-bucket/
   ```

Os objetos estão no bucket da Azion. Para verificar, liste-os com `s3cmd -c ~/.s3cfg-azion ls s3://azion-bucket/`. `s3cmd ls` sem bucket lista todos os buckets, o que exige `listAllBucketNames` na credencial. `s3cmd sync s3://source-bucket/ s3://dest-bucket/` copia apenas entre dois buckets do mesmo provedor. Outros comandos funcionam da mesma forma: `s3cmd put file.png s3://my-bucket/` envia um objeto, e `s3cmd get s3://my-bucket/file.png` baixa um. O rclone, a AWS CLI e outras ferramentas S3 também funcionam.

Azion Console recusa um upload individual acima de 300 MB. A API e as ferramentas S3 não estão sujeitas a esse limite. Antes da migração, mapeie os buckets, os prefixos de objetos, os assets públicos e privados e a lógica de URLs assinadas. O acesso do bucket aos workloads é `read_only`, `read_write` ou `restricted`, e uma credencial funciona de forma independente dele. A entrega pública passa por um connector e uma aplicação, não pelo endpoint S3. Para as operações S3, consulte [Compatibilidade com S3](/pt-br/documentacao/plataforma/object-storage/compatibilidade-s3/) e [Use ferramentas compatíveis com S3](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/protocolo-s3-para-object-storage/). Para os buckets e seus objetos, consulte [Crie e modifique um bucket](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/criar-e-modificar-um-bucket/), [Faça upload e download de objetos](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/upload-e-download-de-objetos-do-bucket/), [Use um bucket como origem](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/bucket-como-connector/) e a [biblioteca Storage](/pt-br/documentacao/devtools/azion-lib/storage/).

---

## Mova bancos de dados D1 para SQL Database

[SQL Database](/pt-br/documentacao/plataforma/sql-database/) usa o dialeto SQLite e é totalmente compatível com ACID. Uma instância principal recebe todas as gravações, e réplicas de leitura respondem às leituras. SQL Database está em Preview em todos os planos.

| Aspecto               | Cloudflare D1    | Azion SQL Database                                                                                                                                           |
| --------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Conexão               | Binding `env.DB` | `Database.open()` do global `Azion.Sql`                                                                                                                      |
| Dialeto SQL           | SQLite           | SQLite                                                                                                                                                       |
| Gravações pelo código | Pelo binding     | Pela API. Uma conexão de runtime é somente leitura                                                                                                           |
| Vector search         | Suportado        | Suportado, com colunas vetoriais, `libsql_vector_idx` e `vector_top_k`. Consulte [Vector search](/pt-br/documentacao/plataforma/sql-database/vector-search/) |

Uma função lê o banco de dados por uma conexão somente leitura com uma réplica. `Azion.Sql` é um global, e o import `azion:sql` faz o build falhar:

```javascript diff
-// Before: Cloudflare
-const result = await env.DB
-  .prepare('SELECT * FROM users WHERE id = ?')
-  .bind(1)
-  .first();
 
+// After: Azion
+const { Database } = Azion.Sql;
+
+const connection = await Database.open('my-database');
+const rows = await connection.query('SELECT * FROM users WHERE id = ?', [1]);
+const row = await rows.next();
+const name = row ? row.getString(0) : null;
```

`rows.next()` retorna a próxima linha, ou `null` depois da última, e `row.getString(i)` lê uma coluna pelo índice. Um `insert` ou `delete` pela conexão falha com `attempt to write a readonly database`. No `azion dev`, `Azion.Sql` é `undefined`, então teste o código em uma função em produção. Para scripts do lado do servidor e ferramentas de build, o pacote [`@aziontech/sql`](/pt-br/documentacao/devtools/azion-lib/sql/) gerencia bancos de dados pela API.

Para mover os dados, exporte o banco de dados D1 para um arquivo SQL:

```bash
wrangler d1 export my-db --output=dump.sql
```

[Crie o banco de dados](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/gerenciar-bancos-dados-edge-sql/) na Azion. Depois execute as instruções do dump por um destes caminhos:

- **A API**: envie as instruções no array `statements` de uma requisição `POST` para `https://api.azion.com/v4/workspace/sql/databases/<database-id>/query`. Uma instrução que falha ainda retorna HTTP `200`, com uma chave `error` no lugar de `results`.
- **O EdgeSQL Shell**: `.read dump.sql` executa o script. O shell não inicia em uma instalação limpa, então verifique [EdgeSQL Shell](/pt-br/documentacao/plataforma/sql-database/edgesql-shell/) antes de depender dele. Para instalá-lo, consulte [Instale o SQL Shell](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/install-edge-sql-shell/).

Azion CLI não tem comando para SQL Database. Para os outros formatos de importação, consulte [Importe dados para SQL Database](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/importar-dados-edge-sql/). Para a API de runtime, consulte [API de runtime do SQL Database](/pt-br/documentacao/devtools/runtime/api-reference/sql-database/).

---

## Proteja a aplicação com WAF

[Web Application Firewall](/pt-br/documentacao/plataforma/firewall/waf/primeiros-passos/) pontua as requisições em relação a oito famílias de ameaças: cross-site scripting, directory traversal, evading tricks, file upload, identified attack, remote file inclusion, SQL injection e unwanted access. Um conjunto de regras WAF guarda uma sensibilidade para cada família, e uma regra de firewall o aplica com *Set WAF*.

| Aspecto               | Cloudflare WAF                       | Azion WAF                                                                           |
| --------------------- | ------------------------------------ | ----------------------------------------------------------------------------------- |
| Linguagem de regras   | Linguagem de expressões              | Critérios do Rules Engine para Firewall                                             |
| Regras gerenciadas    | Rulesets gerenciados pela Cloudflare | Um ruleset gerenciado, pontuado por família de ameaças                              |
| Regras personalizadas | Regras personalizadas                | [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/) |
| Modos                 | Bloqueio, desafio e log              | *Logging* e *Blocking*                                                              |

`mode` é obrigatório em todo comportamento *Set WAF* e não tem padrão. Comece em *Logging* para verificar o que o conjunto de regras bloquearia e depois mude para *Blocking*. No modo *Blocking*, uma requisição que o conjunto de regras bloqueia recebe `400`. Para evitar que uma requisição legítima corresponda, adicione uma exceção de WAF ou use a aba **Tuning**.

**Console**

Para configurar o WAF no Azion Console:

1. **Crie o conjunto de regras**

   Acesse [Azion Console](https://console.azion.com/) > **Edge Libraries** > **WAF Rules** e crie um conjunto de regras. Defina a sensibilidade de cada família em **Threat Type Configuration**.

2. **Abra o firewall**

   Vá para **Secure** > **Firewalls** e selecione ou crie o firewall.

3. **Ative Web Application Firewall**

   Na aba **Main Settings**, em **Modules**, ative **Web Application Firewall** e selecione **Save**.

4. **Aplique o conjunto de regras**

   Na aba **Rules Engine**, crie uma regra com o comportamento *Set WAF*. Em **Select a WAF**, selecione o conjunto de regras. Em **Select a WAF mode**, selecione *Logging*.

5. **Vincule o firewall ao workload**

   No workload, em **Deployment Settings**, selecione o firewall em **Firewall**.

O firewall aplica o conjunto de regras às requisições do workload.

**CLI**

Para vincular um firewall com Azion CLI, passe `--firewall-id` para o deployment do workload. Para o conjunto de regras e a regra, siga [Primeiros passos com WAF](/pt-br/documentacao/plataforma/firewall/waf/primeiros-passos/).

**API**

Para criar o conjunto de regras, envie uma requisição `POST` para o endpoint de WAF:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/wafs \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "active": true,
  "name": "My WAF",
  "product_version": "1.0",
  "engine_settings": {
    "engine_version": "2021-Q3",
    "type": "score",
    "attributes": {
      "rulesets": [1],
      "thresholds": [
        { "threat": "sql_injection", "sensitivity": "medium" }
      ]
    }
  }
}'
```

`rulesets` aceita apenas `[1]`. Depois aplique o conjunto de regras com uma regra de firewall cujo comportamento é `{ "type": "set_waf", "attributes": { "waf_id": <waf-rule-set-id>, "mode": "logging" } }`. A API recusa `learning` como modo.

Converta cada regra personalizada da Cloudflare em critérios de firewall. As variáveis do firewall diferem das variáveis da aplicação: o caminho é `${request_uri}`, e uma faixa de endereços vai em uma Network List comparada com `${network}`.

```text
# Expressão da Cloudflare
(http.request.uri.path contains "/admin" and not ip.src in {10.0.0.0/8})

# Critérios da Azion
${request_uri}  starts with     /admin
and
${network}      is not in list  <network-list-id>   (uma Network List que contém 10.0.0.0/8)
```

O critério `${network}` requer Network Shield no firewall. Para as variáveis e os operadores, consulte [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/).

---

## Conte com DDoS Protection

[DDoS Protection](/pt-br/documentacao/plataforma/workloads/#ddos-protection) está ativado em todo workload, sem nada para criar e nada para configurar. Ele mitiga ataques volumétricos, de protocolo e de camada de aplicação, como floods UDP e ICMP, SYN floods, fragmentação de pacotes, floods HTTP e slowloris, nas camadas 3, 4, 6 e 7.

| Aspecto        | Cloudflare DDoS Protection                 | Azion DDoS Protection                                                                  |
| -------------- | ------------------------------------------ | -------------------------------------------------------------------------------------- |
| Ativação       | Automática                                 | Automática, e não pode ser desativada                                                  |
| Camadas        | 3, 4 e 7                                   | 3, 4, 6 e 7                                                                            |
| Cobrança       | Sem medição                                | Sem medição para as camadas 3 e 4. A mitigação na camada 7 pode gerar tráfego cobrável |
| Personalização | Regras gerenciadas e regras personalizadas | Regras de firewall personalizadas                                                      |

Um firewall mostra a chave **DDoS Protection Unmetered** em **Main Settings** > **Modules**, sempre ativada. Na API, `modules.ddos_protection` é somente leitura. DDoS Protection não tem limiares, chaves por regra nem alertas. Para uma mitigação direcionada, escreva regras personalizadas no firewall vinculado ao workload. O Security Response Team é um add-on dos suportes Enterprise e Mission-Critical. Para os tipos de ataque, consulte [Mitigação de ataques](/pt-br/documentacao/plataforma/workloads/ddos-protection/ddos-mitigation/).

[Network Shield](/pt-br/documentacao/plataforma/firewall/network-shield/primeiros-passos/) é um módulo diferente do firewall. Ele compara o endereço do cliente com uma Network List de endereços IP, faixas CIDR, ASNs ou países, por meio do critério `${network}`. Use-o para bloquear ou permitir conjuntos de clientes, restringir países ou aplicar rate limit a um conjunto de clientes.

---

## Recrie o gerenciamento de bots

[Bot Manager](/pt-br/documentacao/plataforma/firewall/bot-manager/primeiros-passos/) pontua cada requisição e age conforme a pontuação. Bot Manager Lite é a função do Marketplace incluída em todos os planos, e Bot Manager completo está disponível no Enterprise.

| Aspecto     | Cloudflare Bots                                                      | Azion Bot Manager                                                                                                                     |
| ----------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| Detecção    | Machine learning, heurísticas, fingerprinting e detecções JavaScript | Regras estáticas, um método comportamental dinâmico no Bot Manager completo, fingerprints de dispositivo e Network Lists de reputação |
| Desafio     | Detecções JavaScript, Managed Challenge e Turnstile                  | Uma JavaScript Tag para fingerprinting e ALTCHA pela ação `redirect`                                                                  |
| Ações       | Allow, Managed Challenge e Block                                     | `allow`, `custom_html`, `deny`, `drop`, `hold_connection`, `random_delay` e `redirect`                                                |
| Versão Lite | Bot Fight Mode                                                       | Bot Manager Lite                                                                                                                      |

Bot Manager Lite pontua uma requisição com 26 regras estáticas, em relação a um `threshold` cujo padrão é 30, e executa a ação `deny` por padrão. Ele também pode verificar o cliente em Network Lists de reputação. Os níveis de tolerância pertencem às regras dinâmicas do Bot Manager completo, que Bot Manager Lite não tem.

Para configurar Bot Manager Lite no Azion Console:

1. **Instale a integração**

   Acesse [Azion Console](https://console.azion.com/) > **Marketplace**, busque **Bot Manager Lite** e selecione **Install**. A instalação tem efeito imediato.

2. **Abra o firewall**

   Vá para **Firewalls** e selecione um firewall com o módulo **Functions** ativado.

3. **Crie a instância de função**

   Na aba **Functions Instances**, crie uma instância do Bot Manager Lite. Para mais informações, consulte [Functions instances](/pt-br/documentacao/plataforma/firewall/functions-instances/). Nos argumentos JSON, defina `threshold` e `action`.

4. **Execute a função**

   Na aba **Rules Engine**, crie uma regra com o comportamento *Run Function* e a instância.

5. **Vincule o firewall ao workload**

O firewall pontua as requisições do workload. Para cada argumento, consulte [Instale Bot Manager Lite](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/bot-manager-lite/) e [Bot Manager Lite](/pt-br/documentacao/plataforma/firewall/bot-manager/bot-manager-lite/). Para saber como uma função roda em um firewall, consulte [Functions para Firewall](/pt-br/documentacao/plataforma/firewall/functions/). A proteção contra bots de terceiros também está disponível pela integração [Radware Bot Manager](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/radware-bot-manager/).

Para bloquear um cliente pelo seu user agent, adicione uma regra de firewall:

```text
Criteria: ${header_user_agent} matches BadBot
Behavior: Deny (403 Forbidden)
```

`${header_user_agent}` requer o módulo WAF no firewall e suporta apenas *matches* e *does not match*. O firewall não tem comportamento de permissão: para isentar um cliente, adicione um critério *does not match* à regra de bloqueio ou ordene as regras. Um cliente pode enviar qualquer user agent, então verifique um bot legítimo de outra forma. Para verificar a regra:

```bash
curl -A "BadBot/1.0" https://<your-domain>/
```

A resposta é `403`, com a página de erro Forbidden. Uma requisição com o user agent de um navegador recebe a resposta normal.

---

## Recrie os rate limits

A Azion limita a taxa de requisições de duas formas, e cada uma cobre uma parte diferente do que as regras de rate limiting da Cloudflare fazem. Use o comportamento nativo *Set Rate Limit* de uma regra de firewall para limitar as requisições por segundo ou por minuto, por endereço IP do cliente ou entre todos os clientes. Use a integração [Upstash Rate Limiting](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/upstash-rate-limiting-integration/), um rate limit com penalidade executado como função de firewall, para chaves personalizadas, janelas personalizadas ou um período de penalidade.

| Recurso            | *Set Rate Limit* nativo                   | Função Upstash Rate Limiting                                                                      |
| ------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------- |
| Chave de contagem  | Endereço IP do cliente ou global          | Qualquer combinação de metadados da requisição, headers e hostname                                |
| Janela             | Por segundo ou por minuto                 | Qualquer intervalo em segundos ou minutos, com limites diferentes para diferentes horários do dia |
| Algoritmo          | Leaky bucket, contado em cada data center | Fixed window, sliding window ou token bucket, contado globalmente                                 |
| Resposta           | `429`, sem header de rate limit           | `429` no limite e `403` durante uma penalidade                                                    |
| Ação apenas de log | Nenhuma                                   | Nenhuma                                                                                           |
| Requisitos         | Nenhum                                    | Uma conta Upstash e Global Database                                                               |

### Use o rate limit nativo

Um comportamento *Set Rate Limit* conta as requisições a que sua regra corresponde. Os critérios da regra definem o escopo do limite, como o caminho com `${request_uri}`. **Rate Limit Type** é *Req/s* ou *Req/min*, e **Limit By** é *Client IP address* ou *Global*. **Average Rate Limit** aceita no mínimo 1, e **Maximum Burst Size** aceita no mínimo 1 e se aplica apenas a *Req/s*. Nenhum comportamento pode vir depois de *Set Rate Limit* em uma regra. Uma regra cujos critérios unem vários caminhos com `or` compartilha uma contagem entre todos eles.

**Console**

Para criar o rate limit no Azion Console:

1. **Abra o firewall**

   Acesse [Azion Console](https://console.azion.com/) > **Secure** > **Firewalls** e selecione o firewall.

2. **Vá para a aba Rules Engine**

3. **Selecione + Rule**

4. **Defina os critérios**

   Em **Criteria**, selecione `${request_uri}`, o operador *starts with* e `/api/` como argumento.

5. **Adicione o comportamento Set Rate Limit**

   Em **Behaviors**, selecione *Set Rate Limit*. Defina **Rate Limit Type** como *Req/s*, **Limit By** como *Client IP address*, **Average Rate Limit** como `10` e **Maximum Burst Size** como `10`.

6. **Selecione Save**

A regra aparece na lista de regras do firewall.

**CLI**

Para criar a regra com Azion CLI, salve o corpo da regra do painel API em um arquivo. Depois passe o arquivo com `--file` para o comando de regra de firewall. Para os comandos, consulte [Primeiros passos com Firewall](/pt-br/documentacao/plataforma/firewall/primeiros-passos/).

**API**

Para criar o rate limit, envie uma requisição `POST` para as regras de requisição do firewall:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/firewalls/<firewall-id>/request_rules \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "api rate limit",
  "active": true,
  "criteria": [
    [{ "variable": "${request_uri}", "conditional": "if", "operator": "starts_with", "argument": "/api/" }]
  ],
  "behaviors": [
    { "type": "set_rate_limit", "attributes": { "type": "second", "limit_by": "client_ip", "average_rate_limit": 10, "maximum_burst_size": 10 } }
  ]
}'
```

A resposta traz `"state": "pending"` e a regra.

Uma requisição além da taxa e do burst recebe `429`, com a página de erro intitulada Too Many Requests. Para saber como a taxa e o burst admitem requisições, consulte [Set Rate Limit](/pt-br/documentacao/plataforma/firewall/rules-engine/#set-rate-limit).

### Use o rate limit com penalidade

A função Upstash Rate Limiting mantém seus contadores em um Upstash Global Database. Por isso, ela conta cada requisição em toda a rede, e não em cada data center. Uma requisição durante uma penalidade recebe `403 Forbidden`. Uma requisição válida é contada, e a função retorna `429 Too Many Requests` quando a contagem atinge o limite.

Para configurá-la no Azion Console:

1. **Instale a integração**

   Acesse [Azion Console](https://console.azion.com/) > **Marketplace**, busque `Upstash Rate Limiting` e selecione **Install**.

2. **Abra o firewall**

   Vá para **Firewalls** e abra um firewall com **Functions** ativado em **Modules**.

3. **Crie a instância de função**

   Na aba **Functions Instances**, crie uma instância. Em **Function**, selecione a função Upstash Rate Limiting e edite os **Arguments** em JSON.

4. **Execute a função**

   Na aba **Rules Engine**, crie uma regra com critérios como `Host` *matches* `yourdomain.com` e o comportamento *Run Function* com a instância.

5. **Vincule o firewall ao workload**

   Execute o comando da CLI que cria o deployment do workload com 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
   ```

A função conta as requisições a que a regra corresponde. Estes argumentos definem uma sliding window de 2 requisições a cada 20 segundos, da meia-noite ao meio-dia UTC, com uma penalidade de 45 segundos:

```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
    }
  ]
}
```

| Argumento                                            | Descrição                                                                                                           |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `upstash_redis_rest_url`, `upstash_redis_rest_token` | A URL REST e o token do banco de dados Upstash que guarda os contadores e as penalidades                            |
| `rate_limit_prefix`                                  | Um prefixo para cada chave, que mantém separadas duas instâncias da função                                          |
| `rate_limit_key_metadata`                            | Os metadados da requisição que formam a chave, como `remote_addr`                                                   |
| `rate_limit_key_header`                              | Os headers que formam a chave                                                                                       |
| `rate_limit_key_hostname`                            | Quando `true`, o hostname faz parte da chave                                                                        |
| `rate_limit_repenalize`                              | Quando `true`, cada requisição durante uma penalidade a reinicia                                                    |
| `rate_limits`                                        | As janelas, pelo menos uma. Quando duas janelas se sobrepõem, vale a primeira da lista                              |
| `algorithm`                                          | `fixed_window`, `sliding_window` ou `token_bucket`                                                                  |
| `requests`                                           | As requisições permitidas no intervalo                                                                              |
| `interval`                                           | A janela, como um número e `s` ou `m`. Por exemplo: `"120 s"`                                                       |
| `start`, `end`                                       | O horário do dia que a janela cobre, em UTC no formato de 24 horas. Os padrões são `00:00` e `23:59`                |
| `penalty_in_seconds`                                 | Por quanto tempo um cliente que excede o limite recebe `403`. Sem ele, a janela é um rate limit simples             |
| `max_tokens`, `refil_rate`                           | O tamanho do bucket e a recarga por intervalo de uma janela `token_bucket`. `refil_rate` é a grafia que a função lê |

A chave une o prefixo e cada valor que os argumentos selecionam. Neste exemplo, ela é `my_rate_limit + client IP + x-a-custom-header value + hostname`, como `my_rate_limit_127.0.0.1_Value_azion.com`. Para a configuração completa, consulte [Instale a integração Upstash Rate Limiting](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/upstash-rate-limiting-integration/).

---

## Reconstrua o monitoramento

A Azion divide a observabilidade em três produtos. [Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/) mostra agregados ao longo do tempo em gráficos, [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/) responde a consultas sobre requisições individuais, e [Data Stream](/pt-br/documentacao/plataforma/data-stream/) envia os logs para destinos externos.

### Real-Time Metrics

| Aspecto               | Cloudflare Analytics                                 | Azion Real-Time Metrics                                                                          |
| --------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Atualização dos dados | Quase em tempo real                                  | Até 10 minutos para agregar                                                                      |
| Retenção              | 30 dias nos planos gratuitos, 1 ano nos planos pagos | 2 anos, exceto 90 dias para `httpBreakdownMetrics` e 60 dias para `botManagerBreakdownMetrics`   |
| Método de consulta    | Dashboard e API                                      | Dashboards, **Copy query**, **Export CSV** e a API GraphQL                                       |
| Métricas              | Requisições, largura de banda e erros                | Requisições, dados transferidos, códigos de status, offload de cache e tempo médio de requisição |
| Granularidade         | Agregados por minuto                                 | 1 minuto abaixo de 2,5 dias, 1 hora até 60 dias e 1 dia acima disso                              |

Os dashboards de Applications mostram:

- **Requests**: total de requisições, requisições por método e por esquema e **Average Request Time**, o tempo médio em segundos que a Azion leva para processar e responder a uma requisição.
- **Status Codes**: as respostas 2XX, 3XX, 4XX e 5XX e a tabela **Requests by Status and Upstream Status**, que distingue erros da Azion de erros da origem.
- **Data Transferred**: dados e largura de banda economizados e perdidos e **Edge Offload**.
- Cache: **Requests Offloaded**, **Saved Requests** e **Missed Requests**.

Real-Time Metrics não informa latência, tempo até o primeiro byte nem tempo de resposta da origem. Para ler o status de cache das requisições, filtre um dashboard por **Upstream Cache Status**, cujos valores incluem `HIT`, `MISS`, `STALE` e `EXPIRED`. Para encontrar erros da origem, filtre por **Upstream Status**, que é `0` quando a origem não respondeu.

Para abrir os dashboards, acesse [Azion Console](https://console.azion.com/) > **Real-Time Metrics**. Ele abre em **Build** > **Applications** > **Data Transferred**, nos **Last 5 minutes**. Para restringir um dashboard a um workload, adicione o filtro **Domain** ou **Workload**. Para exportar um gráfico, abra seu menu **More options** e selecione **Export CSV**.

Para consultar os mesmos dados, envie uma consulta GraphQL para `https://api.azion.com/v4/metrics/graphql`:

```graphql
query {
  workloadMetrics(limit: 3, filter: { tsRange: {begin: "2026-10-01T14:00:00", end: "2026-10-03T14:00:00"} }, aggregate: { sum: requests }, groupBy: [ts], orderBy: [ts_DESC]) {
    ts
    sum
  }
}
```

Substitua as datas por um intervalo dentro do período de retenção. Um intervalo fora dele retorna um array vazio. `limit` aceita até 10.000 linhas e tem padrão 10. O dataset `httpMetrics` de consultas antigas ainda funciona, mas está obsoleto. Para cada campo, consulte [Campos GraphQL do Real-Time Metrics](/pt-br/documentacao/devtools/graphql/campos-gql-real-time-metrics/) e [Crie dashboards](/pt-br/documentacao/plataforma/real-time-metrics/dashboards-build/). Para dashboards no Grafana, consulte [Dashboards personalizados do plugin Grafana](/pt-br/documentacao/guias/plataforma/observabilidade/azion-plugin-grafana/) e [dashboards pré-configurados](/pt-br/documentacao/guias/plataforma/observabilidade/azion-plugin-grafana-dash-pre-configurado/). Para ler os dashboards, consulte [Analise métricas](/pt-br/documentacao/guias/plataforma/observabilidade/analisar-metricas/). Para medições de usuários reais, use [Edge Pulse](/pt-br/documentacao/plataforma/edge-pulse/).

### Real-Time Events

| Aspecto  | Cloudflare Logs         | Azion Real-Time Events                             |
| -------- | ----------------------- | -------------------------------------------------- |
| Acesso   | API pull e push para S3 | Consultas no Azion Console ou na API GraphQL       |
| Atraso   | Minutos                 | Até 30 segundos                                    |
| Retenção | Configurável            | 7 dias. Para uma retenção maior, use Data Stream   |
| Formato  | JSON                    | Respostas GraphQL com os campos que você seleciona |

Real-Time Events não precisa de configuração. Suas fontes de dados são **HTTP Requests**, **Functions**, **Functions Console**, **Image Processor**, **Tiered Cache**, **Edge DNS**, **Data Stream** e **Activity History**. Os resultados do WAF são campos de **HTTP Requests**.

Para consultar os eventos no Azion Console:

1. **Abra Real-Time Events**

   Acesse [Azion Console](https://console.azion.com/) > **Products menu** > **Observe** > **Real-Time Events**.

2. **Selecione a fonte de dados**

   Selecione a fonte de dados, como **HTTP Requests**.

3. **Defina o período e os filtros**

   Defina o **Time Filter**, que abre nos últimos 15 minutos, e adicione condições em **Filter by**.

4. **Selecione Refresh**

A tabela de resultados lista os eventos. Selecione uma linha para abrir o registro completo.

Para consultar os mesmos dados, envie uma consulta GraphQL para `https://api.azion.com/v4/events/graphql`. O dataset `workloadEvents` guarda as requisições HTTP:

```graphql
query {
  workloadEvents(
    limit: 100
    filter: { tsRange: { begin: "2026-10-07T00:00:00", end: "2026-10-07T01:00:00" } }
    orderBy: [ts_DESC]
  ) {
    ts
    remoteAddress
    requestUri
    status
    upstreamResponseTime
  }
}
```

Substitua as datas por um intervalo dentro dos últimos 7 dias. `upstreamResponseTime` mostra `-` para uma resposta entregue a partir do cache. Para cada campo, consulte [Campos GraphQL do Real-Time Events](/pt-br/documentacao/devtools/graphql/campos-gql-real-time-events/) e [Investigue requisições com a API GraphQL](/pt-br/documentacao/guias/plataforma/observabilidade/investigar-requisicoes-api-graphql/).

### Data Stream

| Aspecto  | Cloudflare Logs         | Azion Data Stream                                                   |
| -------- | ----------------------- | ------------------------------------------------------------------- |
| Acesso   | API pull e push para S3 | Push para um destino externo                                        |
| Atraso   | Minutos                 | Lotes de 2.000 registros ou 60 segundos, entregues em até 3 minutos |
| Retenção | Configurável            | Definida pelo destino                                               |
| Formato  | JSON                    | Templates que selecionam os campos                                  |
| Destinos | S3, Azure e GCS         | 11 tipos, listados abaixo                                           |

Um stream envia uma fonte de dados para um destino:

- **Armazenamento**: Amazon S3, Azure Blob Storage e Azion Object Storage, pelo tipo S3.
- **Monitoramento**: Datadog, Splunk, Elasticsearch e Azure Monitor.
- **Streaming**: AWS Kinesis Data Firehose e Apache Kafka.
- **Analytics**: Google BigQuery.
- **Segurança**: IBM QRadar.
- **Personalizado**: Standard HTTP/HTTPS POST.

Um stream precisa de exatamente um entre sampling e um filtro de workload. Salvar um stream ativo com sampling desativa todos os outros streams da conta. Streams com filtro coexistem.

**Console**

Para criar um stream no Azion Console:

1. **Abra Data Stream**

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

2. **Selecione + Stream**

3. **Selecione a fonte de dados**

   Em **Input**, selecione a **Data Source**: *Activity History*, *Applications*, *Functions* ou *WAF Events*.

4. **Selecione o template**

   Em **Render Template**, selecione o **Template**.

5. **Selecione o destino**

   Em **Output**, selecione o **Connector**, como *Simple Storage Service (S3)*, e informe suas credenciais.

6. **Ative Active e selecione Save**

O stream começa a enviar depois de 1 a 2 minutos.

**CLI**

Para criar um stream com Azion CLI, siga o painel CLI de [Primeiros passos com Data Stream](/pt-br/documentacao/plataforma/data-stream/primeiros-passos/).

**API**

Para criar um stream, envie uma requisição `POST` para `https://api.azion.com/v4/workspace/stream/streams`. O corpo tem `inputs`, `transform` e `outputs`:

```json
{
  "name": "activity-to-bucket",
  "active": true,
  "inputs": [
    { "type": "raw_logs", "attributes": { "data_source": "activity_history" } }
  ],
  "transform": [
    { "type": "sampling", "attributes": { "rate": 100 } },
    { "type": "render_template", "attributes": { "template": 251 } }
  ],
  "outputs": [
    {
      "type": "s3",
      "attributes": {
        "host_url": "https://s3.us-east-005.azionstorage.net",
        "bucket_name": "<your-bucket>",
        "region": "us-east-005",
        "access_key": "[ACCESS KEY]",
        "secret_key": "[SECRET KEY]",
        "object_key_prefix": "activity",
        "content_type": "plain/text"
      }
    }
  ]
}
```

Um `POST` retorna `201`. Para um stream de Applications, use `"data_source": "workloads"`. Sem sampling nem filtro de workload, a criação falha com `32002`, e com ambos falha com `32007`. Os templates são criados em `/v4/workspace/stream/templates`.

Para um destino Object Storage, a credencial precisa de `listAllBucketNames`, `listBuckets`, `listFiles` e `writeFiles`, ou todo envio falha com `503`. Para os campos, consulte [Configurações do stream](/pt-br/documentacao/plataforma/data-stream/configuracoes-do-stream/) e [Endpoints](/pt-br/documentacao/plataforma/data-stream/endpoints/). Para guias de destinos, consulte [Amazon S3](/pt-br/documentacao/guias/plataforma/observabilidade/amazon-s3-endpoint/), [Azion Object Storage](/pt-br/documentacao/guias/plataforma/observabilidade/conector-azion-object-storage/), [Datadog](/pt-br/documentacao/guias/plataforma/observabilidade/datadog-endpoint/), [Splunk](/pt-br/documentacao/guias/plataforma/observabilidade/splunk-endpoint/), [Elasticsearch](/pt-br/documentacao/guias/plataforma/observabilidade/elasticsearch-endpoint/), [Kinesis](/pt-br/documentacao/guias/plataforma/observabilidade/amazon-kinesis-endpoint/), [BigQuery](/pt-br/documentacao/guias/plataforma/observabilidade/google-bigquery-endpoint/) e [Configure o sampling](/pt-br/documentacao/guias/plataforma/observabilidade/configurar-sampling/).

---

## Prepare o certificado

[Certificate Manager](/pt-br/documentacao/plataforma/workloads/certificate-manager/primeiros-passos/) guarda os certificados que os workloads servem. Prepare o certificado antes de o domínio apontar para a Azion, para que os usuários acessem o projeto por HTTPS desde a primeira requisição.

| Área                               | Cloudflare SSL/TLS                                                                            | Azion Certificate Manager                                                                                                                                      |
| ---------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Escopo                             | Edge Certificates, certificados de origem, modos de criptografia, mTLS e configurações de TLS | Certificados TLS para workloads                                                                                                                                |
| Opções de certificado              | Universal SSL, certificados avançados e certificados personalizados                           | Azion SAN, Let's Encrypt, certificados personalizados e certificados Trusted CA para mTLS                                                                      |
| Certificado gerenciado padrão      | O Universal SSL cobre o apex e os subdomínios de primeiro nível                               | Let's Encrypt para seus próprios domínios. Azion SAN cobre o domínio de workload `azionedge.net` e o hostname `azion.app`                                      |
| Certificados gerenciados avançados | Mais controle sobre a CA, os hostnames e a validade                                           | Nenhuma camada equivalente. Use Let's Encrypt para um certificado DV gerenciado, ou um certificado personalizado para controle total                           |
| Certificados personalizados        | Emissão e renovação gerenciadas pelo cliente                                                  | Upload de um certificado e sua chave privada, de domínio único ou SAN, com chaves RSA 2048 ou P-256                                                            |
| Validação                          | Validação de controle de domínio, automática com o DNS da Cloudflare                          | Desafios HTTP-01 ou DNS-01 do Let's Encrypt                                                                                                                    |
| Renovação                          | Gerenciada para Universal SSL e certificados avançados                                        | Os certificados Let's Encrypt são renovados a partir de 30 dias antes da expiração de 90 dias. Os certificados personalizados seguem seu próprio ciclo de vida |
| Criptografia até a origem          | Modos de criptografia SSL/TLS, como Full e Full Strict                                        | **Transport Protocol Policy** do connector: *Preserve*, *Force HTTPS* ou *Force HTTP*                                                                          |
| CA de origem                       | Certificados Origin CA para a conexão entre a Cloudflare e a origem                           | Sem Origin CA. Proteja a origem com Origin Shield no connector, por meio de Origin IP ACL e HMAC                                                               |
| mTLS                               | Certificados de cliente, BYOCA e Authenticated Origin Pulls                                   | Certificados Trusted CA. Azion SAN não suporta mTLS                                                                                                            |

A Azion emite um certificado Let's Encrypt sem custo adicional assim que você escolhe um preset Let's Encrypt. Escolha o desafio conforme onde o DNS responde:

- **HTTP-01** precisa que o hostname, e cada nome alternativo, já apontem para a Azion.
- **DNS-01** funciona antes da migração. Em um provedor de DNS externo, adicione um CNAME de `_acme-challenge.<domain>` para `<domain>.letsencrypt.azion.com`. No Edge DNS, o registro é automático.

Para uma migração a partir da Cloudflare, use DNS-01.

**Console**

Para solicitar o certificado no Azion Console:

1. **Abra o workload**

   Acesse [Azion Console](https://console.azion.com/) > **Workloads** e selecione ou crie o workload.

2. **Informe os domínios**

   Em **Domains**, informe cada hostname a que o projeto responde. Wildcards são recusados.

3. **Ative o HTTPS**

   Em **Protocol Settings**, ative **HTTPS support**.

4. **Selecione o certificado**

   Em **Digital Certificate**, selecione *New Let's Encrypt Certificate (DNS-01)*.

5. **Selecione Save**

A primeira tentativa acontece em até 5 minutos depois de salvar, e as novas tentativas seguem aos 5, 10, 15, 20 e 30 minutos, depois em um ritmo mais lento. O status passa de `pending` para `challenge_verification` e depois para `active` ou `failed`.

Para enviar um certificado que você já tem, acesse **Certificate Manager** e crie um certificado digital com o preset **Server Certificate**. Cole o certificado PEM e a chave privada. Os certificados intermediários vão no mesmo campo do certificado. Depois selecione-o no campo **Digital Certificate** do workload. Para os passos, consulte [Faça upload de um certificado digital](/pt-br/documentacao/guias/seguranca-de-aplicacoes/tls-e-certificados/certificado-digital/), e para cada campo de certificado, [Certificados](/pt-br/documentacao/plataforma/workloads/certificate-manager/certificados/).

**CLI**

Para definir o mTLS ou o certificado de um workload com Azion CLI, execute `azion update workload --file` com o corpo do workload. Para os comandos de certificado, consulte [Primeiros passos com Certificate Manager](/pt-br/documentacao/plataforma/workloads/certificate-manager/primeiros-passos/).

**API**

Para enviar um certificado, envie uma requisição `POST` para o endpoint de certificados:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/tls/certificates \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "my-certificate",
  "type": "edge_certificate",
  "certificate": "-----BEGIN CERTIFICATE-----\n<certificate-body>\n-----END CERTIFICATE-----\n",
  "private_key": "-----BEGIN PRIVATE KEY-----\n<private-key-body>\n-----END PRIVATE KEY-----\n"
}'
```

A API responde `201`. Cada PEM é uma string JSON com quebras de linha `\n`. Para solicitar um certificado Let's Encrypt, envie uma requisição `POST` para `/v4/workspace/tls/certificates/request` com `name`, `"authority": "lets_encrypt"`, `challenge` (`http` ou `dns`), `common_name` e, opcionalmente, `alternative_names`.

Para servir o certificado, defina seu ID em `tls.certificate` do workload, ou `null` para Azion SAN:

```json
{
  "name": "my-workload",
  "active": true,
  "infrastructure": 1,
  "domains": ["www.example.com"],
  "tls": { "certificate": 12345, "ciphers": 4, "minimum_version": "tls_1_2" }
}
```

`infrastructure` `1` é produção. `minimum_version` aceita `tls_1_0`, `tls_1_1`, `tls_1_2` ou `tls_1_3` e tem padrão `tls_1_3`. `ciphers` aceita de 1 a 8 e tem padrão 7. Envie o corpo para `https://api.azion.com/v4/workspace/workloads`.

Se o certificado não ficar ativo, leia seus campos `status` e `status_detail`. Para HTTP-01, verifique se o hostname aponta para a Azion. Para DNS-01, verifique o CNAME `_acme-challenge`. As novas tentativas continuam conforme o cronograma, então um registro corrigido emite o certificado mais tarde. Para as regras de emissão, consulte [Emissão e renovação](/pt-br/documentacao/plataforma/workloads/certificate-manager/emissao-e-renovacao/).

O mTLS precisa de um certificado Trusted CA, e um certificado gerado pela Azion não pode ser o Trusted CA. A equipe de vendas ativa o mTLS na conta. Depois defina `mtls.enabled`, `mtls.config.certificate` e `verification`, `enforce` ou `permissive`, no workload pela API ou com `azion update workload --file`. O mTLS funciona apenas por HTTPS. Para os passos, consulte [Configure o mTLS em um workload](/pt-br/documentacao/guias/seguranca-de-aplicacoes/tls-e-certificados/associar-um-certificado-mtls/) e [mTLS](/pt-br/documentacao/plataforma/workloads/mtls/).

---

## Mova zonas DNS para Edge DNS

Mover a zona para [Edge DNS](/pt-br/documentacao/plataforma/edge-dns/) dá à Azion todos os registros do domínio, incluindo o apex. Toda zona usa os mesmos três nameservers, `ns1.aziondns.net`, `ns2.aziondns.com` e `ns3.aziondns.org`. Pule esta etapa quando mantiver o provedor de DNS atual e apontar apenas subdomínios, como mostra Aponte o domínio para o workload.

| Aspecto           | Cloudflare DNS                            | Azion Edge DNS                                                             |
| ----------------- | ----------------------------------------- | -------------------------------------------------------------------------- |
| Nameservers       | Atribuídos por zona                       | `ns1.aziondns.net`, `ns2.aziondns.com` e `ns3.aziondns.org` para toda zona |
| Tipos de registro | A, AAAA, CNAME, MX, TXT, SRV, NS e outros | A, AAAA, ANAME, CAA, CNAME, DS, MX, NS, PTR, SRV e TXT                     |
| DNSSEC            | Suportado                                 | Suportado                                                                  |
| API               | API REST                                  | `/v4/workspace/dns/zones`                                                  |

Recrie cada registro da Cloudflare com seu tipo:

| Registro | Uso na Azion                                                                                |
| -------- | ------------------------------------------------------------------------------------------- |
| A        | Endereço IPv4                                                                               |
| AAAA     | Endereço IPv6                                                                               |
| ANAME    | Alias do apex para um hostname da Azion, como o domínio do workload. Seu TTL precisa ser 20 |
| CNAME    | Alias para outro nome. Guarda exatamente um valor e não pode ficar no apex                  |
| MX       | Troca de e-mail, com sua prioridade                                                         |
| TXT      | Texto, como SPF e DKIM                                                                      |
| SRV      | Registros de serviço, um por nome                                                           |
| CAA      | Autoridades certificadoras autorizadas a emitir para o domínio                              |
| NS       | Delegação de um subdomínio                                                                  |
| DS       | Delegation signer de uma zona filha assinada                                                |
| PTR      | Consulta reversa                                                                            |

Edge DNS recusa outros tipos, como SOA. Os registros A, AAAA, ANAME, DS, MX e NS guardam até 10 valores cada.

**Console**

Para criar a zona no Azion Console:

1. **Abra Edge DNS**

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

2. **Selecione + Zone**

3. **Informe a zona**

   Informe um **Name** para a zona e o **Domain Name**. O domínio não pode mudar depois que a zona é criada.

4. **(Opcional) Ative o DNSSEC**

   Em **DNSSEC**, ative **Enable DNSSEC**.

5. **Selecione Save**

6. **Adicione os registros**

   Na aba **Records**, crie cada registro da zona da Cloudflare.

A zona responde nos nameservers da Azion. Depois altere os nameservers do domínio no registrador.

**CLI**

Para criar zonas e registros com Azion CLI, siga o painel CLI de [Primeiros passos com Edge DNS](/pt-br/documentacao/plataforma/edge-dns/primeiros-passos/). Flags booleanas precisam de `=`, como `--active=false`.

**API**

Para criar a zona e um registro, envie requisições `POST` para o endpoint de zonas:

```bash
curl -X POST https://api.azion.com/v4/workspace/dns/zones \
  -H "Authorization: Token [TOKEN VALUE]" \
  -H "Content-Type: application/json" \
  -d '{"name":"example-zone","domain":"example.com","active":true}'
```

```bash
curl -X POST https://api.azion.com/v4/workspace/dns/zones/<zone-id>/records \
  -H "Authorization: Token [TOKEN VALUE]" \
  -H "Content-Type: application/json" \
  -d '{"name":"www","type":"A","rdata":["192.0.2.1"],"ttl":3600}'
```

Uma zona precisa de `name`, `domain` e `active`. Um registro recebe seu `name` relativo à zona, seu `type` e `rdata` como um array de strings, como `["192.0.2.1"]` para um registro A ou `["mail.example.com"]` para um CNAME. Para ativar o DNSSEC, envie `{"enabled": true}` em uma requisição `PATCH` para `/v4/workspace/dns/zones/<zone-id>/dnssec`.

Com o DNSSEC ativado, Edge DNS mostra quatro valores DS: **Key Tag**, **Algorithm** `13`, **Digest Type** `2` e **Digest**. Recarregue a página depois de salvar para vê-los. Adicione-os no registrador, que pode levar até 48 horas para publicá-los. Para os passos, consulte [DNSSEC](/pt-br/documentacao/plataforma/edge-dns/dnssec/).

Para verificar a migração, consulte os nameservers e os registros:

```bash
dig example.com NS +short
dig @ns1.aziondns.net example.com A
dig +dnssec example.com DNSKEY
```

O primeiro comando lista os três nameservers da Azion assim que a mudança no registrador se propaga. O segundo mostra a resposta do Edge DNS antes que a mudança chegue a todos os resolvers. Com o DNSSEC ativado, o terceiro retorna dois registros DNSKEY, com flags `257` e `256` e algoritmo `13`. Não consulte um nome novo antes de o registro dele existir: Edge DNS mantém a resposta negativa em cache por uma hora. Para mais comandos, consulte [Execute o comando dig](/pt-br/documentacao/guias/seguranca-de-aplicacoes/dns/executar-o-comando-dig/) e [Execute o comando traceroute](/pt-br/documentacao/guias/seguranca-de-aplicacoes/dns/executar-o-comando-traceroute/).

---

## Aponte o domínio para o workload

A mudança de DNS é a virada: assim que o domínio resolve para o workload, os usuários acessam o projeto pela Azion. Trate-a como uma transição controlada. Antes da virada, confirme que:

- O certificado está ativo.
- O hostname está nos **Domains** do workload.
- Os registros DNS estão prontos.
- As rotas críticas e os redirecionamentos respondem como esperado no domínio do workload. Para testá-los com o hostname real antes da virada, consulte [Teste uma aplicação pelo arquivo hosts](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/primeiros-passos/testar-edge-application-atraves-do-arquivo-hosts/).
- O monitoramento está pronto para acompanhar o tráfego depois da virada.

Aponte cada nome com o registro que sua zona permite:

| Estratégia  | Use para                                                           | Registro                                    |
| ----------- | ------------------------------------------------------------------ | ------------------------------------------- |
| CNAME       | Um subdomínio, mantendo o provedor de DNS atual                    | `www CNAME <your-workload-domain>`          |
| Nameservers | O apex e todos os outros nomes, com Edge DNS respondendo pela zona | Um ANAME no apex para o domínio do workload |

Para verificar um CNAME:

```bash
dig www.example.com CNAME +short
```

A resposta é o domínio do workload, como `xxxxxxxxxx.map.azionedge.net`. Mudanças de DNS levam tempo para se propagar. Para as configurações do domínio personalizado no Console, consulte [Aponte um domínio para um workload](/pt-br/documentacao/guias/plataforma/migracao/apontar-dominio-para-a-azion/). Para mover os nameservers, consulte [Migre os nameservers para a Azion](/pt-br/documentacao/guias/plataforma/migracao/migrar-ns-para-a-azion/).

---

## Próximos passos

- [Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/primeiros-passos.md): Acompanhe requisições, dados transferidos, códigos de status e offload de cache depois da virada.
- [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/primeiros-passos.md): Consulte requisições individuais, logs de funções e resultados do WAF dos últimos 7 dias.
- [Web Application Firewall](/pt-br/documentacao/plataforma/firewall/waf/primeiros-passos.md): Mude o conjunto de regras de Logging para Blocking quando o tráfego estiver limpo.
- [Azion CLI](/pt-br/documentacao/devtools/cli.md): Faça o deploy, vincule e gerencie o projeto a partir de um terminal.
- [Comunidade Azion](https://discord.gg/azion): Pergunte à comunidade Azion no Discord como outras pessoas rodam seus projetos na Azion.
- [Suporte Azion](/pt-br/documentacao/suporte.md): Abra um ticket com a equipe de suporte quando a migração precisar de ajuda.
