---
name: azion-migre-da-akamai-para-a-azion
description: >-
  Migre uma property da Akamai para a Azion: recrie origens, regras, Cloudlets, EdgeWorkers e cache, mova os dados e troque o DNS.
---

# Migre da Akamai para a Azion

Uma configuração na Akamai distribui um site entre delivery properties, comportamentos de origem, Cloudlets, EdgeWorkers, dados do EdgeKV, políticas de segurança, zonas DNS, direcionamento de tráfego, armazenamento e streams de logs. Movê-la significa recriar cada um desses itens na Azion. Depois confirme que a property responde da mesma forma antes de qualquer mudança de hostname de produção.

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

Cada etapa deste guia move uma camada, na ordem em que uma migração acontece: inventário, a property, código e regras, dados, segurança, monitoramento e DNS. O DNS e o direcionamento de tráfego vêm por último, quando a entrega e a segurança respondem como esperado. 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/).
- Acesso à conta Akamai, com suas properties, políticas de Cloudlets, EdgeWorkers, dados do EdgeKV, configurações de segurança e zonas DNS.
- Acesso aos registros DNS ou ao registrador de cada hostname 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 Akamai

Mova uma property primeiro, e não a mais complexa do portfólio. Escolha uma que teste o caminho completo e ainda migre rápido. Uma boa primeira property tem um ou dois hostnames, algumas origens, regras de cache, redirecionamentos e headers. Ela também tem um Cloudlet ou um EdgeWorker e um destino de logs. Use-a para documentar o processo e depois mova regras mais complexas, mais EdgeWorkers, dados, monitoramento e segurança na mesma ordem.

Uma migração pode parecer completa quando a primeira requisição retorna `200` e ainda assim falhar depois. O comportamento do cache, a lógica de redirecionamento, o roteamento para a origem, os headers ou a aplicação das regras de segurança podem diferir da property original. Antes de criar qualquer coisa na Azion, liste do que a property depende:

- Properties ativas e versões de properties.
- Hostnames da property, edge hostnames, certificados e registros DNS.
- Servidores de origem, configurações de failover, health checks e padrões de shielding.
- Chaves de cache, TTLs, comportamento de conteúdo expirado, CP codes, cache tags e fluxos de purge.
- Regras, comportamentos, variáveis, critérios de correspondência e metadados avançados da property.
- Cloudlets, suas políticas, regras de correspondência e dependências de ativação.
- Bundles de EdgeWorkers, namespaces do EdgeKV e configuração de runtime.
- Políticas do App & API Protector, controles de bots, proteções de API e premissas do Prolexic.
- Zonas do Edge DNS, registros do DNS Manager e políticas do Global Traffic Management.
- Conteúdo do NetStorage, buckets de armazenamento de objetos e bancos de dados gerenciados.
- Streams do DataStream, dashboards do TrafficPeak, tags do mPulse, alertas e dependências de monitoramento externo.

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

---

## Mapeie cada produto da Akamai para a Azion

