---
name: azion-migre-da-fastly-para-a-azion
description: >-
  Migre um serviço da Fastly para a Azion: recrie a entrega, a lógica VCL, o código do Compute, o cache e a segurança, mova os dados e troque o domínio.
---

# Migre da Fastly para a Azion

Um serviço da Fastly acumula anos de lógica de entrega: várias origens, snippets VCL, condições, pacotes do Compute, dictionaries e cache overrides. Ao redor dele ficam a automação de TLS, as políticas de WAF, os endpoints de logging e os dashboards dos inspectors. Movê-lo significa recriar cada camada na Azion e confirmar o comportamento antes da mudança do domínio.

Na Azion, uma [aplicação](/pt-br/documentacao/plataforma/applications/) e suas regras assumem a entrega, o roteamento e o cache, e os [connectors](/pt-br/documentacao/plataforma/connectors/) guardam as origens. [Functions](/pt-br/documentacao/plataforma/functions/) executa o código do Compute. [KV Store](/pt-br/documentacao/plataforma/kv-store/) e [Object Storage](/pt-br/documentacao/plataforma/object-storage/) guardam os dados. [Firewall](/pt-br/documentacao/plataforma/firewall/) filtra o tráfego, e um [workload](/pt-br/documentacao/plataforma/workloads/) atende o domínio. [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/) substituem os inspectors e os endpoints de logging.

Cada etapa deste guia move uma camada, na ordem em que uma migração acontece: inventário, entrega, código e regras, dados, segurança, monitoramento e o domínio. Origens, políticas de cache, redirecionamentos, headers e acesso aos dados migram com mudanças pontuais de configuração. 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 Fastly, com acesso aos seus serviços, versões de serviço, pacotes do Compute, armazenamentos de dados e configurações de TLS.
- Acesso aos registros DNS ou ao registrador de cada domínio que você move.
- `curl` e `dig`, para verificar as respostas 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 Fastly

Mova um serviço primeiro, e não o mais complexo da conta. Escolha um serviço que teste o caminho completo e ainda migre rápido. Um bom primeiro serviço tem um ou dois domínios, algumas origens, regras de cache, redirecionamentos e headers. Ele também pode ter um pacote do Compute e um destino de logging. Use-o para documentar o processo e encontrar os padrões que sua equipe reutiliza. Depois expanda: VCL mais complexo, mais serviços Compute, os dados armazenados, a observabilidade e as regras de segurança.

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

- Serviços ativos e suas versões de serviço.
- Domínios e certificados TLS.
- Origens, shielding, health checks e lógica de failover.
- Configurações de cache, chaves de cache, comportamento de conteúdo expirado e fluxos de purge.
- Condições, snippets VCL, VCL personalizado e configurações de requisição e de resposta.
- Pacotes do Compute e seus runtimes de linguagem, com o `fastly.toml` e as configurações de CI/CD que fazem o deploy deles.
- Dictionaries, dados do Config Store, valores do Secret Store e Edge Data Storage.
- Buckets do Object Storage, otimização de imagens, streaming, WebSocket e tráfego do AI Accelerator.
- Políticas de WAF, controles de bots, proteções contra DDoS e rate limits.
- Endpoints de logging, dashboards dos inspectors e os alertas que dependem deles.

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

---

## Mapeie cada produto da Fastly para a Azion