Todo produto da Akamai 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 Akamai                  | O que cobre                                                                                                                                | Destino na Azion                                                                                                                                                                                           |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Account Protector                  | Proteção contra abuso de contas e ataques de credenciais                                                                                   | Bot Manager e Firewall                                                                                                                                                                                     |
| Adaptive Media Delivery            | Entrega de vídeo online em larga escala                                                                                                    | Applications, Cache e Object Storage                                                                                                                                                                       |
| Akamai Functions                   | Execução serverless distribuída para workloads de aplicações e de IA                                                                       | Functions                                                                                                                                                                                                  |
| Akamai Inference Cloud             | Plataforma distribuída de inferência de IA                                                                                                 | [AI Inference](/pt-br/documentacao/plataforma/ai-inference/)                                                                                                                                               |
| Akamai TrafficPeak                 | Observabilidade para operações e visibilidade de segurança                                                                                 | Real-Time Metrics, Real-Time Events e Data Stream                                                                                                                                                          |
| API Acceleration                   | Otimização da performance e da confiabilidade de APIs                                                                                      | [Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/configuracoes/) e [Cache](/pt-br/documentacao/plataforma/applications/cache/cache-settings/)                 |
| API Gateway                        | Registro, roteamento, entrega e proteção de APIs                                                                                           | Applications, [Rules Engine](/pt-br/documentacao/plataforma/applications/rules-engine/), Functions e Firewall                                                                                              |
| API Prioritization Cloudlet        | Priorização do tráfego de APIs                                                                                                             | Rules Engine e Application Accelerator                                                                                                                                                                     |
| API Security                       | Fluxos de descoberta, monitoramento e proteção de APIs                                                                                     | Firewall, [Web Application Firewall](/pt-br/documentacao/plataforma/firewall/waf/primeiros-passos/) e Applications                                                                                         |
| App & API Protector                | Proteção de aplicações e APIs contra vulnerabilidades, abuso e ameaças distribuídas                                                        | Firewall, Web Application Firewall, [DDoS Protection](/pt-br/documentacao/plataforma/workloads/#ddos-protection) e [Bot Manager](/pt-br/documentacao/plataforma/firewall/bot-manager/primeiros-passos/)    |
| App Platform                       | Deployment gerenciado de aplicações em contêineres                                                                                         | [Orchestrator](/pt-br/documentacao/plataforma/orchestrator/), que provisiona e gerencia serviços em nós que você opera                                                                                     |
| Application Load Balancer Cloudlet | Balanceamento de carga de aplicações para performance e disponibilidade                                                                    | [Load Balancer](/pt-br/documentacao/plataforma/connectors/load-balancer/primeiros-passos/), um módulo de Connectors                                                                                        |
| Audience Segmentation Cloudlet     | Segmentação por cookie, testes A/B e padrões de afinidade de sessão                                                                        | Critérios do Rules Engine sobre cookies e grupos de dispositivos                                                                                                                                           |
| Bot Manager                        | Detecção de bots e resposta a tráfego automatizado                                                                                         | Bot Manager                                                                                                                                                                                                |
| Cloudlets                          | Aplicações de políticas para redirecionamentos, balanceamento de carga, controle de tráfego, releases em fases e tratamento de requisições | Rules Engine, Functions, Load Balancer e Firewall                                                                                                                                                          |
| Cloud Firewall                     | Controles de segurança de rede para workloads em nuvem                                                                                     | [Network Shield](/pt-br/documentacao/plataforma/firewall/network-shield/primeiros-passos/) e Firewall                                                                                                      |
| Cloud Wrapper                      | Camada de cache privada para offload da origem e redução de egress                                                                         | Cache com [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/). [Origin Shield](/pt-br/documentacao/plataforma/connectors/origin-shield/origin-ip-acl-e-hmac/) protege a origem |
| Content Protector                  | Proteção contra scraping de conteúdo e acesso automatizado abusivo                                                                         | Bot Manager, Firewall e Rules Engine                                                                                                                                                                       |
| Dedicated Delivery                 | Entrega de mídia em alto volume com requisitos de offload da origem                                                                        | Applications e Cache, com Tiered Cache                                                                                                                                                                     |
| DataStream                         | Feed de dados para ferramentas de monitoramento de terceiros                                                                               | Data Stream                                                                                                                                                                                                |
| DNS Infrastructure                 | Serviços de DNS para ambientes de provedores e empresas                                                                                    | Edge DNS                                                                                                                                                                                                   |
| DNS Manager                        | Interface de gerenciamento de registros DNS                                                                                                | Edge DNS                                                                                                                                                                                                   |
| Download Delivery                  | Entrega de arquivos grandes, software, jogos e assets de mídia                                                                             | Applications, Cache e Object Storage                                                                                                                                                                       |
| Edge DNS                           | DNS autoritativo                                                                                                                           | Edge DNS                                                                                                                                                                                                   |
| Edge Redirector Cloudlet           | Gerenciamento centralizado de redirecionamentos                                                                                            | Rules Engine                                                                                                                                                                                               |
| EdgeKV                             | Dados chave-valor distribuídos para EdgeWorkers                                                                                            | KV Store                                                                                                                                                                                                   |
| EdgeWorkers                        | Funções JavaScript que personalizam o comportamento de requisições e respostas                                                             | Functions, executado em uma aplicação por uma [instância de função](/pt-br/documentacao/plataforma/applications/functions-instances/)                                                                      |
| Firewall for AI                    | Proteção para LLMs e aplicações baseadas em IA                                                                                             | Firewall e AI Inference                                                                                                                                                                                    |
| Forward Rewrite Cloudlet           | Reescritas de URL para URLs limpas e semânticas                                                                                            | Rules Engine e Functions                                                                                                                                                                                   |
| Global Traffic Management          | Direcionamento de tráfego para performance e para evitar indisponibilidades                                                                | Load Balancer e registros ponderados no Edge DNS                                                                                                                                                           |
| Image & Video Manager              | Otimização de imagens e vídeos para dispositivos e condições de rede                                                                       | [Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/primeiros-passos/), para imagens                                                                                             |
| Input Validation Cloudlet          | Controles de validação de formulários e requisições                                                                                        | Firewall e [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/)                                                                                                             |
| Ion                                | Otimização da performance web, da confiabilidade e da experiência do usuário                                                               | Applications, Application Accelerator e Cache                                                                                                                                                              |
| Managed Databases                  | Bancos de dados relacionais gerenciados                                                                                                    | SQL Database                                                                                                                                                                                               |
| Media Services Live                | Ingestão e entrega de vídeo ao vivo                                                                                                        | [Live Ingest](/pt-br/documentacao/plataforma/connectors/live-ingest/ingestao-e-entrega/), entregue por uma aplicação                                                                                       |
| mPulse                             | Monitoramento de usuários reais e analytics da experiência digital                                                                         | Edge Pulse                                                                                                                                                                                                 |
| NetStorage                         | Armazenamento replicado para entrega de conteúdo                                                                                           | Object Storage                                                                                                                                                                                             |
| NodeBalancers                      | Balanceamento de carga nas camadas 4 e 7 para instâncias de computação                                                                     | Load Balancer                                                                                                                                                                                              |
| Object Storage                     | Armazenamento de objetos para dados e distribuição                                                                                         | Object Storage                                                                                                                                                                                             |
| Phased Release Cloudlet            | Controle de release gradual e rollback                                                                                                     | Rules Engine e Functions, ou endereços com pesos no Load Balancer                                                                                                                                          |
| Prolexic Solutions                 | Proteção contra DDoS para ambientes de infraestrutura, nuvem, híbridos e on-premise                                                        | DDoS Protection, com regras de firewall personalizadas                                                                                                                                                     |
| Request Control Cloudlet           | Controle de acesso e filtragem de requisições                                                                                              | Firewall e Rules Engine para Firewall                                                                                                                                                                      |

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

---

## Faça o deploy da property na Azion

Uma property da Akamai se torna uma aplicação e um workload na Azion. A aplicação guarda as regras, e cada servidor de origem se torna um [connector](/pt-br/documentacao/plataforma/connectors/). Uma regra com *Set Connector* envia as requisições para ele, e um workload atende a aplicação em um domínio.

| Aspecto              | Akamai                                                                  | Azion                                                                  |
| -------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| Recurso de entrega   | Property e versão da property                                           | Aplicação, atendida por um workload                                    |
| Hostnames            | Hostnames da property e edge hostnames                                  | **Domains** de um workload                                             |
| Origens              | Comportamentos de servidor de origem                                    | Connectors                                                             |
| Lógica de requisição | Regras, comportamentos e variáveis da property, Cloudlets e EdgeWorkers | Rules Engine e Functions                                               |
| Controle de cache    | Comportamentos de cache da property, CP codes e cache tags              | Configurações de cache, aplicadas pelo Rules Engine, e Real-Time Purge |
| Observabilidade      | TrafficPeak, DataStream, mPulse e relatórios                            | Real-Time Metrics, Real-Time Events, Data Stream e Edge Pulse          |

As tarefas do dia a dia passam para Azion CLI:

| Tarefa           | Fluxo na Akamai                                                       | Azion CLI                                                                                   |
| ---------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| Instalar         | Pacote Akamai CLI e CLIs dos produtos                                 | `curl -fsSL https://cli.azion.app/install.sh \| bash`, ou `brew install azion`              |
| Entrar           | Credenciais de API da Akamai e autenticação da CLI                    | `azion login`                                                                               |
| Rodar localmente | Sandbox do EdgeWorkers ou ferramentas locais da aplicação             | `azion dev`                                                                                 |
| Fazer o deploy   | Ativação da property, ativação do EdgeWorkers ou um pipeline de CI/CD | `azion link`, depois `azion deploy`, para um projeto em um repositório                      |
| Ler logs         | DataStream, relatórios ou dashboards dos produtos                     | `azion logs http` para requisições e `azion logs cells` para os logs de console das funções |
| Fazer purge      | Purge por URL, CP code, cache tag ou API                              | `azion purge --urls`, `--cachekey` ou `--wildcard`                                          |

Comece pelo connector para a origem da property:

**Console**

Para criar o connector no Azion Console:

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

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

2. **Inicie um novo connector**

3. **Dê um nome ao connector**

   Em **General**, informe `origin-connector` como **Name**.

4. **Selecione o tipo HTTP**

   Em **Connector Type**, selecione o tipo HTTP.

5. **Informe o hostname da origem**

   Em **Address Management**, informe o hostname da origem da Akamai em **Address**, sem protocolo nem porta.

6. **Envie o mesmo hostname no header Host**

7. **Conecte-se à origem apenas por HTTPS**

   Em **Transport Protocol Policy**, selecione a opção que usa apenas HTTPS.

8. **Selecione Create**

O connector existe na sua conta. Depois crie a aplicação, uma regra da Request Phase com *Set Connector* e o workload, como mostra [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/).

**CLI**

Para criar o connector com Azion CLI, salve seu corpo como `connector.json`, com o hostname da origem nos dois lugares:

```json
{
  "name": "origin-connector",
  "type": "http",
  "attributes": {
    "addresses": [
      { "address": "origin.example.com" }
    ],
    "connection_options": {
      "transport_policy": "force_https",
      "host": "origin.example.com"
    }
  }
}
```

Depois crie-o:

```bash
azion create connector --file connector.json
```

A saída traz o ID do connector. Crie a aplicação, a regra e o deployment do workload como mostra [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/).

**API**

Para criar o connector, envie uma requisição `POST` para o endpoint de connectors:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/connectors \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "origin-connector",
  "type": "http",
  "attributes": {
    "addresses": [{ "address": "origin.example.com" }],
    "connection_options": {
      "transport_policy": "force_https",
      "host": "origin.example.com"
    }
  }
}'
```

A resposta traz `"state": "pending"` e o connector com seu `id`. Load Balancer e Origin Shield começam desativados. Uma aplicação precisa apenas de um `name` em `POST /v4/workspace/applications`. Origens e configurações de cache não são campos da aplicação. Para montar o resto da cadeia, consulte [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/).

Para declarar a property no código, escreva a aplicação em um arquivo `azion.config.mjs`. Este arquivo guarda uma configuração de cache com TTL de 3.600 segundos, aplicada a toda requisição. Uma segunda regra ignora o cache para `/api/`:

```javascript
export default {
  applications: [
    {
      name: 'akamai-property-migration',
      active: true,
      applicationAcceleratorEnabled: true,
      cache: [
        {
          name: 'default-cache',
          browser: { maxAgeSeconds: 3600 },
          edge: { maxAgeSeconds: 3600 }
        }
      ],
      rules: {
        request: [
          {
            name: 'Set cache policy',
            active: true,
            criteria: [[{ variable: '${uri}', conditional: 'if', operator: 'starts_with', argument: '/' }]],
            behaviors: [{ 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' }]
          }
        ]
      }
    }
  ]
}
```

*Bypass Cache* requer Application Accelerator, que `applicationAcceleratorEnabled` ativa. Para enviar as requisições para a origem, adicione uma regra cujo comportamento é `set_connector`, com o nome ou o ID do connector em `value`. Execute `azion config apply` na pasta do projeto. O comando cria cada recurso e imprime seu ID. Para cada chave, consulte [azion.config.js](/pt-br/documentacao/devtools/cli/azion-config-js/).

Quando a property atende um projeto de framework em um repositório do GitHub, faça o deploy do repositório. No Azion Console, acesse **Create**, selecione a aba **Import from GitHub** e selecione **Connect with GitHub**. Depois selecione o repositório e o preset: *Next.js*, *Angular*, *Astro*, *Hexo*, *React* ou *Vue*. Para os campos, consulte [Importe um projeto do GitHub](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/automacao/importar-um-projeto-existente-do-github/).

Com Azion CLI, execute `azion link` na raiz do projeto, selecione o preset e depois execute `azion deploy`. O preset vai em `build.preset` de um `azion.config.js` que importa `defineConfig` de `@aziontech/config`. O preset de um projeto Next.js é `next`, e o pacote `azion` de exemplos antigos está obsoleto. 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/).

O deployment responde em um domínio de workload que a Azion atribui sob `map.azionedge.net`. Um workload novo pode levar vários minutos para atender seu primeiro deployment e responde `404` até lá. 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 a origem retorna para `/`. Envie a mesma requisição para cada rota crítica, como `/health`. Quando uma resposta diferir da Akamai, compare a versão ativa da property com as regras da aplicação e o connector. Para a cadeia completa, consulte [Applications](/pt-br/documentacao/plataforma/applications/), [Main Settings](/pt-br/documentacao/plataforma/applications/main-settings/) e [Connectors](/pt-br/documentacao/plataforma/connectors/).

---

## Mova as variáveis de ambiente

Os EdgeWorkers leem a configuração de variáveis da property, do EdgeKV ou de outros armazenamentos, conforme a implementação. Na Azion, as variáveis pertencem à conta, até 100 delas, e uma função as lê com `Azion.env.get()`. Cada variável tem uma chave, um valor e uma flag que a marca como secret.

**Console**

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

**CLI**

Para criar cada variável com Azion CLI:

```bash
azion create variables --key API_TOKEN --value <your-value> --secret true
```

A CLI responde com o UUID da nova variável, como `Created variable with UUID 00000000-0000-0000-0000-000000000001`. Para listar as variáveis, execute `azion list variables`. Para os outros comandos, consulte [variables](/pt-br/documentacao/devtools/cli/recursos/variables/).

**API**

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

Depois altere o código que lê o valor:

```javascript diff
-// Before: Akamai configuration access varies by EdgeWorkers implementation
-const apiToken = 'read-from-property-variable-or-secure-store';
 
+// After: Azion Functions
+const apiToken = Azion.env.get('API_TOKEN');
```

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

---

## Mova EdgeWorkers para Functions

Os EdgeWorkers executam JavaScript que personaliza requisições e respostas. Na Azion, esse código roda em [Functions](/pt-br/documentacao/plataforma/functions/): tratamento de requisições, orquestração de APIs, personalização, redirecionamentos, autenticação e integrações. Uma função guarda o código, uma instância de função o executa em uma aplicação, e uma regra com *Run Function* decide quais requisições chegam até ela.

| Aspecto               | Akamai EdgeWorkers                                         | Azion Functions                                  |
| --------------------- | ---------------------------------------------------------- | ------------------------------------------------ |
| Unidade de deployment | ID e versão do EdgeWorker                                  | Função e uma instância de função na aplicação    |
| Runtime               | Runtime JavaScript do Akamai EdgeWorkers                   | Runtime JavaScript da Azion, com Web APIs padrão |
| Ponto de entrada      | Event handlers como `onClientRequest` e `onClientResponse` | `fetch(request, env, ctx)`                       |
| Dados de configuração | EdgeKV, variáveis da property e APIs dos produtos          | KV Store, Object Storage e variáveis de ambiente |
| Associação            | Comportamento da property                                  | Comportamento *Run Function* de uma regra        |

Uma função tem 512 MB de memória por isolate em todos os planos e nenhum cold start. Em uma função em produção, `env` é um objeto vazio, e `ctx` traz `args` e `waitUntil`. Um event handler do EdgeWorkers se torna um handler `fetch` que retorna uma resposta:

```javascript diff
-// Before: Akamai EdgeWorkers style
-export function onClientRequest(request) {
-  const path = request.path;
-  request.setHeader('x-migration-source', 'akamai');
-}
 
+// After: Azion Functions
+export default {
+  async fetch(request, env, ctx) {
+    const url = new URL(request.url);
+    const headers = new Headers(request.headers);
+    headers.set('x-migration-source', 'azion');
+
+    return fetch(`https://origin.example.com${url.pathname}${url.search}`, {
+      method: request.method,
+      headers,
+      body: request.body
+    });
+  }
+};
```

A função encaminha a requisição para a origem com o novo header. Para adicionar um header sem código, use *Add Request Header* em uma regra. Associe cada API do EdgeWorkers à sua substituta:

| Área do código         | Substituta na Azion                                                                                                                |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| Parsing de requisições | As APIs padrão `Request` e `URL`                                                                                                   |
| Criação de respostas   | A API padrão `Response`                                                                                                            |
| Headers                | `request.headers` e os headers da resposta                                                                                         |
| Valores de ambiente    | `Azion.env.get()`                                                                                                                  |
| Dados chave-valor      | `Azion.KV.open()`, como mostra Mova dados do EdgeKV para KV Store                                                                  |
| Objetos em um bucket   | O módulo `azion:storage`. Consulte [API de runtime do Object Storage](/pt-br/documentacao/devtools/runtime/api-reference/storage/) |
| Serviços externos      | `fetch()`                                                                                                                          |

Se o código dos EdgeWorkers falhar na Azion, procure APIs de runtime da Akamai que permaneçam nele. Para as APIs de runtime, consulte [Web APIs](/pt-br/documentacao/devtools/runtime/api-reference/javascript/) e [Functions instances](/pt-br/documentacao/plataforma/applications/functions-instances/).

---

## Recrie redirecionamentos e reescritas

A Akamai guarda os redirecionamentos no Edge Redirector Cloudlet, em comportamentos da property ou em EdgeWorkers. A Azion os guarda nas regras da aplicação, que você escreve no Azion Console, na API ou no `azion.config.js`. Mova os redirecionamentos simples para regras e mantenha Functions para a lógica que precisa de código, de uma consulta externa ou da validação de um token assinado.

| Aspecto                   | Akamai                                                             | Azion                                                                                                                                |
| ------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
| Redirecionamentos simples | Edge Redirector Cloudlet, comportamentos da property e EdgeWorkers | *Redirect To (301 Moved Permanently)* no [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/) |
| Reescritas de URL         | Forward Rewrite Cloudlet ou regras da property                     | *Rewrite Request*, ou Functions                                                                                                      |
| Valores capturados        | Regras de correspondência                                          | `%{name[index]}`, como `%{capture[1]}`, de um comportamento *Capture Match Groups* na mesma regra                                    |

Os critérios de uma regra selecionam as requisições, mas não capturam nada. Para reutilizar parte do caminho no destino, adicione *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/page
```

A resposta traz `301 Moved Permanently` e um header `location` que termina em `/new/page`. Uma regra nova pode levar alguns minutos para se propagar. Se o redirecionamento não disparar, teste a expressão regular e seus grupos de captura em caminhos reais.

---

## Recrie headers personalizados

A Akamai altera headers com os comportamentos Modify Incoming Request Header e Modify Outgoing Response Header. A Azion os adiciona com regras em qualquer uma das fases. *Add Request Header* altera a requisição enviada à origem. O mesmo comportamento em uma regra da Response Phase altera a resposta enviada ao usuário.

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 pode trazer variáveis de regra, como `${uri}`. 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`. Se um header estiver faltando, verifique se uma regra na fase certa o adiciona. Para um header calculado por código, use uma função.

---

## Converta as políticas de Cloudlets

Os Cloudlets guardam políticas de redirecionamentos, reescritas, segmentação, releases, balanceamento de carga e controle de requisições. A Azion não tem uma camada de Cloudlets. Cada política se torna uma regra, uma função, uma configuração do Load Balancer ou uma regra de firewall. Faça o inventário de cada política e depois converta-a com a etapa responsável pelo seu destino:

| Cloudlet                  | Conversão na Azion                                                                                                                                |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| Edge Redirector           | Comportamentos *Redirect To* no Rules Engine, como mostra Recrie redirecionamentos e reescritas                                                   |
| Forward Rewrite           | *Rewrite Request* no Rules Engine, ou uma função quando reconstruir o caminho exige código                                                        |
| Audience Segmentation     | Critérios do Rules Engine sobre `${cookie_name}`, `${device_group}`, `${geoip_country_code}` ou `${uri}`, e *Add Cookie* para definir um segmento |
| Phased Release            | Critérios do Rules Engine sobre um cookie, Functions ou pesos do Load Balancer em dois endereços                                                  |
| Application Load Balancer | Um connector com Load Balancer, como mostra Balanceie o tráfego entre origens                                                                     |
| API Prioritization        | Rules Engine, Application Accelerator e configurações de cache                                                                                    |
| Input Validation          | Regras de firewall, e Functions para Firewall para verificações dinâmicas ou externas                                                             |
| Request Control           | Regras de firewall, como mostra Proteja a aplicação com WAF                                                                                       |

`${device_group}` nomeia um grupo da aba **Device Groups** da aplicação. Ele requer Application Accelerator, assim como *Add Cookie*. `${cookie_name}` lê um cookie: substitua `name` pelo nome do cookie, como `${cookie_segment}`. Para cada variável e comportamento, consulte [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/).

---

## Recrie as configurações de cache

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

| Aspecto           | Akamai                                                    | Azion                                                                                      |
| ----------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| Política de cache | Comportamentos de cache da property e metadados avançados | Configurações de cache, aplicadas por *Set Cache Policy*                                   |
| Chave de cache    | Comportamento da property e metadados avançados           | Controles **Cache vary by** da configuração de cache, que requerem Application Accelerator |
| TTL               | Comportamentos de cache da property                       | **Max Age** de cada configuração de cache, de 0 a 31.536.000 segundos                      |
| Offload da origem | Cloud Wrapper e hierarquia de cache                       | [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/)            |
| Purge             | URL, CP code, cache tag ou API                            | URL, chave de cache e wildcard                                                             |
| Conteúdo expirado | Comportamento de cache da property                        | **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**.

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**, com 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**

As configurações de cache são sub-recursos de uma aplicação, então cada requisição indica a aplicação e, para alterar uma configuração, a própria configuração. Para alterar uma configuração, envie uma requisição `PATCH`:

```bash
curl --request PATCH \
  --url https://api.azion.com/v4/workspace/applications/<application-id>/cache_settings/<cache-setting-id> \
  --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,
      "tiered_cache": { "enabled": true, "topology": "nearest-region" }
    }
  }
}'
```

Para criar uma configuração, envie o mesmo corpo em uma requisição `POST` para `/v4/workspace/applications/<application-id>/cache_settings`. Depois aplique-a com uma regra de requisição cujo comportamento é `{ "type": "set_cache_policy", "attributes": { "value": <cache-setting-id> } }`.

Para variar o cache por query string, cookie ou dispositivo, use **Cache vary by Query String**, **Cache vary by Cookies** e **Cache vary by Devices**. Eles requerem Application Accelerator na aplicação. Para os passos, consulte [Configure o Advanced Cache Key](/pt-br/documentacao/guias/performance-e-confiabilidade/cache-e-purge/advanced-cache-key/) e [Variação de cache](/pt-br/documentacao/plataforma/applications/application-accelerator/variacao-de-cache/).

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

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

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

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"`. Com Azion CLI, `azion purge --urls` imprime `Purge carried out successfully`. Valide o fluxo de purge antes da virada. Para os tipos de purge, consulte [Real-Time Purge](/pt-br/documentacao/plataforma/applications/cache/real-time-purge/).

Se menos respostas vierem do cache depois da migração, revise as configurações de cache, seus controles **Cache vary by** e Tiered Cache. A Azion faz purge por URL, chave de cache ou wildcard, então associe cada purge por CP code ou cache tag a um desses tipos.

---

## 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                | Akamai                                                                        | Azion Load Balancer                                                                                                     |
| ---------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Recurso de origem      | Comportamento de servidor de origem                                           | Endereços de um connector                                                                                               |
| Balanceamento de carga | Application Load Balancer Cloudlet, NodeBalancers e Global Traffic Management | *Round Robin*, *Least Connections* e *IP Hash*, que são `round_robin`, `least_conn` e `ip_hash` na API                  |
| Health checks          | Health checks específicos de cada produto                                     | Nenhum. O failover é passivo: **Max Retries** e os timeouts tratam uma conexão que falhou                               |
| Failover               | Regras da property, Global Traffic Management ou configuração do produto      | Vários endereços *Primary* com pesos e endereços *Backup* que recebem tráfego apenas quando todos os primários falham   |
| Proteção da origem     | Cloud Wrapper e a hierarquia de cache                                         | Tiered Cache faz o offload da origem. Origin Shield a restringe aos endereços da Azion e assina as requisições com HMAC |

Nenhum método direciona por localização, 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. Cada endereço traz `server_role` e `weight`, e o método fica 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", "active": true, "modules": { "load_balancer": { "server_role": "primary", "weight": 3 } } },
      { "address": "origin2.example.com", "active": true, "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/). Para Origin Shield, consulte [Origin IP ACL e HMAC](/pt-br/documentacao/plataforma/connectors/origin-shield/origin-ip-acl-e-hmac/).

---

## Entregue imagens otimizadas

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

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

**Console**

Para ativar Image Processor no Azion Console:

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

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

2. **Ative Image Processor**

   Na aba **Main Settings**, em **Modules**, ative **Image Processor**.

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 com `{ "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
# Akamai: os padrões de transformação de imagem variam conforme a implementação
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 cada parâmetro, consulte [Parâmetros de URL](/pt-br/documentacao/plataforma/applications/image-processor/parametros-de-url/). Para a configuração, consulte [Configure Image Processor em uma aplicação](/pt-br/documentacao/guias/performance-e-confiabilidade/otimizacao-de-entrega/processar-imagens/).

---

## Entregue mídia, downloads e transmissões ao vivo

Adaptive Media Delivery, Download Delivery, Dedicated Delivery e Media Services Live carregam tráfego com alto consumo de banda. Mova cada um conforme seu modelo de tráfego: mídia armazenável em cache, vídeo sob demanda, arquivos grandes ou transmissões ao vivo.

| Produto da Akamai         | Caminho na Azion                                                |
| ------------------------- | --------------------------------------------------------------- |
| Adaptive Media Delivery   | Applications e Cache, com a mídia no Object Storage             |
| Download Delivery         | Applications e Cache, com os arquivos no Object Storage         |
| Dedicated Delivery        | Applications e Cache, com Tiered Cache para o offload da origem |
| Media Services Live       | Live Ingest, entregue por uma aplicação                         |
| Cloud Wrapper, para mídia | Tiered Cache                                                    |

[Live Ingest](/pt-br/documentacao/plataforma/connectors/live-ingest/ingestao-e-entrega/) recebe a transmissão ao vivo do seu encoder em um connector do tipo `live_ingest`. O encoder envia por RTMP, com autenticação por usuário e senha. Live Ingest converte a transmissão para HLS, e uma aplicação a entrega aos espectadores por esse connector.

O connector traz um atributo, `region`: `us-east-1`, `us-east-2`, `br-east-1`, `br-east-2` ou `br-east-3`. A Azion fornece um endpoint de ingestão primário e um de backup. Coloque-os em regiões diferentes, para que uma falha regional não interrompa a transmissão. O comportamento *Enforce HLS cache* aplica a política de cache que a Azion define para HLS ao vivo e requer Live Ingest.

Para as configurações do encoder e o checklist do evento, consulte [Boas práticas de connectors](/pt-br/documentacao/plataforma/connectors/boas-praticas/#live-ingest). Para as regras de cache de HLS, consulte [Implemente cache HLS para transmissões ao vivo](/pt-br/documentacao/guias/midia-e-streaming/streaming/implementar-cache-hls/).

---

## Roteie APIs e chame modelos de IA

Os padrões de API Gateway e API Acceleration passam para uma aplicação. As regras roteiam os caminhos, Functions guarda a lógica da API e Firewall protege as rotas. Application Accelerator e Cache aceleram as respostas.

| Aspecto            | Akamai                                             | Azion                                                               |
| ------------------ | -------------------------------------------------- | ------------------------------------------------------------------- |
| Roteamento de APIs | API Gateway e regras da property                   | Applications e Rules Engine                                         |
| Lógica de APIs     | EdgeWorkers, Akamai Functions ou serviços upstream | Functions                                                           |
| Proteção de APIs   | App & API Protector e API Security                 | Firewall, Web Application Firewall e Bot Manager                    |
| Aceleração de APIs | API Acceleration                                   | Application Accelerator e Cache                                     |
| Execução de IA     | Akamai Inference Cloud ou provedores externos      | AI Inference, ou APIs de IA externas chamadas a partir de Functions |

Esta função envia as requisições `/api/` para uma origem de API, com um token de uma variável de ambiente. Todas as outras requisições vão para a origem principal, com seus headers inalterados:

```javascript
export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const headers = new Headers(request.headers);
    let origin = 'https://origin.example.com';

    if (url.pathname.startsWith('/api/')) {
      origin = 'https://api-origin.example.com';
      headers.set('Authorization', 'Bearer ' + Azion.env.get('API_TOKEN'));
    }

    return fetch(origin + url.pathname + url.search, {
      method: request.method,
      headers,
      body: request.body
    });
  }
};
```

[AI Inference](/pt-br/documentacao/plataforma/ai-inference/) executa um catálogo de [modelos](/pt-br/documentacao/plataforma/ai-inference/modelos/) open source. Uma função chama um modelo pelo seu ID com `Azion.AI.run()` e 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`, então 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/).