Todo produto da Fastly 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 Fastly           | O que cobre                                                                                                        | Destino na Azion                                                                                                                                                                 |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| AI Accelerator              | Cache semântico e aceleração de tráfego para APIs de IA generativa                                                 | [AI Inference](/pt-br/documentacao/plataforma/ai-inference/) e Cache                                                                                                             |
| Bot Management              | Detecção de tráfego automatizado e resposta a ele                                                                  | [Bot Manager](/pt-br/documentacao/plataforma/firewall/bot-manager/primeiros-passos/) e [Bot Manager Lite](/pt-br/documentacao/plataforma/firewall/bot-manager/bot-manager-lite/) |
| Cache APIs                  | Interação programática com o cache para aplicações Compute                                                         | Functions, Cache e [Real-Time Purge](/pt-br/documentacao/plataforma/applications/cache/real-time-purge/)                                                                         |
| Cache Reservation           | Capacidade de cache reservada para conteúdo                                                                        | [Cache](/pt-br/documentacao/plataforma/applications/#cache), incluindo [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/)                           |
| Certainly                   | Autoridade certificadora da Fastly para certificados TLS                                                           | [Certificate Manager](/pt-br/documentacao/plataforma/workloads/certificate-manager/certificados/)                                                                                |
| Compute                     | Computação serverless que executa código personalizado na rede da Fastly                                           | Functions                                                                                                                                                                        |
| Compute packages            | Código de aplicação empacotado para deploy no Compute                                                              | Functions e [Azion CLI](/pt-br/documentacao/devtools/cli/)                                                                                                                       |
| Conditions                  | Condições de requisição, de cache e de resposta                                                                    | [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/)                                                                                      |
| DDoS Protection             | Visibilidade e mitigação de DDoS                                                                                   | [DDoS Protection](/pt-br/documentacao/plataforma/workloads/#ddos-protection)                                                                                                     |
| Domain Inspector            | Visibilidade e relatórios de tráfego por domínio                                                                   | Real-Time Metrics                                                                                                                                                                |
| Domains                     | Hostnames associados aos serviços                                                                                  | Workloads                                                                                                                                                                        |
| Edge Data Storage           | Dados chave-valor usados pelos serviços Compute                                                                    | KV Store                                                                                                                                                                         |
| Edge Rate Limiting          | Contagem de requisições e ação quando os limites são excedidos                                                     | [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/) e [Functions para Firewall](/pt-br/documentacao/plataforma/firewall/functions/)              |
| Fanout                      | Padrões de mensagens publish-subscribe                                                                             | Functions e [WebSocket Proxy](/pt-br/documentacao/plataforma/applications/websocket/)                                                                                            |
| Fastly API                  | Gerenciamento programático de recursos da Fastly                                                                   | [Azion API](/pt-br/documentacao/devtools/api/)                                                                                                                                   |
| Fastly CLI                  | Fluxo de linha de comando para serviços e projetos Compute                                                         | Azion CLI                                                                                                                                                                        |
| Fastly services             | O recurso de entrega para domínios, origens, cache, tratamento de requisições e versões de serviço                 | Applications, atendido por Workloads                                                                                                                                             |
| Fastly Terraform Provider   | Infraestrutura como código para recursos da Fastly                                                                 | [Terraform Provider](/pt-br/documentacao/devtools/terraform/)                                                                                                                    |
| Full-Site Delivery          | Entrega de sites, aplicações, APIs e conteúdo para dispositivos móveis                                             | Applications                                                                                                                                                                     |
| High Volume Logging         | Streaming de logs em tempo real para destinos externos                                                             | Data Stream                                                                                                                                                                      |
| Hosts and origins           | Configuração das origens de backend dos serviços de entrega                                                        | Connectors                                                                                                                                                                       |
| Image Optimizer             | Transformação e otimização de imagens em tempo real                                                                | [Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/primeiros-passos/)                                                                                 |
| Log Explorer & Insights     | Inspeção e monitoramento de dados de log                                                                           | Real-Time Events                                                                                                                                                                 |
| Media Shield for Live       | Offload da origem para vídeo ao vivo                                                                               | Tiered Cache, com [Origin Shield](/pt-br/documentacao/plataforma/connectors/#origin-shield) para restringir a origem                                                             |
| Media Shield for VOD        | Offload da origem para vídeo sob demanda                                                                           | Tiered Cache, com Origin Shield para restringir a origem                                                                                                                         |
| Next-Gen WAF                | Detecção de tráfego suspeito e proteção de aplicações                                                              | [Web Application Firewall](/pt-br/documentacao/plataforma/firewall/waf/primeiros-passos/)                                                                                        |
| Object Storage              | Armazenamento de objetos compatível com S3                                                                         | Object Storage                                                                                                                                                                   |
| Observability features      | Visibilidade de tráfego, segurança, performance e origem                                                           | Real-Time Metrics, Real-Time Events e Data Stream                                                                                                                                |
| Origin Inspector            | Visibilidade e relatórios das respostas da origem                                                                  | Real-Time Metrics e Real-Time Events                                                                                                                                             |
| Platform TLS                | Gerenciamento de certificados e chaves orientado por API                                                           | Certificate Manager e Azion API                                                                                                                                                  |
| Request settings            | Manipulação, encaminhamento e tratamento de requisições                                                            | Rules Engine para Applications e Functions                                                                                                                                       |
| Response settings           | Headers de resposta e comportamento de entrega                                                                     | Rules Engine para Applications                                                                                                                                                   |
| Shielding                   | Encaminhamento dos cache misses por um local de shield intermediário                                               | Tiered Cache. Origin Shield, um módulo de Connectors, restringe a origem aos endereços da Azion                                                                                  |
| Streaming Delivery          | Entrega de streaming ao vivo e de vídeo sob demanda                                                                | Applications, Cache e Object Storage                                                                                                                                             |
| TLS Service Options         | Configurações de TLS para servir sites por HTTPS                                                                   | Certificate Manager e Workloads                                                                                                                                                  |
| VCL snippets and custom VCL | Lógica personalizada para redirecionamentos, headers, chaves de cache, seleção de origem e controle de requisições | Rules Engine para Applications e Functions                                                                                                                                       |
| WebSockets                  | Conexões bidirecionais de longa duração                                                                            | WebSocket Proxy e a [API WebSocket](/pt-br/documentacao/devtools/runtime/api-reference/websocket/)                                                                               |

---

## Recrie o serviço na Azion

Na Azion, um serviço da Fastly se divide em três recursos. Um connector guarda a origem, uma aplicação guarda as regras e o cache, e um workload atende a aplicação em seus domínios.

| Aspecto                      | Fastly                                                     | Azion                                                                                                                                                 |
| ---------------------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| Recurso principal de entrega | Serviço e versão de serviço                                | Aplicação, atendida por um workload                                                                                                                   |
| Domínios                     | Domínios do serviço                                        | Os **Domains** de um workload                                                                                                                         |
| Origens                      | Hosts e backends                                           | Connectors                                                                                                                                            |
| Arquivo de configuração      | `fastly.toml`, VCL e a configuração da versão de serviço   | [`azion.config.js`](/pt-br/documentacao/devtools/cli/azion-config-js/), que também pode ser `azion.config.mjs` ou `azion.config.cjs`, e Azion Console |
| Lógica de comportamento      | Condições, configurações de requisição e de resposta e VCL | Rules Engine e Functions                                                                                                                              |
| Controle de cache            | Configurações de cache, VCL e surrogate keys               | Configurações de cache, Rules Engine e Real-Time Purge                                                                                                |
| Deployment do Compute        | Pacote do Compute                                          | Uma função e sua instância de função                                                                                                                  |
| Observabilidade              | Inspectors, endpoints de logging e Log Explorer            | Real-Time Metrics, Real-Time Events e Data Stream                                                                                                     |

| Tarefa           | Fastly CLI                                         | Azion CLI                                                                                       |
| ---------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| Instalar         | `brew install fastly/tap/fastly`                   | `curl -fsSL https://cli.azion.app/install.sh \| bash`, ou `brew install azion`                  |
| Entrar           | `fastly profile create`                            | `azion login`                                                                                   |
| Rodar localmente | `fastly compute serve`                             | `azion dev`                                                                                     |
| Fazer o deploy   | `fastly compute publish`, ou a ativação do serviço | `azion link`, depois `azion deploy`                                                             |
| Ver os logs      | Um endpoint de logging, ou Log Explorer            | `azion logs http` para as requisições, e `azion logs cells` para os logs de console das funções |
| Fazer purge      | `fastly purge`                                     | `azion purge --urls`, `--cachekey` ou `--wildcard`                                              |

Os dois subcomandos `azion logs` retornam os logs dos últimos 5 minutos. Para suas flags, consulte [Logs da Azion CLI](/pt-br/documentacao/devtools/cli/logs/).

### Entregue uma origem por meio de uma aplicação

Um serviço à frente de uma origem se torna a cadeia connector, aplicação, regra e workload. A regra envia toda requisição para o connector com *Set Connector*.

**Console**

Para montar a cadeia no Azion Console, crie quatro recursos, nesta ordem. São um connector do tipo HTTP, uma aplicação, uma regra da Request Phase com **Set Connector** e um workload. Os painéis Console de [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/) mostram cada campo. Crie um connector para cada origem, ou um connector com vários endereços, como mostra Balanceie o tráfego entre origens.

**CLI**

Para montar a cadeia com Azion CLI, declare-a no `azion.config.js`. Este arquivo guarda um connector, uma aplicação com uma configuração de cache e duas regras, e um workload:

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

export default defineConfig({
  connectors: [{
    name: 'primary-origin',
    type: 'http',
    attributes: {
      addresses: [{ address: 'origin.example.com' }],
      connectionOptions: { transportPolicy: 'force_https', host: 'origin.example.com' },
      modules: {
        loadBalancer: { enabled: false, config: null },
        originShield: { enabled: false, config: null }
      }
    }
  }],
  applications: [{
    name: 'main-app',
    active: true,
    cache: [{
      name: 'default-cache',
      stale: true,
      browser: { maxAgeSeconds: 3600 },
      edge: { maxAgeSeconds: 3600 }
    }],
    rules: {
      request: [
        {
          name: 'Send to origin',
          active: true,
          criteria: [[{ variable: '${uri}', conditional: 'if', operator: 'starts_with', argument: '/' }]],
          behaviors: [
            { type: 'set_connector', attributes: { value: 'primary-origin' } },
            { type: 'set_cache_policy', attributes: { value: 'default-cache' } }
          ]
        },
        {
          name: 'API routes bypass cache',
          active: true,
          criteria: [[{ variable: '${uri}', conditional: 'if', operator: 'starts_with', argument: '/api/' }]],
          behaviors: [{ type: 'bypass_cache' }]
        }
      ]
    }
  }],
  workloads: [{
    name: 'main-app',
    active: true,
    infrastructure: 1,
    deployments: [{
      name: 'main-app',
      current: true,
      active: true,
      strategy: { type: 'default', attributes: { application: 'main-app' } }
    }]
  }]
})
```

O `value` de um comportamento indica um recurso do mesmo arquivo pelo seu `name`. Um connector do tipo `http` precisa do seu objeto `modules`, mesmo com os dois módulos desativados. Na pasta do projeto, instale o pacote que o arquivo importa:

```bash
npm install -D @aziontech/config
```

Depois crie os recursos:

```bash
azion config apply
```

O comando mostra o ID de cada recurso que cria e depois uma linha que começa com `Configuration applied successfully`. *Bypass Cache* requer Application Accelerator, e a CLI o ativa na aplicação que o usa. Executá-lo de novo com o mesmo arquivo atualiza os mesmos recursos. Para cada chave, consulte [azion.config.js](/pt-br/documentacao/devtools/cli/azion-config-js/) e [azion config](/pt-br/documentacao/devtools/cli/config/).

**API**

A API cria cada recurso separadamente. Uma aplicação precisa apenas de `name`, e suas configurações de cache e suas regras são sub-recursos:

1. Crie o connector com uma requisição `POST` para `https://api.azion.com/v4/workspace/connectors`.
2. Crie a aplicação com uma requisição `POST` para `https://api.azion.com/v4/workspace/applications`.
3. Crie a regra com uma requisição `POST` para `/v4/workspace/applications/<application-id>/request_rules`.
4. Crie o workload com uma requisição `POST` para `/v4/workspace/workloads`.
5. Crie seu deployment com uma requisição `POST` para `/v4/workspace/workloads/<workload-id>/deployments`.

Cada resposta traz `"state": "pending"` e o `id` que a próxima requisição usa. Para cada corpo, consulte [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/).

### Faça o deploy de um projeto a partir do repositório

Um projeto do Compute ou um site com framework faz o deploy a partir do seu repositório. 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**

Na raiz do projeto, vincule-o à 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`. 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/).

### Verifique o deployment

O deployment responde em um domínio de workload que a Azion atribui sob `map.azionedge.net`, como `xxxxxxxxxx.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 serviço retorna para `/`. Envie a mesma requisição para cada rota crítica, como um endpoint `/health`. Um primeiro `200` sozinho comprova pouco: o comportamento do cache, os redirecionamentos, os headers e o roteamento para a origem ainda podem diferir da Fastly.

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 origem, feature flags, endpoints de terceiros e configurações operacionais. Uma variável que não chega à Azion quebra o serviço em tempo de execução, mesmo quando o deployment tem sucesso.

| Aspecto               | Fastly                                                       | Azion                                                                      |
| --------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------- |
| Acesso pelo código    | APIs de ambiente ou de secrets específicas de cada linguagem | `Azion.env.get('VARIABLE')`, ou `process.env.VARIABLE`                     |
| Dados de configuração | Dictionaries, Config Store e Secret Store                    | Variáveis de ambiente, KV Store e os argumentos de uma instância de função |
| Escopo                | O serviço ou o pacote do Compute                             | A conta, até 100 variáveis                                                 |

Procure variáveis no `fastly.toml` e no projeto do Compute, nos dictionaries e nas entradas do Config Store, no Secret Store, nas configurações de CI/CD e no código-fonte. Na Azion, cada variável tem uma chave, um valor e uma flag que a marca como secret. Dados que mudam por requisição, como uma tabela de roteamento, ficam melhor no KV Store. Um valor que pertence a uma instância de função vai nos seus argumentos, que o código lê de `ctx.args`.

**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/).

Uma função em produção lê uma variável com `Azion.env.get()`, e `process.env` continua funcionando:

```javascript diff
-// Before: Fastly Compute, where configuration access varies by runtime
-const apiKey = process.env.API_KEY;
 
+// After: Azion
+const apiKey = Azion.env.get('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()`. Para os argumentos da instância, consulte [Functions instances](/pt-br/documentacao/plataforma/applications/functions-instances/).

> **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 serviços do Compute para Functions

Os serviços do Compute carregam o tratamento de requisições, a orquestração de APIs, a personalização, a autenticação e a lógica de integração. 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               | Fastly Compute                                 | Azion Functions                                        |
| --------------------- | ---------------------------------------------- | ------------------------------------------------------ |
| Unidade de deployment | Pacote do Compute                              | Uma função e sua instância de função                   |
| Modelo de runtime     | Runtimes baseados em WebAssembly               | Funções geradas como JavaScript ou WebAssembly         |
| Handler               | Handler de requisição específico do runtime    | `export default { async fetch(request, env, ctx) {} }` |
| Variáveis             | APIs de ambiente específicas do runtime        | `Azion.env.get('VARIABLE')`                            |
| Dados da plataforma   | Edge Data Storage, Config Store e Secret Store | KV Store, Object Storage e variáveis de ambiente       |

Em uma função em produção, `env` é um objeto vazio, e `ctx` traz `args` e `waitUntil`. A Azion também executa o formato Service Worker, `addEventListener('fetch', ...)`, mas o objeto ES Modules é o handler recomendado:

```javascript diff
-// Before: Fastly Compute, JavaScript
-addEventListener('fetch', (event) => {
-  event.respondWith(handleRequest(event.request));
-});
-
-async function handleRequest(request) {
-  const url = new URL(request.url);
-  return new Response('Path: ' + url.pathname, {
-    status: 200,
-    headers: { 'Content-Type': 'text/plain' }
-  });
-}
 
+// After: Azion
+export default {
+  async fetch(request, env, ctx) {
+    const url = new URL(request.url);
+    return new Response('Path: ' + url.pathname, {
+      status: 200,
+      headers: { 'Content-Type': 'text/plain' }
+    });
+  }
+};
```

Para um projeto do Compute em outra linguagem, `azion list presets` inclui `rustwasm` para Rust e `emscripten` para C++. Uma linguagem sem preset, como Go, é reescrita em JavaScript. Em qualquer caso, o código que chama APIs da plataforma Fastly muda. Separe a lógica de negócio dessas chamadas e associe cada área à sua API da Azion:

| Área do código        | Na Azion                                                     |
| --------------------- | ------------------------------------------------------------ |
| Parsing da requisição | As APIs padrão `Request` e `URL`                             |
| Criação da resposta   | A API padrão `Response`                                      |
| Headers               | `request.headers` e os headers da resposta                   |
| Valores de ambiente   | `Azion.env.get()`                                            |
| Dados chave-valor     | `Azion.KV`, como mostra Mova Edge Data Storage para KV Store |
| Serviços externos     | `fetch()`                                                    |

Para os presets, consulte [Presets da Azion CLI](/pt-br/documentacao/devtools/cli/recursos/presets/). Para os formatos de handler, consulte [Handlers](/pt-br/documentacao/devtools/runtime/api-reference/handlers/), e para as APIs de runtime, [Web APIs](/pt-br/documentacao/devtools/runtime/api-reference/javascript/).

---

## Converta o VCL e as condições do serviço

O comportamento crítico para o negócio costuma ficar em snippets VCL, condições e configurações de requisição ou de resposta. A maior parte dele passa para o [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/). Reserve Functions para a lógica que precisa de código, como consultas externas, tokens assinados ou algoritmos personalizados.

| Lógica                     | Fastly                             | Azion                                                                                |
| -------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------ |
| Redirecionamentos simples  | VCL ou configurações de requisição | Uma regra com *Redirect To (301 Moved Permanently)* ou *Redirect To (302 Found)*     |
| Alterações de headers      | VCL ou configurações de resposta   | Uma regra com *Add Request Header*, *Filter Request Header* ou *Add Response Header* |
| Seleção de origem          | Seleção de backend no VCL          | Uma regra com *Set Connector*, que indica um connector                               |
| Correspondência de padrões | Condições e expressões VCL         | Critérios de regra, com o operador `matches` para uma expressão regular              |
| Lógica complexa            | VCL personalizado ou Compute       | Functions                                                                            |

Converta cada condição sobre o caminho em um critério de regra. Mova cada header que uma configuração de resposta adiciona para uma regra da Response Phase, e cada normalização de header de requisição para uma regra da Request Phase. Reconstrua a seleção de backend como um connector por origem, escolhido por *Set Connector* na regra correspondente. No `azion.config.js`, esses comportamentos são `redirect_to_301`, `add_request_header`, `filter_request_header`, `add_response_header` e `set_connector`. Para manter um caminho fora do cache, adicione *Bypass Cache*, `bypass_cache`, à sua regra.

Quando a aplicação responde de forma diferente do serviço da Fastly, compare a versão ativa do serviço com as regras e os connectors da aplicação. As causas comuns são uma regra, um ramo do VCL, uma chave de cache ou uma seleção de origem que não foi mapeada. Para ver quais regras rodam em uma requisição, consulte [Faça o debug de regras](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/primeiros-passos/debug-regras/).

---

## 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 Azion guarda os redirecionamentos nas regras da aplicação, que você escreve no Azion Console, na API ou no `azion.config.js`.

| Aspecto                    | Fastly                             | Azion                                                                                                               |
| -------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Configuração               | VCL ou configurações de requisição | [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/)                         |
| Correspondência de padrões | Condições e expressões VCL         | Expressões regulares com o operador `matches`, como `^/.*$`, além de `starts_with` e `is_equal`                     |
| Valores capturados         | `re.group.1`                       | `%{name[index]}`, como `%{capture[1]}` e `%{capture[2]}`, de um comportamento *Capture Match Groups* na mesma regra |

Um redirecionamento em VCL se torna uma regra com um critério, uma captura e um redirecionamento:

```text
# VCL da Fastly
if (req.url.path ~ "^/old/(.*)$") {
  set req.http.Location = "/new/" + re.group.1;
  error 750 "Moved Permanently";
}

# Regra da Azion
Criteria:  ${uri} matches ^/old/(.*)$
Behavior:  Capture Match Groups (array capture, subject ${uri}, regex ^/old/(.*)$)
Behavior:  Redirect To (301 Moved Permanently): /new/%{capture[1]}
```

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-path-redirect` e selecione **Request Phase**.

5. **Defina os critérios**

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

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

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

7. **Adicione o redirecionamento**

   Adicione um segundo comportamento, *Redirect To (301 Moved Permanently)*, com `/new/%{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-path-redirect",
  "criteria": [[{ "conditional": "if", "variable": "${uri}", "operator": "matches", "argument": "^/old/(.*)$" }]],
  "behaviors": [
    { "type": "capture_match_groups", "attributes": { "subject": "${uri}", "regex": "^/old/(.*)$", "captured_array": "capture" } },
    { "type": "redirect_to_301", "attributes": { "value": "/new/%{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/post
```

A resposta traz `301 Moved Permanently` e um header `location` que termina em `/new/post`. Uma regra nova pode levar alguns minutos para se propagar. Diante de uma resposta inesperada, aguarde e tente de novo antes de diagnosticar. Se o redirecionamento ainda falhar, teste a expressão regular e seus grupos de captura com os caminhos antigos.

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. Na Fastly, o VCL e as configurações de resposta os alteram. A Azion os adiciona com regras em qualquer uma das fases: *Add Request Header* altera a requisição enviada à origem, e *Add Response Header* altera a resposta enviada ao usuário.

| Aspecto           | Fastly                          | Azion                                                                            |
| ----------------- | ------------------------------- | -------------------------------------------------------------------------------- |
| Configuração      | VCL e configurações de resposta | Rules Engine para Applications, no Azion Console, na API ou no `azion.config.js` |
| Fases             | —                               | Requisição e resposta                                                            |
| Valores dinâmicos | —                               | 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`. Um header que depende de uma lógica que nenhuma regra expressa vai em uma função.

---

## Recrie as configurações de cache

Na Fastly, o cache depende das configurações do serviço, do VCL, das surrogate keys, dos cache overrides e das APIs de purge. 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           | Fastly                                          | Azion                                                                                                                                          |
| ----------------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| Política de cache | Configurações do serviço, VCL e cache overrides | Configurações de cache, aplicadas pelo Rules Engine                                                                                            |
| Chave de cache    | VCL e configuração de cache                     | Personalizável na configuração de cache, com os controles **Cache vary by**, que requerem Application Accelerator                              |
| TTL               | —                                               | **Max Age** de cada configuração de cache, de 0 a 31.536.000 segundos                                                                          |
| Shielding         | Um local de shield                              | [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/), uma segunda camada de cache ativada por configuração de cache |
| Purge             | URL, surrogate key e purge do serviço           | URL, chave de cache e wildcard                                                                                                                 |
| Conteúdo expirado | VCL e configurações de conteúdo expirado        | **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 `default-cache`.

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: `86400`.

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

   Ative **Tiered Cache** e selecione a **Tiered Cache Region**. Use-o onde o serviço da Fastly usava shielding.

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 `default-cache`.

**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": "default-cache",
  "browser_cache": { "behavior": "override", "max_age": 3600 },
  "modules": {
    "cache": {
      "behavior": "override",
      "max_age": 86400,
      "stale_cache": { "enabled": true },
      "tiered_cache": { "enabled": true, "topology": "nearest-region" }
    }
  }
}'
```

As configurações de cache são sub-recursos de uma aplicação. Para alterar uma, 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-default-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 `default-cache` 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. Os grupos vêm 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/).

Quando menos requisições vêm do cache depois da migração, compare a configuração de cache com o serviço da Fastly. Compare os controles **Cache vary by** com as chaves de cache, **Max Age** com os TTLs e Tiered Cache com o shielding.

A Azion não tem purge por surrogate key. Substitua cada `fastly purge` pelo endpoint de purge do tipo correspondente:

```bash diff
-# Before: Fastly purge by URL
-fastly purge --service-id SERVICE_ID https://www.example.com/images/logo.png
 
+# After: Azion 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://www.example.com/images/logo.png"],
+  "layer": "cache"
+}'
 
+# After: Azion 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://www.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`.

Azion CLI faz o purge da mesma forma:

```bash
azion purge --urls 'www.example.com/images/logo.png'
```

O comando responde `Purge carried out successfully`. Em um script, sempre passe `--urls`, `--cachekey` ou `--wildcard`: sem flag e sem terminal, o comando falha com `Error: EOF`. Para os tipos de purge, consulte [Real-Time Purge](/pt-br/documentacao/plataforma/applications/cache/real-time-purge/) e [azion purge](/pt-br/documentacao/devtools/cli/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                  | Fastly                          | Azion Load Balancer                                                                                                   |
| ------------------------ | ------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Recurso de origem        | Backend ou host                 | Endereços de um connector                                                                                             |
| Origens com peso         | Lógica de seleção de backend    | Um **Weight** para cada endereço                                                                                      |
| Métodos de balanceamento | —                               | *Round Robin*, *Least Connections* e *IP Hash*, que são `round_robin`, `least_conn` e `ip_hash` na API                |
| Health checks            | Health checks de backend        | Nenhum. O failover é passivo: **Max Retries** e os timeouts tratam uma conexão que falhou                             |
| Failover                 | VCL ou configurações do serviço | Vários endereços *Primary* com pesos e endereços *Backup* que recebem tráfego apenas quando todos os primários falham |
| Shielding                | Shielding                       | Tiered Cache, na configuração de cache. Origin Shield no connector restringe a origem aos endereços da Azion          |

Nenhum método direciona por localização ou por tempo de resposta medido, e não há afinidade por cookie: *IP Hash* associa cada endereço IP de cliente a um endereço. 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/) e [Connectors](/pt-br/documentacao/plataforma/connectors/).

---

## 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. Essa origem pode ser um servidor HTTP ou um bucket do Object Storage atrás de um connector.

| Aspecto            | Fastly Image Optimizer                               | Azion Image Processor                                                                          |
| ------------------ | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| Transformações     | Transformações de imagem em tempo real               | Redimensionamento, recorte, encaixe, formato, qualidade, rotação, preenchimento e marca d'água |
| Formato de URL     | Parâmetros de query ou opções de imagem configuradas | `/image.png?ims=<OPTIONS>`                                                                     |
| Formatos           | Formatos de imagem otimizados                        | WebP, AVIF, JPEG, GIF e PNG                                                                    |
| Caminho de entrega | O serviço da Fastly                                  | Uma aplicação com Image Processor ativado                                                      |
| Fonte das imagens  | A origem ou o armazenamento de objetos               | A origem da aplicação, como Object Storage                                                     |

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. Image Processor não tem configuração padrão de qualidade nem de formato: a URL de cada requisição os traz.

**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. A chave `image_processor` fica em `modules`, no nível da 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
# Fastly Image Optimizer
https://www.example.com/image.jpg?width=400&quality=85

# Azion
https://www.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. Verifique URLs de imagem representativas no domínio do workload antes da virada. Para cada parâmetro, consulte [Parâmetros de URL](/pt-br/documentacao/plataforma/applications/image-processor/parametros-de-url/).

---

## Mova streaming, WebSockets e Fanout

O tráfego de streaming, Media Shield, WebSocket e Fanout consome muita banda ou tem longa duração. Mova cada um conforme seu modelo de tráfego: mídia que vai para o cache, conexões de longa duração ou mensagens publish-subscribe.

| Recurso da Fastly               | Na Azion                                                                                                                                                                                                                  |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Streaming Delivery              | Uma aplicação com Cache, e Object Storage para os arquivos de mídia                                                                                                                                                       |
| Media Shield for Live e for VOD | Tiered Cache na configuração de cache, que reduz as requisições que chegam à origem                                                                                                                                       |
| WebSockets                      | [WebSocket Proxy](/pt-br/documentacao/plataforma/applications/websocket/) quando a origem é o servidor WebSocket, ou a [API WebSocket](/pt-br/documentacao/devtools/runtime/api-reference/websocket/) quando uma função é |
| Fanout                          | Functions com a API WebSocket, além de um serviço externo de publish-subscribe quando necessário                                                                                                                          |

Uma transmissão ao vivo que a Azion ingere chega por meio de um connector do tipo `live_ingest`. Ele recebe a transmissão por RTMP e a converte para HLS, e uma aplicação a entrega aos espectadores. Para o fluxo, consulte [Ingestão e entrega](/pt-br/documentacao/plataforma/connectors/live-ingest/ingestao-e-entrega/).

### Transporte conexões WebSocket

WebSocket Proxy e a API WebSocket estão disponíveis com os suportes Business, Enterprise ou Mission-Critical, ou com um contrato Reserved Capacity ou Saving Plan. Para solicitar acesso, entre em contato com o [Suporte Técnico](/pt-br/documentacao/suporte/).

Uma aplicação com WebSocket Proxy trata como conexão WebSocket toda requisição que traz os dois headers de upgrade, qualquer que seja o caminho:

| Header       | Valor       |
| ------------ | ----------- |
| `Upgrade`    | `websocket` |
| `Connection` | `upgrade`   |

Antes da virada:

1. Confirme que o cliente e a origem suportam WebSocket nativamente e que a origem aceita `Upgrade: websocket` e `Connection: upgrade`.
2. Envie os headers de upgrade apenas nas requisições que abrem uma conexão e mantenha as regras de cache e de imagem fora desses caminhos.
3. Teste um upgrade: uma conexão que abre retorna `101 Switching Protocols`. Qualquer outro status, mesmo um `2xx` ou um `3xx`, significa que o upgrade não foi concluído.
4. Faça o cliente reabrir uma conexão fechada. A Azion recicla as conexões keepalive a cada 15 minutos, aproximadamente, o que pode fechar uma conexão WebSocket ativa.

As regras de firewall podem inspecionar uma requisição WebSocket antes de o upgrade ser concluído. Depois da virada, acompanhe os eventos `websocket.connection.accepted`, `message.sent` e `message.received` no Real-Time Metrics e no Data Stream.

### Sirva WebSockets a partir de uma função

Quando uma função é o servidor WebSocket, `upgradeWebSocket(request)` aceita o upgrade e retorna um `response` e um `socket`. O runtime também oferece helpers que fazem broadcast de uma mensagem para todos os clientes conectados, o que cobre um padrão Fanout:

```javascript
export default {
  async fetch(request, env, ctx) {
    if (request.headers.get('upgrade') === 'websocket') {
      const { response, socket } = upgradeWebSocket(request);

      socket.addEventListener('message', (event) => {
        socket.send('received: ' + event.data);
      });

      return response;
    }

    return new Response('Expected WebSocket upgrade', { status: 400 });
  }
};
```

Uma requisição sem o header `upgrade` recebe `400` com `Expected WebSocket upgrade`. No `azion dev`, `upgradeWebSocket` não está definido, então teste a função em produção. Para a API, consulte [WebSocket](/pt-br/documentacao/devtools/runtime/api-reference/websocket/).

---

## Mova os padrões do AI Accelerator

Fastly AI Accelerator faz cache e acelera o tráfego para APIs de IA generativa. Na Azion, o destino depende do objetivo: executar a inferência, controlar o tráfego, observá-lo ou fazer cache das respostas.

| Aspecto                 | Fastly AI Accelerator                        | Azion                                                                                                                |
| ----------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| Padrão principal        | Cache semântico para o tráfego de APIs de IA | AI Inference, Functions e Cache                                                                                      |
| Controle de requisições | Lógica do serviço e do Compute               | Rules Engine e Functions                                                                                             |
| Observabilidade         | Logging e inspectors                         | Real-Time Events, Data Stream e Real-Time Metrics                                                                    |
| Execução de modelos     | APIs de IA externas aceleradas pela Fastly   | [AI Inference](/pt-br/documentacao/plataforma/ai-inference/), ou APIs de IA externas chamadas a partir de uma função |

Uma função pode continuar chamando o provedor de IA externo, com a chave em uma variável de ambiente:

```javascript
export default {
  async fetch(request, env, ctx) {
    const prompt = await request.text();

    return fetch('https://ai-provider.example.com/v1/chat/completions', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + Azion.env.get('AI_API_KEY')
      },
      body: JSON.stringify({ prompt })
    });
  }
};
```

A função retorna a resposta do provedor ao cliente. Para executar o modelo na Azion, chame-o pelo seu ID com `Azion.AI.run()`. AI Inference executa um catálogo de [modelos](/pt-br/documentacao/plataforma/ai-inference/modelos/) open source, e a chamada não precisa de credencial:

```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 na Azion, faça o deploy do template [AI Inference Starter Kit](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/frameworks/ai-inference-starter-kit/) a partir do Azion Console > **Create**.

---

## Mova Edge Data Storage para KV Store

[KV Store](/pt-br/documentacao/plataforma/kv-store/) guarda configurações, feature flags, personalização, metadados de autorização e estado leve. As chaves ficam em um namespace. Uma função abre o namespace com `Azion.KV.open()`, um global do runtime que não precisa de linha de import.

| Aspecto         | Fastly Edge Data Storage                  | Azion KV Store                                                                                              |
| --------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Modelo de dados | Contêineres chave-valor                   | Namespaces de pares chave-valor                                                                             |
| Acesso          | Pelo Compute                              | Por uma função, por meio de `Azion.KV`                                                                      |
| Usos comuns     | Configuração, flags e metadados de sessão | Estado de sessão, feature flags, tabelas de roteamento, preferências por usuário e contadores de rate limit |
| Consistência    | Depende da aplicação                      | Uma gravação fica visível em todos os lugares em até 60 segundos, ou dentro do `cacheTtl` da leitura        |

```javascript diff
-// Before: Fastly, where data access varies by product and runtime
-const value = await edgeData.get('feature:checkout');
-await edgeData.put('feature:checkout', 'enabled');
 
+// After: Azion
+const kv = await Azion.KV.open('my-namespace');
+const value = await kv.get('feature:checkout');
+await kv.put('feature:checkout', 'enabled');
```

`Azion.KV.open()` é o único ponto de entrada e é assíncrono. O namespace precisa existir antes, ou `open()` lança `NotFound`. `get()` retorna o valor como texto por padrão, e `null` para uma chave inexistente, assim como para uma chave expirada. Ele também retorna `json`, `arrayBuffer` ou `stream` quando o segundo argumento indica esse tipo.

KV Store não tem importação em massa. Nenhuma tela do Azion Console, comando da CLI, chamada de API ou recurso do Terraform lê ou grava chaves. Para mover os dados:

1. Exporte da Fastly as chaves, os valores, os metadados e as regras de expiração.

2. Crie o namespace pela API:

   ```bash
   curl --request POST \
     --url https://api.azion.com/v4/workspace/kv/namespaces \
     --header 'Authorization: Token [TOKEN VALUE]' \
     --header 'Content-Type: application/json' \
     --data '{ "name": "fastly-migration-kv" }'
   ```

   O namespace existe, e uma função pode abri-lo pelo nome. 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 expiração à opção `expiration`, em segundos Unix, ou a `expirationTtl`, em segundos com mínimo de 60. Antes da importação, mantenha os prefixos das chaves e verifique a codificação dos valores de texto, JSON e dados binários. Revise o código que trata uma chave inexistente. Teste os caminhos de leitura e gravação antes de mover o tráfego de produção. Se faltarem chaves depois da importação, exporte-as de novo, verifique o nome do namespace e verifique a codificação.

Para as operações de namespace e seus erros, consulte [Namespaces](/pt-br/documentacao/plataforma/kv-store/namespaces/). Para o cliente, consulte [API de runtime do KV Store](/pt-br/documentacao/devtools/runtime/api-reference/kv-store/) e [Gerencie KV Store com Functions](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/gerenciar-com-funcoes/).

---

## Mova Fastly Object Storage 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                  | Fastly Object Storage                  | Azion Object Storage                                            |
| ------------------------ | -------------------------------------- | --------------------------------------------------------------- |
| Protocolo                | Fluxos compatíveis com S3              | S3                                                              |
| Endpoint                 | O endpoint do Object Storage da Fastly | `s3.us-east-005.azionstorage.net`                               |
| Região                   | —                                      | `us-east-005`                                                   |
| Gerenciamento de objetos | Ferramentas compatíveis com S3         | Ferramentas compatíveis com S3, a API, a CLI e a API de runtime |
| Entrega aos usuários     | O serviço de entrega da Fastly         | Uma aplicação, por meio de um connector do tipo `storage`       |

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. Quando o acesso for negado, verifique primeiro o par de chaves e o endpoint.

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-fastly`, com o endpoint e as chaves do bucket da Fastly. Uma configuração do s3cmd guarda um endpoint.

3. Baixe os objetos da Fastly:

   ```bash
   s3cmd -c ~/.s3cfg-fastly sync s3://fastly-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. Use o endpoint S3 para gerenciar os objetos. Entregue-os aos usuários por meio de uma aplicação e de um connector, para que o tráfego tenha cache, segurança e seu domínio. O acesso do bucket aos workloads é `read_only`, `read_write` ou `restricted`, e uma credencial funciona de forma independente dele. 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/) e [Use um bucket como origem](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/bucket-como-connector/).

---

## 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              | Fastly Next-Gen WAF                           | Azion WAF                                                                                                              |
| -------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Proteção gerenciada  | Regras e signals do Next-Gen WAF              | Um ruleset gerenciado, pontuado por família de ameaças                                                                 |
| Lógica personalizada | Regras de WAF e condições                     | [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/)                                    |
| Ações                | Padrões de permissão, bloqueio, log e desafio | *Deny*, *Drop*, *Set Rate Limit*, *Set WAF*, *Run Function* e *Set Custom Response*. Não há comportamento de permissão |
| Modos                | —                                             | *Logging* e *Blocking*                                                                                                 |
| Ajuste               | Exclusão de signals e limiares                | Uma sensibilidade para cada família de ameaças, exceções de WAF e a aba **Tuning**                                     |
| Escopo               | O serviço ou o domínio                        | Um firewall vinculado ao workload                                                                                      |

`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*. Antes de aplicar o bloqueio, compare os falsos positivos, as regras mais acionadas e as exceções de que a aplicação precisa. 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": "Fastly Migration 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 de WAF da Fastly 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
# Intenção
Bloquear as requisições para /admin, exceto quando o IP do cliente está em uma rede aprovada.

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

# Comportamento da Azion
Deny (403 Forbidden)
```

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/). Para os campos do conjunto de regras, consulte [Conjuntos de regras WAF](/pt-br/documentacao/plataforma/firewall/waf/rule-sets/), e para código em um firewall, [Functions para Firewall](/pt-br/documentacao/plataforma/firewall/functions/).

---

## 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 nas camadas 3, 4, 6 e 7.

| Aspecto        | Fastly DDoS Protection                       | Azion DDoS Protection                                                                  |
| -------------- | -------------------------------------------- | -------------------------------------------------------------------------------------- |
| Ativação       | Configuração do produto e do serviço         | Automática, e não pode ser desativada                                                  |
| Camadas        | Mitigação nas camadas de rede e de aplicação | 3, 4, 6 e 7                                                                            |
| Personalização | Controles de segurança da Fastly             | Regras de firewall personalizadas                                                      |
| Visibilidade   | Dashboards e logs de segurança da Fastly     | Real-Time Metrics, Real-Time Events e Data Stream                                      |
| Cobrança       | —                                            | Sem medição para as camadas 3 e 4. A mitigação na camada 7 pode gerar tráfego cobrável |

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

Antes da virada, registre as premissas de DDoS, os processos de suporte e os caminhos de escalonamento da configuração da Fastly. Confirme o workload, o firewall e a configuração de Network Shield dele. Mantenha os procedimentos de rollback e de escalonamento prontos durante a janela da virada.

[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               | Fastly Bot Management                    | Azion Bot Manager                                                                                                                     |
| --------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| Detecção              | Signals e comportamento de bots          | Regras estáticas, um método comportamental dinâmico no Bot Manager completo, fingerprints de dispositivo e Network Lists de reputação |
| Ações                 | Padrões de permissão, bloqueio e desafio | `allow`, `custom_html`, `deny`, `drop`, `hold_connection`, `random_delay` e `redirect`                                                |
| Versão Lite           | Recursos da Fastly que dependem do plano | Bot Manager Lite, do Marketplace                                                                                                      |
| Integração com regras | Configuração de segurança da Fastly      | Uma regra *Run Function* no firewall                                                                                                  |

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 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 como `Googlebot`, 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>/
curl -A "Mozilla/5.0" https://<your-domain>/
```

A primeira resposta é `403`, com a página de erro Forbidden. A segunda, 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 Fastly Edge Rate Limiting faz. 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}`, ou o método, que requer WAF no firewall. **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/). KV Store também lista contadores de rate limit entre seus usos, para um contador que a própria função mantém.

---

## 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 e substitui Domain Inspector e Origin Inspector. [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/) responde a consultas sobre requisições individuais e substitui Log Explorer & Insights. [Data Stream](/pt-br/documentacao/plataforma/data-stream/) envia os logs para destinos externos e substitui High Volume Logging.

### Real-Time Metrics

| Aspecto          | Fastly Domain Inspector e Origin Inspector    | Azion Real-Time Metrics                                                                          |
| ---------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Escopo           | Relatórios de domínio e de origem             | Requisições, dados transferidos, códigos de status, offload de cache e tempo médio de requisição |
| Acesso           | A interface e as APIs da Fastly               | Dashboards, **Copy query**, **Export CSV** e a API GraphQL                                       |
| Casos de uso     | Tendências de tráfego e performance da origem | Tendências de tráfego, offload de cache e erros da Azion ou da origem                            |
| Foco da migração | Paridade de dashboards e alertas              | Dashboards, filtros, consultas GraphQL e Grafana                                                 |

Uma métrica leva até 10 minutos para agregar. Os dados ficam por 2 anos, exceto 90 dias para `httpBreakdownMetrics` e 60 dias para `botManagerBreakdownMetrics`. O intervalo é de 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 [Primeiros passos com Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/primeiros-passos/). Para dashboards no Grafana, consulte [Dashboards personalizados do plugin Grafana](/pt-br/documentacao/guias/plataforma/observabilidade/azion-plugin-grafana/). Para ler os dashboards, consulte [Analise métricas](/pt-br/documentacao/guias/plataforma/observabilidade/analisar-metricas/).

### Real-Time Events

| Aspecto         | Fastly Log Explorer & Insights        | Azion Real-Time Events                                          |
| --------------- | ------------------------------------- | --------------------------------------------------------------- |
| Acesso          | A interface da Fastly                 | Consultas no Azion Console ou na API GraphQL                    |
| Modelo de dados | Campos de log da Fastly               | Oito fontes de dados, listadas abaixo                           |
| Consultas       | Filtros do Explorer                   | Filtros do Console e GraphQL                                    |
| Casos de uso    | Debugging e investigação de segurança | Debugging, investigação de segurança e evidências de compliance |

Um registro pode ser consultado até 30 segundos depois do evento e fica disponível por 7 dias. Para uma retenção maior, use Data Stream. 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` e `upstreamHeaderTime` são campos brutos de `workloadEvents`, e `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/). Para ler um registro, consulte [Entenda os logs do Real-Time Events](/pt-br/documentacao/guias/plataforma/observabilidade/entender-logs/).

### Data Stream

| Aspecto  | Fastly High Volume Logging                      | Azion Data Stream                                              |
| -------- | ----------------------------------------------- | -------------------------------------------------------------- |
| Entrega  | Streaming de logs para endpoints configurados   | Push para um destino externo                                   |
| Formato  | Formatos de log específicos de cada endpoint    | Templates que selecionam os campos                             |
| Destinos | Serviços externos de logging e de armazenamento | 11 tipos, listados abaixo                                      |
| Fontes   | Logs dos serviços da Fastly                     | *Activity History*, *Applications*, *Functions* e *WAF Events* |

Os registros saem em lotes de 2.000 ou a cada 60 segundos e são entregues em até 3 minutos. A retenção é definida pelo destino. 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`.

Quando os logs não chegam ao destino, verifique o status do stream, as credenciais do destino e as variáveis que o template seleciona. 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 [Fontes de dados e variáveis](/pt-br/documentacao/plataforma/data-stream/fontes-de-dados-e-variaveis/). Para o sampling, consulte [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. Fastly Platform TLS, TLS Service Options e Certainly correspondem a ele. Prepare o certificado antes de o domínio apontar para a Azion, para que os usuários acessem o serviço por HTTPS desde a primeira requisição.

| Área                        | Fastly TLS                                               | Azion Certificate Manager                                                                                                                                      |
| --------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Certificados gerenciados    | Fluxos do Platform TLS e do Certainly                    | 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 personalizados | Certificados enviados por upload ou gerenciados pela API | Upload de um certificado e sua chave privada, de domínio único ou SAN, com chaves RSA 2048 ou P-256                                                            |
| Automação                   | A API da Fastly                                          | Azion Console e Azion API                                                                                                                                      |
| mTLS                        | Configuração de TLS e de segurança da Fastly             | Certificados Trusted CA. Azion SAN não suporta mTLS                                                                                                            |
| Associação                  | O serviço ou o domínio                                   | O workload                                                                                                                                                     |
| Renovação                   | —                                                        | 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 |

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 Fastly, 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 serviço 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/).

**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-custom-cert",
  "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`. Confirme que o hostname está nos **Domains** do workload. 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/), e para cada campo de certificado, [Certificados](/pt-br/documentacao/plataforma/workloads/certificate-manager/certificados/).

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

---

## 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 serviço pela Azion. Ela afeta os usuários, o SEO, a confiança na marca e a disponibilidade, então 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 a estratégia de nameservers, crie antes a zona no [Edge DNS](/pt-br/documentacao/plataforma/edge-dns/), com todos os registros da zona atual. Edge DNS aceita 11 tipos de registro: A, AAAA, ANAME, CAA, CNAME, DS, MX, NS, PTR, SRV e TXT. Um ANAME cria um alias do apex para um hostname da Azion, e seu TTL precisa ser 20. Depois defina os nameservers do domínio no registrador como `ns1.aziondns.net`, `ns2.aziondns.com` e `ns3.aziondns.org`. Para a zona e seus registros, consulte [Primeiros passos com Edge DNS](/pt-br/documentacao/plataforma/edge-dns/primeiros-passos/).

Para verificar um CNAME e a resposta com o hostname real:

```bash
dig www.example.com CNAME +short
curl -I https://www.example.com/
```

A resposta do `dig` é o domínio do workload, como `xxxxxxxxxx.map.azionedge.net`, e o `curl` retorna a resposta do workload. 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/). Para as configurações do workload, consulte [Workloads](/pt-br/documentacao/plataforma/workloads/).

---

## 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 serviço a partir de um terminal.
- [Comunidade Azion](https://discord.gg/azion): Pergunte à comunidade Azion no Discord como outras pessoas rodam seus serviços na Azion.
- [Suporte Azion](/pt-br/documentacao/suporte.md): Abra um ticket com a equipe de suporte quando a migração precisar de ajuda.