---

## Mova dados do EdgeKV para KV Store

[KV Store](/pt-br/documentacao/plataforma/kv-store/) guarda configurações, feature flags, metadados de sessão e estado leve, os mesmos usos que o EdgeKV atende.

| Aspecto          | Akamai EdgeKV                                         | Azion KV Store                                               |
| ---------------- | ----------------------------------------------------- | ------------------------------------------------------------ |
| Modelo de dados  | Namespaces, grupos e itens                            | Namespaces de chaves e valores                               |
| Acesso           | A partir de EdgeWorkers                               | A partir de Functions, por meio de `Azion.KV.open()`         |
| Foco da migração | Exportar, transformar, importar e validar as leituras | Criar o namespace, importar as chaves e atualizar as funções |

O EdgeKV endereça um item por namespace, grupo e item. KV Store não tem grupos, então incorpore o grupo à chave, como `features:checkout`:

```javascript diff
-// Before: Akamai EdgeKV-style pseudocode
-const value = await edgeKv.getText({ namespace: 'config', group: 'features', item: 'checkout' });
 
+// After: Azion KV Store
+const kv = await Azion.KV.open('config');
+const value = await kv.get('features:checkout');
+await kv.put('features:checkout', 'enabled');
```

`get()` retorna texto por padrão e `null` para uma chave inexistente. `Azion.KV.open()` é o único ponto de entrada. O namespace precisa existir antes, ou `open()` lança `NotFound`.

**Console**

Azion Console não tem tela de KV Store. Crie o namespace pela API, na aba **API**. Para os campos e os erros, consulte [Namespaces](/pt-br/documentacao/plataforma/kv-store/namespaces/).

**CLI**

Crie o namespace pela API, na aba **API**.

**API**

Para criar o namespace, envie uma requisição `POST` para o endpoint de namespaces:

```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": "akamai-migration-kv"
}'
```

A resposta traz `201` e o namespace.

O nome de um namespace aceita de 3 a 63 caracteres, diferencia maiúsculas de minúsculas e é permanente: um namespace não pode ser renomeado nem excluído. KV Store não tem importação em massa, e nenhuma API, comando da CLI ou tela do Console grava chaves. Para mover os dados:

1. Exporte da Akamai os namespaces, grupos, itens, metadados e regras de expiração.
2. Decida como cada grupo e item se torna uma chave e mantenha os prefixos e as convenções de nomes existentes sempre que possível.
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. Uma gravação fica visível em todos os lugares em até 60 segundos.

Antes de mover o tráfego de produção, documente o que o código faz com uma chave inexistente e verifique a codificação dos valores, a serialização JSON e os dados binários. Teste os caminhos de leitura e de gravação. Se faltarem dados, exporte as chaves de novo e verifique o nome do namespace e a codificação. Para o cliente, consulte [API de runtime do KV Store](/pt-br/documentacao/devtools/runtime/api-reference/kv-store/) e [Gerencie dados chave-valor a partir de uma função](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/gerenciar-com-funcoes/).

---

## Mova o NetStorage para Object Storage

[Object Storage](/pt-br/documentacao/plataforma/object-storage/) guarda imagens, documentos, assets estáticos, mídia, downloads, 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                  | Akamai NetStorage ou Object Storage                                  | Azion Object Storage                                            |
| ------------------------ | -------------------------------------------------------------------- | --------------------------------------------------------------- |
| Protocolo                | APIs do NetStorage, ou fluxos compatíveis com S3, conforme o produto | S3                                                              |
| Endpoint                 | Endpoint de armazenamento da Akamai                                  | `s3.us-east-005.azionstorage.net`, na região `us-east-005`      |
| Gerenciamento de objetos | Ferramentas específicas do produto ou ferramentas compatíveis com S3 | Ferramentas compatíveis com S3, a API, a CLI e a API de runtime |
| Entrega aos usuários     | Delivery property                                                    | Uma aplicação, com um connector para o bucket                   |

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

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

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

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

Quando a origem fala S3, copie os objetos com o s3cmd, o rclone ou a AWS CLI. Para fluxos específicos do NetStorage, exporte antes o conteúdo para uma pasta local ou um bucket intermediário. Crie o bucket de destino no Azion Console, na API ou na CLI: `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`.

| Tarefa               | Comando do s3cmd                                                                           |
| -------------------- | ------------------------------------------------------------------------------------------ |
| Listar buckets       | `s3cmd ls`, que exige `listAllBucketNames` na credencial                                   |
| Enviar um objeto     | `s3cmd put file.png s3://my-bucket/`                                                       |
| Baixar um objeto     | `s3cmd get s3://my-bucket/file.png`                                                        |
| Copiar entre buckets | `s3cmd sync s3://source-bucket/ s3://dest-bucket/`, apenas entre buckets do mesmo provedor |

Para enviar uma pasta exportada com o [s3cmd](https://s3tools.org/s3cmd), configure-o para a Azion com `s3cmd --configure -c ~/.s3cfg-azion`. Informe o par de chaves, `us-east-005` como **Default Region** e `s3.us-east-005.azionstorage.net` como **S3 Endpoint**. Depois sincronize a pasta:

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

Os objetos estão no bucket da Azion. Para verificar, execute `s3cmd -c ~/.s3cfg-azion ls s3://azion-bucket/`. Se o acesso for negado, verifique o par de chaves e o endpoint `s3.us-east-005.azionstorage.net`.

Azion Console recusa um upload individual acima de 300 MB, e a API e as ferramentas S3 não estão sujeitas a esse limite. Use o endpoint S3 apenas para gerenciar os objetos. Entregue-os aos usuários por um connector e uma aplicação, para que o cache, a segurança e o domínio de produção se apliquem. Para os passos, consulte [Use ferramentas compatíveis com S3](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/protocolo-s3-para-object-storage/), [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/).

---

## Mova bancos de dados gerenciados para SQL Database

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

| Aspecto               | Akamai Managed Databases                                               | Azion SQL Database                                                      |
| --------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| Modelo de dados       | MySQL ou PostgreSQL, conforme o serviço de origem                      | Dialeto SQLite                                                          |
| Acesso pela aplicação | Uma connection string a partir da aplicação ou do serviço              | Uma conexão somente leitura a partir de uma função e gravações pela API |
| Foco da migração      | Exportar o schema, os dados, os usuários e as configurações de conexão | Criar o banco de dados, importar os dados e validar as consultas        |
| Validação             | Backups, réplicas, limites de conexão e comportamento das consultas    | Comportamento das consultas e as funções que leem os dados              |

Para mover um banco de dados:

1. Exporte do banco de dados de origem o schema, os dados, os índices, os usuários e os requisitos de extensões.
2. [Crie o banco de dados](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/gerenciar-bancos-dados-edge-sql/) na Azion.
3. Importe os dados e valide a contagem de linhas.
4. Atualize as configurações de conexão da aplicação, ou as funções que leem os dados.
5. Execute testes de leitura e de gravação no nível da aplicação antes da virada.

O EdgeSQL Shell lê uma tabela por vez de um servidor MySQL ou PostgreSQL ativo, com `.import mysql` ou `.import postgres`. O shell não inicia em uma instalação limpa, então verifique [EdgeSQL Shell](/pt-br/documentacao/plataforma/sql-database/edgesql-shell/) antes de depender dele. Você também pode enviar instruções SQL no array `statements` de uma requisição `POST` para `https://api.azion.com/v4/workspace/sql/databases/<database-id>/query`.

Uma função lê o banco de dados com `Database.open()` do global `Azion.Sql`. Um `insert` ou `delete` por essa conexão falha com `attempt to write a readonly database`. Para os caminhos de importação, consulte [Importe dados para SQL Database](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/dados/importar-dados-edge-sql/). Para a API de runtime, consulte [API de runtime do SQL Database](/pt-br/documentacao/devtools/runtime/api-reference/sql-database/).

---

## Proteja a aplicação com WAF

[Web Application Firewall](/pt-br/documentacao/plataforma/firewall/waf/primeiros-passos/) assume as proteções gerenciadas do App & API Protector. Ele pontua as requisições em relação a oito famílias de ameaças. Um conjunto de regras WAF guarda uma sensibilidade para cada família, e uma regra de firewall o aplica com *Set WAF*.

| Aspecto              | Akamai App & API Protector                                        | Azion WAF e Firewall                                                                            |
| -------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| Proteção gerenciada  | Regras e proteções gerenciadas                                    | Um ruleset gerenciado, pontuado por família de ameaças                                          |
| Lógica personalizada | Match targets, regras personalizadas e configurações de políticas | [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/)             |
| Ações                | Alerta, bloqueio, desafio ou ações específicas do produto         | *Deny*, *Drop*, *Set Custom Response*, *Set Rate Limit*, *Set WAF* e *Run Function*             |
| Ajuste               | Ajuste de políticas e exceções                                    | Modos *Logging* e *Blocking*, uma sensibilidade por família, exceções de WAF e a aba **Tuning** |
| Associação           | Política de segurança e hostname protegido                        | Um firewall, vinculado ao workload                                                              |

`mode` é obrigatório em todo comportamento *Set WAF* e não tem padrão. Comece em *Logging* e compare os falsos positivos, as regras mais disparadas e as exceções de que a aplicação precisa. Depois mude para *Blocking*. No modo *Blocking*, uma requisição que o conjunto de regras bloqueia recebe `400`.

**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": "Akamai 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" } }`.

As regras de política do App & API Protector, o Request Control Cloudlet e o Input Validation Cloudlet se tornam regras de firewall. As variáveis do firewall diferem das variáveis da aplicação: o caminho é `${request_uri}`. Uma faixa de endereços vai em uma [Network List](/pt-br/documentacao/plataforma/firewall/network-shield/network-lists/), comparada com `${network}`:

```text
# Intenção na Akamai
Bloquear requisições para /admin, a menos que o IP do cliente esteja 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)

Behavior: Deny (403 Forbidden)
```

O critério `${network}` requer Network Shield no firewall. Para proteger uma rota sem verificação de endereço, envie a regra 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": "Protect API Admin Routes",
  "active": true,
  "criteria": [[{ "variable": "${request_uri}", "conditional": "if", "operator": "starts_with", "argument": "/api/admin" }]],
  "behaviors": [{ "type": "deny" }]
}'
```

A resposta traz `"state": "pending"` e a regra. Uma requisição correspondente recebe `403` com a página de erro Forbidden. *Deny* não aceita atributos. Para verificações que precisam de código ou de um serviço externo, execute uma função no firewall. Para mais detalhes, consulte [Functions para Firewall](/pt-br/documentacao/plataforma/firewall/functions/) e [Conjuntos de regras WAF](/pt-br/documentacao/plataforma/firewall/waf/rule-sets/).

---

## Conte com DDoS Protection

[DDoS Protection](/pt-br/documentacao/plataforma/workloads/#ddos-protection) assume o papel do Prolexic para o tráfego que a Azion atende. Ele 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. Exemplos são floods UDP e ICMP, SYN floods, fragmentação de pacotes, floods HTTP e slowloris.

| Aspecto        | Akamai Prolexic e produtos de DDoS                     | Azion DDoS Protection                             |
| -------------- | ------------------------------------------------------ | ------------------------------------------------- |
| Ativação       | Configuração do produto e do direcionamento de tráfego | Automática, e não pode ser desativada             |
| Camadas        | Camadas de rede e de aplicação                         | 3, 4, 6 e 7                                       |
| Personalização | Controles do Prolexic e das políticas de segurança     | Regras de firewall personalizadas                 |
| Visibilidade   | Dashboards e logs de segurança da Akamai               | Real-Time Metrics, Real-Time Events e Data Stream |

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. As camadas 3 e 4 não são medidas, e a mitigação na camada 7 pode gerar tráfego cobrável.

Para migrar do Prolexic:

1. Documente as premissas atuais do Prolexic, os prefixos protegidos, o modelo de roteamento, os processos de suporte e os caminhos de escalonamento.
2. Confirme o workload, o firewall e a configuração do Network Shield na Azion.
3. Recrie os controles da camada de aplicação como regras do firewall vinculado ao workload.
4. Confirme que Real-Time Metrics, Real-Time Events e Data Stream mostram o tráfego.
5. Tenha à mão os procedimentos de rollback e de escalonamento para a janela da virada.

O Security Response Team é um add-on dos suportes Enterprise e Mission-Critical. [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 de `${network}`. Para os tipos de ataque, consulte [Mitigação de ataques](/pt-br/documentacao/plataforma/workloads/ddos-protection/ddos-mitigation/).

---

## Recrie o gerenciamento de bots

[Bot Manager](/pt-br/documentacao/plataforma/firewall/bot-manager/primeiros-passos/) substitui o Akamai Bot Manager, o Account Protector e o Content Protector. Ele 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               | Akamai                                                 | Azion Bot Manager                                                                                                                     |
| --------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| Detecção              | Sinais de proteção de bots, contas e conteúdo          | Regras estáticas, um método comportamental dinâmico no Bot Manager completo, fingerprints de dispositivo e Network Lists de reputação |
| Ações                 | Allow, deny, challenge ou ações específicas do produto | `allow`, `custom_html`, `deny`, `drop`, `hold_connection`, `random_delay` e `redirect`                                                |
| Integração com regras | Controles das políticas de segurança                   | Uma instância de função, executada por uma regra de firewall                                                                          |
| Opção leve            | Configuração específica do produto                     | Bot Manager Lite, do Marketplace                                                                                                      |

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.

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. 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 [Bot Manager Lite](/pt-br/documentacao/plataforma/firewall/bot-manager/bot-manager-lite/) e [Instale Bot Manager Lite](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/bot-manager-lite/). Para fazer o deploy a partir de um template, consulte [Adicione Bot Manager Lite a um firewall](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/bot-manager-lite-integration-kit/).

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 um crawler de busca, 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 requisição recebe a resposta normal.

---

## Recrie os rate limits

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

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

### Use o rate limit nativo

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

**Console**

Para criar o rate limit no Azion Console:

1. **Abra o firewall**

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

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

3. **Selecione + Rule**

4. **Defina os critérios**

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

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

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

6. **Selecione Save**

A regra aparece na lista de regras do firewall.

**CLI**

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

**API**

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

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

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

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

### Use o rate limit com penalidade

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

Para configurá-la no Azion Console:

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

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

2. **Abra o firewall**

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

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

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

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

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

5. **Vincule o firewall ao workload**

   Execute o comando da CLI que cria o deployment do workload com o firewall:

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

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

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

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

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

---

## Reconstrua o monitoramento

A Azion divide a observabilidade em três produtos. [Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/) mostra agregados ao longo do tempo em gráficos, [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/) responde a consultas sobre requisições individuais, e [Data Stream](/pt-br/documentacao/plataforma/data-stream/) envia os logs para destinos externos. Reconstrua-os antes da virada, para que a visibilidade da produção, a resolução de problemas e os relatórios de compliance continuem depois dela.

### Real-Time Metrics

| Aspecto          | Akamai TrafficPeak e relatórios                              | Azion Real-Time Metrics                                                                          |
| ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| Escopo           | Relatórios de tráfego, operações e segurança                 | Requisições, dados transferidos, códigos de status, offload de cache e tempo médio de requisição |
| Acesso           | Interface e APIs da Akamai                                   | Dashboards, **Copy query**, **Export CSV** e a API GraphQL                                       |
| Casos de uso     | Tendências de tráfego, visibilidade de segurança e operações | Tendências de tráfego, offload de cache, erros e erros da origem                                 |
| Foco da migração | Paridade de dashboards e alertas                             | Dashboards, filtros, consultas GraphQL e Grafana, se necessário                                  |

Os dashboards de Applications mostram:

- **Requests**: total de requisições e requisições por método e por esquema. **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. A tabela **Requests by Status and Upstream Status** 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**.

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: 10, filter: { tsRange: {begin: "2026-10-01T00:00:00", end: "2026-10-02T00:00:00"} }, aggregate: { sum: requests }, groupBy: [ts], orderBy: [ts_DESC]) {
    ts
    sum
  }
}
```

A resposta lista o total de requisições por timestamp. Substitua as datas por um intervalo dentro do período de retenção, ou o array volta vazio. 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/). Para ler os dashboards, consulte [Primeiros passos com Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/primeiros-passos/), [Analise métricas](/pt-br/documentacao/guias/plataforma/observabilidade/analisar-metricas/) e [Dashboards personalizados do plugin Grafana](/pt-br/documentacao/guias/plataforma/observabilidade/azion-plugin-grafana/).

### Real-Time Events

| Aspecto         | Fluxos de investigação da Akamai                     | Azion Real-Time Events                                |
| --------------- | ---------------------------------------------------- | ----------------------------------------------------- |
| Acesso          | Dashboards, relatórios e logs dos produtos da Akamai | Consultas no Azion Console ou na API GraphQL          |
| Modelo de dados | Campos de log dos produtos da Akamai                 | Fontes de dados com os campos de cada evento          |
| Consultas       | Filtros específicos de cada produto                  | Condições em **Filter by** no Azion Console e GraphQL |

Real-Time Events não precisa de configuração. Um evento pode ser consultado até 30 segundos depois de acontecer e fica disponível por 7 dias. Para uma retenção maior, use Data Stream. 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
  }
}
```

A resposta lista até 100 requisições, das mais recentes para as mais antigas. Substitua as datas por um intervalo dentro dos últimos 7 dias. `upstreamResponseTime` mostra `-` para uma resposta entregue a partir do cache. Para cada campo, consulte [Campos GraphQL do Real-Time Events](/pt-br/documentacao/devtools/graphql/campos-gql-real-time-events/). Para os passos, consulte [Primeiros passos com Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/primeiros-passos/), [Investigue requisições com a API GraphQL](/pt-br/documentacao/guias/plataforma/observabilidade/investigar-requisicoes-api-graphql/) e [Leia um registro de evento](/pt-br/documentacao/guias/plataforma/observabilidade/entender-logs/).

### Data Stream

| Aspecto  | Akamai DataStream                             | Azion Data Stream                                              |
| -------- | --------------------------------------------- | -------------------------------------------------------------- |
| Entrega  | Streaming de logs para endpoints configurados | Push para um destino externo                                   |
| Formato  | Formatos específicos do stream e do destino   | Templates que selecionam os campos                             |
| Destinos | Serviços externos de logs e de armazenamento  | 11 tipos, listados abaixo                                      |
| Fontes   | Logs da property ou dos produtos da Akamai    | *Activity History*, *Applications*, *Functions* e *WAF Events* |

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": "akamai-migration-log-stream",
  "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`.

Se os logs não chegarem ao destino, verifique o status do stream, as credenciais do destino e as variáveis do template. 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/), [Fontes de dados e variáveis](/pt-br/documentacao/plataforma/data-stream/fontes-de-dados-e-variaveis/) e [Configure o sampling](/pt-br/documentacao/guias/plataforma/observabilidade/configurar-sampling/).

---

## Mova o mPulse para Edge Pulse

[Edge Pulse](/pt-br/documentacao/plataforma/edge-pulse/) mede a partir dos navegadores de visitantes reais, o papel que o mPulse cumpre. Uma tag JavaScript em cada página executa um teste e envia o resultado para a Azion. Um teste mede navegação, disponibilidade, latência e largura de banda.

| Aspecto          | Akamai mPulse                                                                | Azion Edge Pulse                                                                 |
| ---------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Coleta           | Tag de monitoramento de usuários reais                                       | Tag JavaScript do Edge Pulse: a **Default Tag** ou a **Pre-loading Tag**         |
| Casos de uso     | Analytics de experiência do usuário, latência, disponibilidade e performance | Navegação, disponibilidade, latência e largura de banda de visitantes reais      |
| Análise          | Dashboards e exportações do mPulse                                           | Consultas GraphQL no dataset `pulseEvents` do Real-Time Events                   |
| Foco da migração | Posicionamento do beacon, dashboards e lógica de alertas                     | Posicionamento da tag, verificações dos dados e dashboards baseados em consultas |

Edge Pulse está ativo em todas as contas, e a tag não precisa de configuração. Nenhuma página do Azion Console mostra as medições em gráficos, e Real-Time Metrics e Data Stream não as trazem. Uma consulta em `pulseEvents` é a única forma de lê-las, e elas duram 7 dias. A tag não tem configurações e mede um visitante uma vez a cada 30 minutos.

Para mover o monitoramento:

1. Liste cada template de página, regra do gerenciador de tags ou shell de aplicação que carrega o mPulse.
2. Documente as métricas, as dimensões, os dashboards e os alertas que a equipe usa.
3. No Azion Console, acesse **Products menu** > **Observe** > **Edge Pulse** e copie a **Default Tag**. Copie a **Pre-loading Tag** quando a Content Security Policy da página bloquear JavaScript inline.
4. Cole a tag imediatamente antes do fechamento da tag `body` de cada página, manualmente ou por um sistema de gerenciamento de tags, e publique as páginas.

Cada página publicada agora mede seus visitantes. Para verificar se as medições chegam, calcule a média do tempo de carregamento por página:

```bash
curl -X POST https://api.azion.com/v4/events/graphql \
  -H "Authorization: Token [TOKEN VALUE]" \
  -H "Content-Type: application/json" \
  -d '{"query": "query { pulseEvents(limit: 100, filter: { tsRange: {begin: \"2026-10-04T00:00:00\", end: \"2026-10-05T00:00:00\"} }, aggregate: { avg: pageloadtime }, groupBy: [locationhref], orderBy: [avg_DESC]) { locationhref avg } }"}'
```

O endpoint retorna `200`, com um objeto para cada página com tag que teve visitas na janela. Uma janela sem medições retorna um array vazio. Substitua as datas por um intervalo dentro dos últimos 7 dias. Uma página com tag que tem visitas e nenhuma linha é uma página em que a tag não roda, porque a tag não informa erros.

Uma aplicação de página única é medida uma vez por carregamento completo da página. Reconstrua os dashboards e os alertas do mPulse como consultas em `pulseEvents`, em um dashboard personalizado ou em uma plataforma de observabilidade. Para os passos, consulte [Primeiros passos com Edge Pulse](/pt-br/documentacao/plataforma/edge-pulse/primeiros-passos/), [Como Edge Pulse funciona](/pt-br/documentacao/plataforma/edge-pulse/como-funciona/) e [Consulte as medições do Edge Pulse com GraphQL](/pt-br/documentacao/guias/plataforma/observabilidade/consultar-medicoes-do-edge-pulse-com-graphql/).

---

## Prepare o certificado

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

| Opção de certificado      | Use para                                                                                                                                     |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Let's Encrypt             | Um certificado gerenciado para seus próprios domínios, sem custo adicional. Ele é renovado a partir de 30 dias antes da expiração de 90 dias |
| Certificado personalizado | Um certificado que você já tem, de domínio único ou SAN, com chaves RSA 2048 ou P-256. Você gerencia a renovação                             |
| Azion SAN                 | O domínio de workload `azionedge.net` e o hostname `azion.app`                                                                               |
| Certificado Trusted CA    | mTLS. Azion SAN não suporta mTLS                                                                                                             |

Escolha o desafio do Let's Encrypt 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 Akamai, 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 a property 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. 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 cada campo, consulte [Certificados](/pt-br/documentacao/plataforma/workloads/certificate-manager/certificados/).

**CLI**

Para definir 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 solicitar um certificado Let's Encrypt, envie uma requisição `POST` para `https://api.azion.com/v4/workspace/tls/certificates/request`. O corpo recebe `name`, `"authority": "lets_encrypt"`, `challenge` (`http` ou `dns`), `common_name` e, opcionalmente, `alternative_names`. Para enviar seu próprio certificado, envie `name`, `"type": "edge_certificate"`, `certificate` e `private_key` para `/v4/workspace/tls/certificates`. Cada PEM é uma string JSON com quebras de linha `\n`, e a API responde `201`.

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`. 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 DNS-01, verifique o CNAME `_acme-challenge`. Confirme que o hostname está nos **Domains** do workload certo antes da mudança de DNS. Para as regras de emissão, consulte [Emissão e renovação](/pt-br/documentacao/plataforma/workloads/certificate-manager/emissao-e-renovacao/).

---

## Mova zonas DNS para Edge DNS

Mover a zona para [Edge DNS](/pt-br/documentacao/plataforma/edge-dns/) dá à Azion todos os registros do domínio, incluindo o apex. Toda zona usa os mesmos três nameservers, `ns1.aziondns.net`, `ns2.aziondns.com` e `ns3.aziondns.org`. Mova o DNS apenas depois que as aplicações, os workloads, os certificados e as regras de segurança responderem como esperado. Pule esta etapa quando mantiver o provedor de DNS atual e apontar apenas subdomínios.

| Aspecto                   | Akamai                                                               | Azion                                                            |
| ------------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------- |
| DNS autoritativo          | Edge DNS e DNS Manager                                               | Edge DNS                                                         |
| Direcionamento de tráfego | Global Traffic Management                                            | Registros ponderados no Edge DNS e Load Balancer em um connector |
| Roteamento de aplicações  | Registros DNS e properties do Global Traffic Management              | Workloads, Edge DNS e Load Balancer                              |
| Validação                 | Ferramentas de DNS, testes do Global Traffic Management e relatórios | `dig`, Real-Time Metrics e Real-Time Events                      |

Edge DNS suporta 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, como o domínio do workload, e seu TTL precisa ser 20. Um CNAME guarda exatamente um valor e não pode ficar no apex. Edge DNS recusa outros tipos, como SOA.

Para dividir as respostas entre destinos, como o Global Traffic Management direciona o tráfego, use registros ponderados. Com **Policy Type** *Weighted*, vários registros compartilham um nome e um tipo, cada um com um **Weight** de 0 a 255. Cada resposta traz um registro, escolhido na proporção do seu peso. A política de um registro é *Simple* ou *Weighted*.

**Console**

Para criar a zona no Azion Console:

1. **Abra Edge DNS**

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

2. **Selecione + Zone**

3. **Informe a zona**

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

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

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

5. **Selecione Save**

6. **Adicione os registros**

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

A zona responde nos nameservers da Azion. Para os passos, consulte [Crie, edite ou exclua uma zona](/pt-br/documentacao/guias/seguranca-de-aplicacoes/dns/edge-dns-definir-main-settings/) e [Adicione, edite ou exclua um registro](/pt-br/documentacao/guias/seguranca-de-aplicacoes/dns/adicionar-registros/).

**CLI**

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

**API**

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

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

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

Um registro recebe seu `name` relativo à zona, seu `type` e `rdata` como um array de strings. Um registro ponderado adiciona `"policy": "weighted"` e um `weight`. Para ativar o DNSSEC, envie `{"enabled": true}` em uma requisição `PATCH` para `/v4/workspace/dns/zones/<zone-id>/dnssec`.

Antes da janela da virada, exporte da Akamai as zonas, os registros, os TTLs, as configurações de DNSSEC e as regras de direcionamento de tráfego e reduza os TTLs. Com o DNSSEC ativado, Edge DNS mostra quatro valores DS para adicionar no registrador, que pode levar até 48 horas para publicá-los. Para os passos, consulte [DNSSEC](/pt-br/documentacao/plataforma/edge-dns/dnssec/).

Para verificar a zona, consulte os nameservers e os registros:

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

O primeiro comando lista os três nameservers da Azion assim que a mudança no registrador se propaga. O segundo mostra a resposta do Edge DNS antes que a mudança chegue a todos os resolvers. Não consulte um nome novo antes de o registro dele existir: Edge DNS mantém a resposta negativa em cache por uma hora.

---

## Aponte o domínio para o workload

A mudança de DNS é a virada: assim que o hostname resolve para o workload, os usuários acessam a property pela Azion. Trate-a como uma transição controlada. Ela afeta os usuários, os rankings de busca, a cobertura do certificado e a disponibilidade. 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, 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 firewall está vinculado ao workload.
- O monitoramento está pronto para acompanhar o tráfego depois da virada.

Aponte cada nome com o registro que sua zona permite:

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

Para verificar um CNAME e a resposta:

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

A primeira resposta é o domínio do workload, como `xxxxxxxxxx.map.azionedge.net`. A segunda é a resposta da property pela Azion. Se o tráfego não migrar, verifique os TTLs, os registros CNAME, os nameservers e o hostname no workload. Depois da virada, acompanhe Real-Time Metrics e Real-Time Events e o **Upstream Status** da origem.

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/) e [Workloads](/pt-br/documentacao/plataforma/workloads/). Para mover os nameservers, consulte [Migre os nameservers para a Azion](/pt-br/documentacao/guias/plataforma/migracao/migrar-ns-para-a-azion/).

---

## Próximos passos

- [Real-Time Metrics](/pt-br/documentacao/plataforma/real-time-metrics/primeiros-passos.md): Acompanhe requisições, dados transferidos, códigos de status e offload de cache depois da virada.
- [Edge Pulse](/pt-br/documentacao/plataforma/edge-pulse/primeiros-passos.md): Adicione a tag às páginas que carregavam o mPulse e consulte o que os visitantes reais medem.
- [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, o purge, leia logs e gerencie a property a partir de um terminal.
- [Comunidade Azion](https://discord.gg/azion): Pergunte à comunidade Azion no Discord como outras pessoas rodam suas properties na Azion.
- [Suporte Azion](/pt-br/documentacao/suporte.md): Abra um ticket com a equipe de suporte quando a migração precisar de ajuda.
