# azion.config.js

`azion.config.js` é o arquivo de configuração do projeto que a [Azion CLI](/pt-br/documentacao/devtools/cli/) lê para fazer o build e o deploy de um projeto. É um arquivo JavaScript cujo export padrão, opcionalmente envolvido em `defineConfig(...)`, declara as configurações de build e os recursos de que o projeto precisa na Azion, como aplicações, workloads, connectors, functions e firewalls. `azion build` faz o build do projeto com ele, `azion deploy` faz o deploy e `azion dev` executa o projeto localmente.

---

## Nomes de arquivo e onde a CLI os lê

A CLI procura o arquivo de configuração na pasta do projeto com sete nomes, nesta ordem, e lê o primeiro que encontra: `azion.config.ts`, `azion.config.mts`, `azion.config.cts`, `azion.config.js`, `azion.config.mjs`, `azion.config.cjs` e `azion.config.json`. O arquivo pode, portanto, ser TypeScript, um ES module, um CommonJS module ou JSON.

Os comandos da CLI que configuram um projeto escrevem o arquivo para você, e a extensão depende do comando e do preset:

| Comando                                                                            | Arquivo que ele escreve                                                                                                 |
| ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| [`azion init`](/pt-br/documentacao/devtools/cli/init/) com o preset JavaScript     | `azion.config.mjs`                                                                                                      |
| [`azion link`](/pt-br/documentacao/devtools/cli/link-comando/) com `--preset html` | `azion.config.cjs`                                                                                                      |
| `azion init` e depois `azion build`, com o preset Angular ou Docusaurus            | `azion.config.cjs`                                                                                                      |
| `azion init` e depois `azion build`, com o preset Astro                            | `azion.config.mjs`                                                                                                      |
| [`azion sync --iac`](/pt-br/documentacao/devtools/cli/sync/)                       | `azion.config.mjs`, gerado a partir dos recursos do projeto na Azion, mesmo quando existe um arquivo `azion.config.cjs` |

Quando um projeto tem `azion.config.mjs` e `azion.config.cjs`, `azion deploy` lê e atualiza `azion.config.mjs`.

`azion deploy` também escreve no arquivo que lê. Um arquivo gerado contém placeholders como `$APPLICATION_NAME` e `$WORKLOAD_NAME`, e o primeiro deploy substitui cada um pelo nome do projeto. Em um site estático, cada deploy substitui o `prefix` do storage por outro valor e exibe a mudança:

```text
[Azion] › ℹ  info      Successfully replaced "20260101120000" with "20260101120100" (2 occurrences) in azion.config.cjs
```

---

## defineConfig

`defineConfig` vem do pacote `@aziontech/config`, que os arquivos gerados indicam: instale-o como dependência de desenvolvimento com `npm install -D @aziontech/config`. A função recebe seu objeto de configuração e retorna o mesmo objeto, sem alterações. Ela fornece ao seu editor os tipos da configuração para autocompletar e verificar tipos, e não verifica os valores.

Este arquivo declara um build JavaScript por meio de `defineConfig`:

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

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

A verificação acontece no build. Antes de escrever `.edge/manifest.json`, o build executa `validateConfig`, do mesmo pacote, sobre a configuração que leu. A verificação indica o caminho da propriedade de cada valor que recusa, como `/applications/0/rules/request/0/criteria/0`.

O pacote `azion` também exporta `defineConfig` (`import { defineConfig } from 'azion'`). Esse pacote está obsoleto em favor dos pacotes `@aziontech/*`, e os tipos de behavior de firewall dele diferem dos que o build aceita; por isso, tipe seu arquivo com `@aziontech/config`.

---

## Referência de configuração

O objeto de configuração recebe doze chaves de primeiro nível, todas opcionais. Cada tabela abaixo lista as propriedades de uma chave, com o tipo que as declarações de tipo do `@aziontech/config` atribuem a ela. Um nome com ponto, como `browser.maxAgeSeconds`, é uma propriedade de um objeto aninhado; **Sim** na coluna Obrigatório significa, nesse caso, obrigatório sempre que o objeto pai estiver presente.

| Chave          | Tipo                 | Descrição                                                                       |
| -------------- | -------------------- | ------------------------------------------------------------------------------- |
| `build`        | `AzionBuild`         | Como a CLI faz o build do projeto.                                              |
| `applications` | `AzionApplication[]` | As aplicações do projeto, com seus cache settings, regras e function instances. |
| `functions`    | `AzionFunction[]`    | As functions do projeto.                                                        |
| `connectors`   | `AzionConnector[]`   | Os connectors para os quais as aplicações enviam requisições.                   |
| `storage`      | `AzionBucket[]`      | Os buckets do Object Storage que guardam os arquivos do projeto.                |
| `firewall`     | `AzionFirewall[]`    | Os firewalls do projeto, com suas regras.                                       |
| `networkList`  | `AzionNetworkList[]` | As network lists com que as regras de firewall comparam.                        |
| `purge`        | `AzionPurge[]`       | As URLs, cache keys ou wildcards a purgar.                                      |
| `waf`          | `AzionWaf[]`         | As configurações do Web Application Firewall (WAF).                             |
| `workloads`    | `AzionWorkload[]`    | Os workloads que servem as aplicações em domínios.                              |
| `customPages`  | `AzionCustomPage[]`  | As páginas de erro personalizadas.                                              |
| `kv`           | `AzionKV[]`          | Os namespaces do KV Store.                                                      |

### build

O objeto `build` define como o projeto é empacotado antes do deploy.

| Propriedade                 | Tipo                                           | Obrigatório | Descrição                                                                                            |
| --------------------------- | ---------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------- |
| `bundler`                   | `'webpack' \| 'esbuild'`                       | Não         | O bundler a usar.                                                                                    |
| `entry`                     | `string \| string[] \| Record<string, string>` | Não         | O arquivo de entrada, uma lista de arquivos de entrada ou um mapa de nomes de entrada para arquivos. |
| `preset`                    | `string \| AzionBuildPreset`                   | Não         | O preset a usar, pelo nome ou como um objeto de preset personalizado.                                |
| `polyfills`                 | `boolean`                                      | Não         | Se o build adiciona polyfills.                                                                       |
| `worker`                    | `boolean`                                      | Não         | Se o build produz um worker.                                                                         |
| `extend`                    | `(context) => context`                         | Não         | Função que recebe a configuração do bundler, webpack ou esbuild, e a retorna estendida.              |
| `memoryFS.injectionDirs`    | `string[]`                                     | Sim         | Pastas cujos arquivos o build injeta no sistema de arquivos em memória.                              |
| `memoryFS.removePathPrefix` | `string`                                       | Sim         | Prefixo de caminho removido dos caminhos dos arquivos injetados.                                     |

#### Preset personalizado

Um preset personalizado é um objeto `AzionBuildPreset` passado em `build.preset`. Ele traz a própria configuração e as funções que rodam em torno do build.

| Propriedade         | Tipo                                                    | Obrigatório | Descrição                               |
| ------------------- | ------------------------------------------------------- | ----------- | --------------------------------------- |
| `config`            | `AzionConfig`                                           | Sim         | A configuração que o preset fornece.    |
| `metadata.name`     | `string`                                                | Sim         | O nome do preset.                       |
| `metadata.registry` | `string`                                                | Não         | O registry do preset.                   |
| `metadata.ext`      | `string`                                                | Não         | A extensão de arquivo que o preset usa. |
| `handler`           | `AzionRuntimeModule`                                    | Não         | Um handler personalizado.               |
| `prebuild`          | `(config, ctx) => Promise<void \| AzionPrebuildResult>` | Não         | Função que roda antes do build.         |
| `postbuild`         | `(config, ctx) => Promise<void>`                        | Não         | Função que roda depois do build.        |

### applications

Cada entrada de `applications` declara uma [aplicação](/pt-br/documentacao/plataforma/applications/), o recurso que guarda as configurações de entrega de um site ou de uma API.

| Propriedade                     | Tipo                      | Obrigatório | Descrição                                                                                                                                          |
| ------------------------------- | ------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name`                          | `string`                  | Sim         | O nome da aplicação.                                                                                                                               |
| `active`                        | `boolean`                 | Não         | Se a aplicação está ativa.                                                                                                                         |
| `debug`                         | `boolean`                 | Não         | Se o modo de depuração está ligado para as regras da aplicação.                                                                                    |
| `edgeCacheEnabled`              | `boolean`                 | Não         | Se o [Cache](/pt-br/documentacao/plataforma/applications/cache/cache-settings/) está ligado.                                                       |
| `functionsEnabled`              | `boolean`                 | Não         | Se [Functions](/pt-br/documentacao/plataforma/functions/) está ligado.                                                                             |
| `applicationAcceleratorEnabled` | `boolean`                 | Não         | Se o Application Accelerator está ligado.                                                                                                          |
| `imageProcessorEnabled`         | `boolean`                 | Não         | Se o Image Processor está ligado.                                                                                                                  |
| `cache`                         | `AzionCache[]`            | Não         | Os cache settings da aplicação.                                                                                                                    |
| `rules`                         | `AzionRules`              | Não         | As regras da aplicação: `request` guarda as regras da fase de requisição, e `response` as regras da fase de resposta. Cada uma é um `AzionRule[]`. |
| `deviceGroups`                  | `AzionDeviceGroup[]`      | Não         | Os device groups da aplicação.                                                                                                                     |
| `functionsInstances`            | `AzionFunctionInstance[]` | Não         | As function instances da aplicação.                                                                                                                |

#### Cache settings da aplicação

Cada entrada do `cache` de uma aplicação declara um [cache setting](/pt-br/documentacao/plataforma/applications/cache/cache-settings/), que uma regra aplica com o behavior `set_cache_policy`.

| Propriedade                 | Tipo                                             | Obrigatório | Descrição                                                                                         |
| --------------------------- | ------------------------------------------------ | ----------- | ------------------------------------------------------------------------------------------------- |
| `name`                      | `string`                                         | Sim         | O nome do cache setting.                                                                          |
| `stale`                     | `boolean`                                        | Não         | Se conteúdo expirado pode ser servido.                                                            |
| `queryStringSort`           | `boolean`                                        | Não         | Se os parâmetros da query string são ordenados.                                                   |
| `tieredCache.enabled`       | `boolean`                                        | Sim         | Se o [Tiered Cache](/pt-br/documentacao/plataforma/applications/cache/tiered-cache/) está ligado. |
| `tieredCache.topology`      | `'nearest-region' \| 'br-east-1' \| 'us-east-1'` | Não         | A topologia do Tiered Cache.                                                                      |
| `methods.post`              | `boolean`                                        | Não         | Se as requisições `POST` são cacheadas.                                                           |
| `methods.options`           | `boolean`                                        | Não         | Se as requisições `OPTIONS` são cacheadas.                                                        |
| `browser.maxAgeSeconds`     | `number \| string`                               | Sim         | Idade máxima do conteúdo no cache do navegador, em segundos.                                      |
| `edge.maxAgeSeconds`        | `number \| string`                               | Sim         | Idade máxima do conteúdo no cache da Azion, em segundos.                                          |
| `cacheByCookie.option`      | `'ignore' \| 'all' \| 'allowlist' \| 'denylist'` | Sim         | Quais cookies variam o cache.                                                                     |
| `cacheByCookie.list`        | `string[]`                                       | Não         | Os cookies que a opção `allowlist` ou `denylist` indica.                                          |
| `cacheByQueryString.option` | `'ignore' \| 'all' \| 'allowlist' \| 'denylist'` | Sim         | Quais parâmetros da query string variam o cache.                                                  |
| `cacheByQueryString.list`   | `string[]`                                       | Não         | Os parâmetros que a opção `allowlist` ou `denylist` indica.                                       |

#### Regras da aplicação

Cada entrada de `rules.request` ou `rules.response` declara uma regra do [Rules Engine](/pt-br/documentacao/plataforma/applications/rules-engine/) da aplicação. Uma regra executa seus behaviors quando seus critérios correspondem.

| Propriedade   | Tipo                    | Obrigatório | Descrição                                                                         |
| ------------- | ----------------------- | ----------- | --------------------------------------------------------------------------------- |
| `name`        | `string`                | Sim         | O nome da regra.                                                                  |
| `description` | `string`                | Não         | Uma descrição da regra.                                                           |
| `active`      | `boolean`               | Não         | Se a regra está ativa.                                                            |
| `criteria`    | `AzionRuleCriteria[][]` | Sim         | Os critérios, como um array de grupos. Cada grupo é um array de 1 a 10 critérios. |
| `behaviors`   | `AzionRuleBehavior[]`   | Sim         | Os behaviors que a regra executa, em ordem.                                       |

#### Critérios da regra

Cada critério de uma regra de aplicação compara uma variável com um valor. As variáveis que uma regra de aplicação aceita estão em [Variáveis de regra](#variaveis-de-regra), e os operadores em [Operadores de comparação](#operadores-de-comparacao).

| Propriedade   | Tipo                    | Obrigatório                              | Descrição                                                    |
| ------------- | ----------------------- | ---------------------------------------- | ------------------------------------------------------------ |
| `variable`    | `string`                | Sim                                      | A variável a avaliar, envolvida em `${}`, como `${uri}`.     |
| `conditional` | `'if' \| 'and' \| 'or'` | Sim                                      | Como o critério se une aos critérios anteriores.             |
| `operator`    | `string`                | Sim                                      | O operador de comparação.                                    |
| `argument`    | `string`                | Sim, com um operador que recebe um valor | O valor a comparar. Omita-o com `exists` e `does_not_exist`. |

#### Behaviors da regra

Cada behavior de uma regra de aplicação é um objeto com um `type` e, na maioria dos tipos, um objeto `attributes`. Um `value` que recebe um nome ou um ID se refere a um recurso declarado no mesmo arquivo pelo seu `name`, ou a um recurso existente pelo seu ID.

| `type`                   | Fase                  | `attributes`                                                 | Descrição                                                                                                                |
| ------------------------ | --------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
| `deliver`                | Requisição e resposta | —                                                            | Entrega o conteúdo.                                                                                                      |
| `enable_gzip`            | Requisição e resposta | —                                                            | Liga a compressão GZIP.                                                                                                  |
| `redirect_to_301`        | Requisição e resposta | `{ value: string }`                                          | Redireciona para `value` com status `301`.                                                                               |
| `redirect_to_302`        | Requisição e resposta | `{ value: string }`                                          | Redireciona para `value` com status `302`.                                                                               |
| `run_function`           | Requisição e resposta | `{ value: string \| number }`                                | Executa a function que `value` indica, pelo nome ou ID.                                                                  |
| `capture_match_groups`   | Requisição e resposta | `{ regex: string; subject: string; captured_array: string }` | Compara `regex` com `subject` e guarda os grupos capturados no array que `captured_array` nomeia, com 1 a 10 caracteres. |
| `deny`                   | Requisição            | —                                                            | Nega a requisição.                                                                                                       |
| `no_content`             | Requisição            | —                                                            | Não retorna conteúdo.                                                                                                    |
| `finish_request_phase`   | Requisição            | —                                                            | Encerra a fase de requisição.                                                                                            |
| `forward_cookies`        | Requisição            | —                                                            | Encaminha os cookies.                                                                                                    |
| `optimize_images`        | Requisição            | —                                                            | Otimiza imagens.                                                                                                         |
| `bypass_cache`           | Requisição            | —                                                            | Ignora o cache.                                                                                                          |
| `redirect_http_to_https` | Requisição            | —                                                            | Redireciona requisições HTTP para HTTPS.                                                                                 |
| `rewrite_request`        | Requisição            | `{ value: string }`                                          | Reescreve a URI da requisição para `value`.                                                                              |
| `set_cache_policy`       | Requisição            | `{ value: string \| number }`                                | Aplica o cache setting que `value` indica, pelo nome ou ID.                                                              |
| `set_connector`          | Requisição            | `{ value: string \| number }`                                | Envia a requisição para o connector que `value` indica, pelo nome ou ID.                                                 |
| `set_origin`             | Requisição            | `{ value: string \| number }`                                | Define a origem, pelo nome ou ID.                                                                                        |
| `add_request_header`     | Requisição            | `{ value: string }`                                          | Adiciona à requisição o header em `value`, escrito como `Name: value`.                                                   |
| `filter_request_header`  | Requisição            | `{ value: string }`                                          | Remove da requisição o header que `value` indica.                                                                        |
| `add_request_cookie`     | Requisição            | `{ value: string }`                                          | Adiciona um cookie à requisição.                                                                                         |
| `filter_request_cookie`  | Requisição            | `{ value: string }`                                          | Remove um cookie da requisição.                                                                                          |
| `add_response_header`    | Resposta              | `{ value: string }`                                          | Adiciona à resposta o header em `value`, escrito como `Name: value`.                                                     |
| `filter_response_header` | Resposta              | `{ value: string }`                                          | Remove da resposta o header que `value` indica.                                                                          |
| `set_cookie`             | Resposta              | `{ value: string }`                                          | Define um cookie na resposta.                                                                                            |
| `filter_response_cookie` | Resposta              | `{ value: string }`                                          | Remove um cookie da resposta.                                                                                            |

#### Device groups

Cada entrada do `deviceGroups` de uma aplicação declara um [device group](/pt-br/documentacao/plataforma/applications/device-groups/).

| Propriedade | Tipo     | Obrigatório | Descrição                                                      |
| ----------- | -------- | ----------- | -------------------------------------------------------------- |
| `name`      | `string` | Sim         | O nome do device group.                                        |
| `userAgent` | `string` | Sim         | A expressão regular que o header `User-Agent` precisa atender. |

#### Function instances

Cada entrada do `functionsInstances` de uma aplicação vincula uma function à aplicação, para que um behavior `run_function` possa executá-la.

| Propriedade | Tipo                      | Obrigatório | Descrição                                        |
| ----------- | ------------------------- | ----------- | ------------------------------------------------ |
| `name`      | `string`                  | Sim         | O nome da function instance.                     |
| `ref`       | `string \| number`        | Sim         | A function, pelo nome em `functions` ou pelo ID. |
| `args`      | `Record<string, unknown>` | Não         | Os argumentos desta instance.                    |
| `active`    | `boolean`                 | Não         | Se a instance está ativa.                        |

### functions

Cada entrada de `functions` declara uma [function](/pt-br/documentacao/plataforma/functions/) e o arquivo que guarda o código dela.

| Propriedade               | Tipo                          | Obrigatório | Descrição                                              |
| ------------------------- | ----------------------------- | ----------- | ------------------------------------------------------ |
| `name`                    | `string`                      | Sim         | O nome da function.                                    |
| `path`                    | `string`                      | Sim         | Caminho do arquivo da function.                        |
| `runtime`                 | `'azion_js'`                  | Não         | O runtime da function.                                 |
| `defaultArgs`             | `Record<string, unknown>`     | Não         | Os argumentos padrão passados à function.              |
| `executionEnvironment`    | `'application' \| 'firewall'` | Não         | Se a function roda em uma aplicação ou em um firewall. |
| `active`                  | `boolean`                     | Não         | Se a function está ativa.                              |
| `bindings.storage.bucket` | `string`                      | Sim         | O bucket vinculado à function, pelo nome ou ID.        |
| `bindings.storage.prefix` | `string`                      | Não         | O prefixo dentro do bucket vinculado.                  |

### connectors

Cada entrada de `connectors` declara um [connector](/pt-br/documentacao/plataforma/connectors/). O `type` seleciona o formato de `attributes`: `http` e `live_ingest` recebem endereços e opções de conexão, e `storage` recebe um bucket.

| Propriedade  | Tipo                                   | Obrigatório | Descrição                                                      |
| ------------ | -------------------------------------- | ----------- | -------------------------------------------------------------- |
| `name`       | `string`                               | Sim         | O nome do connector.                                           |
| `active`     | `boolean`                              | Não         | Se o connector está ativo.                                     |
| `type`       | `'http' \| 'storage' \| 'live_ingest'` | Sim         | O tipo de connector: HTTP, Object Storage ou Live Ingest.      |
| `attributes` | `object`                               | Sim         | As configurações do connector, em um dos dois formatos abaixo. |

#### Atributos de connectors HTTP e Live Ingest

Um connector `http` ou `live_ingest` recebe o mesmo objeto `attributes`.

| Propriedade         | Tipo                         | Obrigatório | Descrição                                                                                                                                            |
| ------------------- | ---------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `addresses`         | `ConnectorAddress[]`         | Sim         | Os endereços para os quais o connector envia requisições.                                                                                            |
| `connectionOptions` | `ConnectorConnectionOptions` | Sim         | Como o connector se conecta aos endereços.                                                                                                           |
| `modules`           | `ConnectorModules`           | Sim         | As configurações de load balancer e de origin shield. O tipo o marca como opcional, mas o build recusa um connector `http` ou `live_ingest` sem ele. |

#### Endereços do connector

Cada entrada de `attributes.addresses` é um endereço de um connector `http` ou `live_ingest`.

| Propriedade | Tipo             | Obrigatório | Descrição                                                                   |
| ----------- | ---------------- | ----------- | --------------------------------------------------------------------------- |
| `address`   | `string`         | Sim         | Um endereço IPv4 ou IPv6, ou um CNAME.                                      |
| `active`    | `boolean`        | Não         | Se o endereço está ativo.                                                   |
| `httpPort`  | `number`         | Não         | A porta HTTP.                                                               |
| `httpsPort` | `number`         | Não         | A porta HTTPS.                                                              |
| `modules`   | `object \| null` | Não         | Os `modules` do endereço. O tipo não declara propriedades para este objeto. |

#### Opções de conexão

O objeto `attributes.connectionOptions` de um connector `http` ou `live_ingest` define como ele se conecta aos seus endereços.

| Propriedade         | Tipo                                          | Obrigatório | Descrição                                        |
| ------------------- | --------------------------------------------- | ----------- | ------------------------------------------------ |
| `dnsResolution`     | `'both' \| 'force_ipv4'`                      | Não         | A política de resolução DNS.                     |
| `transportPolicy`   | `'preserve' \| 'force_https' \| 'force_http'` | Não         | A política de transporte.                        |
| `httpVersionPolicy` | `'http1_1'`                                   | Não         | A política de versão HTTP.                       |
| `host`              | `string`                                      | Não         | Um valor de `Host` personalizado.                |
| `pathPrefix`        | `string`                                      | Não         | Um prefixo de caminho adicionado às requisições. |
| `followingRedirect` | `boolean`                                     | Não         | Se o connector segue redirecionamentos.          |
| `realIpHeader`      | `string`                                      | Não         | O nome do header que leva o IP do cliente.       |
| `realPortHeader`    | `string`                                      | Não         | O nome do header que leva a porta do cliente.    |

#### Modules do connector

O objeto `attributes.modules` de um connector `http` ou `live_ingest` liga ou desliga o [load balancer](/pt-br/documentacao/plataforma/connectors/load-balancer/metodos-de-balanceamento/) e o [origin shield](/pt-br/documentacao/plataforma/connectors/origin-shield/origin-ip-acl-e-hmac/).

| Propriedade                                            | Tipo                                         | Obrigatório | Descrição                                                      |
| ------------------------------------------------------ | -------------------------------------------- | ----------- | -------------------------------------------------------------- |
| `loadBalancer.enabled`                                 | `boolean`                                    | Sim         | Se o load balancer está ligado.                                |
| `loadBalancer.config`                                  | `object \| null`                             | Sim         | As configurações do load balancer, ou `null`.                  |
| `loadBalancer.config.method`                           | `'round_robin' \| 'least_conn' \| 'ip_hash'` | Não         | O método de balanceamento de carga.                            |
| `loadBalancer.config.maxRetries`                       | `number`                                     | Não         | O número máximo de novas tentativas.                           |
| `loadBalancer.config.connectionTimeout`                | `number`                                     | Não         | O timeout de conexão, em segundos.                             |
| `loadBalancer.config.readWriteTimeout`                 | `number`                                     | Não         | O timeout de leitura e escrita, em segundos.                   |
| `originShield.enabled`                                 | `boolean`                                    | Sim         | Se o origin shield está ligado.                                |
| `originShield.config`                                  | `object \| null`                             | Sim         | As configurações do origin shield, ou `null`.                  |
| `originShield.config.originIpAcl.enabled`              | `boolean`                                    | Não         | Se a lista de controle de acesso de IPs de origem está ligada. |
| `originShield.config.hmac.enabled`                     | `boolean`                                    | Não         | Se a autenticação HMAC está ligada.                            |
| `originShield.config.hmac.config.type`                 | `'aws4_hmac_sha256'`                         | Sim         | O tipo de HMAC.                                                |
| `originShield.config.hmac.config.attributes.region`    | `string`                                     | Sim         | A região da AWS.                                               |
| `originShield.config.hmac.config.attributes.service`   | `string`                                     | Não         | O serviço da AWS.                                              |
| `originShield.config.hmac.config.attributes.accessKey` | `string`                                     | Sim         | A access key.                                                  |
| `originShield.config.hmac.config.attributes.secretKey` | `string`                                     | Sim         | A secret key.                                                  |

#### Atributos do connector de storage

Um connector `storage` lê de um bucket do [Object Storage](/pt-br/documentacao/plataforma/object-storage/).

| Propriedade | Tipo     | Obrigatório | Descrição                                                                                                         |
| ----------- | -------- | ----------- | ----------------------------------------------------------------------------------------------------------------- |
| `bucket`    | `string` | Sim         | O nome do bucket.                                                                                                 |
| `prefix`    | `string` | Sim         | O prefixo dos objetos no bucket. O tipo o marca como opcional, mas o build recusa um connector `storage` sem ele. |

### storage

Cada entrada de `storage` declara um bucket do Object Storage e a pasta local cujos arquivos vão para ele.

| Propriedade       | Tipo                                          | Obrigatório | Descrição                                                 |
| ----------------- | --------------------------------------------- | ----------- | --------------------------------------------------------- |
| `name`            | `string`                                      | Sim         | O nome do bucket.                                         |
| `dir`             | `string`                                      | Sim         | A pasta local que guarda os arquivos, como `./www`.       |
| `prefix`          | `string`                                      | Sim         | O prefixo sob o qual os arquivos são guardados no bucket. |
| `workloadsAccess` | `'read_only' \| 'read_write' \| 'restricted'` | Não         | O acesso que os workloads têm ao bucket.                  |

### firewall

Cada entrada de `firewall` declara um [firewall](/pt-br/documentacao/plataforma/firewall/).

| Propriedade          | Tipo                               | Obrigatório | Descrição                                                      |
| -------------------- | ---------------------------------- | ----------- | -------------------------------------------------------------- |
| `name`               | `string`                           | Sim         | O nome do firewall.                                            |
| `active`             | `boolean`                          | Não         | Se o firewall está ativo.                                      |
| `functions`          | `boolean`                          | Não         | Se Functions está ligado para o firewall.                      |
| `networkProtection`  | `boolean`                          | Não         | Se o Network Shield está ligado.                               |
| `waf`                | `boolean`                          | Não         | Se o WAF está ligado.                                          |
| `debugRules`         | `boolean`                          | Não         | Se o modo de depuração está ligado para as regras do firewall. |
| `rules`              | `AzionFirewallRule[]`              | Não         | As regras do firewall.                                         |
| `functionsInstances` | `AzionFirewallFunctionsInstance[]` | Não         | As function instances do firewall.                             |

#### Regras de firewall

Cada entrada do `rules` de um firewall declara uma regra do [Rules Engine](/pt-br/documentacao/plataforma/firewall/rules-engine/) do firewall. Ao contrário de uma regra de aplicação, uma regra de firewall recebe um array simples de critérios.

| Propriedade   | Tipo                          | Obrigatório | Descrição                                                                 |
| ------------- | ----------------------------- | ----------- | ------------------------------------------------------------------------- |
| `name`        | `string`                      | Sim         | O nome da regra.                                                          |
| `description` | `string`                      | Não         | Uma descrição da regra.                                                   |
| `active`      | `boolean`                     | Não         | Se a regra está ativa.                                                    |
| `criteria`    | `AzionFirewallCriteria[]`     | Não         | Os critérios da regra.                                                    |
| `match`       | `string`                      | Não         | Uma expressão de correspondência, a alternativa mais antiga a `criteria`. |
| `variable`    | `string`                      | Não         | A variável à qual `match` se aplica.                                      |
| `behaviors`   | `AzionFirewallBehaviorItem[]` | Sim         | Os behaviors que a regra executa, em ordem.                               |

#### Critérios da regra de firewall

Cada critério de uma regra de firewall compara uma variável de firewall com um valor. As variáveis que uma regra de firewall aceita estão em [Variáveis de regra de firewall](#variaveis-de-regra-de-firewall).

| Propriedade   | Tipo                    | Obrigatório                              | Descrição                                                                  |
| ------------- | ----------------------- | ---------------------------------------- | -------------------------------------------------------------------------- |
| `variable`    | `string`                | Sim                                      | A variável de firewall a avaliar, com ou sem `${}`, como `${request_uri}`. |
| `conditional` | `'if' \| 'and' \| 'or'` | Sim                                      | Como o critério se une aos critérios anteriores.                           |
| `operator`    | `string`                | Sim                                      | O operador de comparação.                                                  |
| `argument`    | `string \| number`      | Sim, com um operador que recebe um valor | O valor a comparar. Omita-o com `exists` e `does_not_exist`.               |

#### Behaviors da regra de firewall

Cada behavior de uma regra de firewall é um objeto com um `type` e, na maioria dos tipos, um objeto `attributes`.

| `type`                | `attributes`                                                                                                           | Descrição                                                                                                                   |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `deny`                | —                                                                                                                      | Nega a requisição.                                                                                                          |
| `drop`                | —                                                                                                                      | Descarta a requisição.                                                                                                      |
| `run_function`        | `{ value: string \| number }`                                                                                          | Executa a function que `value` indica, pelo nome ou ID.                                                                     |
| `set_waf`             | `{ mode: 'learning' \| 'blocking'; wafId: string \| number }`                                                          | Aplica o WAF que `wafId` indica, pelo nome ou ID, no modo que `mode` define.                                                |
| `set_rate_limit`      | `{ type: 'second' \| 'minute'; limitBy: 'client_ip' \| 'global'; averageRateLimit: string; maximumBurstSize: string }` | Limita a taxa de requisições por segundo ou por minuto, para cada IP de cliente ou para todos os clientes.                  |
| `set_custom_response` | `{ statusCode: number \| string; contentType: string; contentBody: string }`                                           | Retorna uma resposta com o status, o tipo de conteúdo e o corpo que você define. `statusCode` recebe um valor de 200 a 499. |

#### Function instances do firewall

Cada entrada do `functionsInstances` de um firewall vincula uma function ao firewall.

| Propriedade | Tipo                     | Obrigatório | Descrição                                        |
| ----------- | ------------------------ | ----------- | ------------------------------------------------ |
| `name`      | `string`                 | Sim         | O nome da function instance.                     |
| `ref`       | `string \| number`       | Sim         | A function, pelo nome em `functions` ou pelo ID. |
| `args`      | `Record<string, string>` | Não         | Os argumentos desta instance.                    |
| `active`    | `boolean`                | Não         | Se a instance está ativa.                        |

### networkList

Cada entrada de `networkList` declara uma [network list](/pt-br/documentacao/plataforma/firewall/network-shield/network-lists/).

| Propriedade | Tipo                                | Obrigatório | Descrição                                                    |
| ----------- | ----------------------------------- | ----------- | ------------------------------------------------------------ |
| `name`      | `string`                            | Sim         | O nome da network list.                                      |
| `type`      | `'ip_cidr' \| 'asn' \| 'countries'` | Sim         | O tipo de item que a lista guarda.                           |
| `items`     | `string[]`                          | Sim         | Os endereços IP ou intervalos CIDR, ASNs ou países da lista. |
| `active`    | `boolean`                           | Não         | Se a network list está ativa.                                |

### purge

Cada entrada de `purge` declara um [purge](/pt-br/documentacao/plataforma/applications/cache/real-time-purge/) de conteúdo em cache.

| Propriedade | Tipo                                | Obrigatório | Descrição                                            |
| ----------- | ----------------------------------- | ----------- | ---------------------------------------------------- |
| `type`      | `'url' \| 'cachekey' \| 'wildcard'` | Sim         | O tipo de purge.                                     |
| `items`     | `string[]`                          | Sim         | As URLs, cache keys ou expressões wildcard a purgar. |
| `layer`     | `'cache' \| 'tiered_cache'`         | Não         | A camada de cache a purgar.                          |

### waf

Cada entrada de `waf` declara uma configuração do Web Application Firewall (WAF), que uma regra de firewall aplica com o behavior `set_waf`.

| Propriedade                            | Tipo             | Obrigatório | Descrição                                 |
| -------------------------------------- | ---------------- | ----------- | ----------------------------------------- |
| `name`                                 | `string`         | Sim         | O nome do WAF.                            |
| `productVersion`                       | `string`         | Não         | A versão do produto.                      |
| `engineSettings.engineVersion`         | `'2021-Q3'`      | Sim         | A versão do engine.                       |
| `engineSettings.type`                  | `'score'`        | Sim         | O tipo do engine.                         |
| `engineSettings.attributes.rulesets`   | `1[]`            | Sim         | Os rule sets.                             |
| `engineSettings.attributes.thresholds` | `WafThreshold[]` | Sim         | A sensibilidade para cada tipo de ameaça. |

#### Limiares de ameaça

Cada entrada de `engineSettings.attributes.thresholds` define quão sensível o WAF é a um tipo de ameaça. Para saber o que os níveis significam, consulte [Score e modos](/pt-br/documentacao/plataforma/firewall/waf/score-e-modos/).

| Propriedade   | Tipo                                                                                                                                                                             | Obrigatório | Descrição                 |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------- |
| `threat`      | `'cross_site_scripting' \| 'directory_traversal' \| 'evading_tricks' \| 'file_upload' \| 'identified_attack' \| 'remote_file_inclusion' \| 'sql_injection' \| 'unwanted_access'` | Sim         | O tipo de ameaça.         |
| `sensitivity` | `'lowest' \| 'low' \| 'medium' \| 'high' \| 'highest'`                                                                                                                           | Sim         | O nível de sensibilidade. |

### workloads

Cada entrada de `workloads` declara um [workload](/pt-br/documentacao/plataforma/workloads/), que serve uma aplicação nos seus domínios.

| Propriedade                 | Tipo                                                             | Obrigatório | Descrição                                                               |
| --------------------------- | ---------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------- |
| `name`                      | `string`                                                         | Sim         | O nome do workload.                                                     |
| `active`                    | `boolean`                                                        | Não         | Se o workload está ativo.                                               |
| `infrastructure`            | `1 \| 2`                                                         | Não         | O tipo de infraestrutura: `1` para Standard, `2` para High Performance. |
| `domains`                   | `string[]`                                                       | Não         | Os domínios do workload.                                                |
| `workloadDomainAllowAccess` | `boolean`                                                        | Não         | Se o domínio de workload que a Azion atribui também serve o workload.   |
| `tls.certificate`           | `number \| null`                                                 | Não         | O ID do certificado.                                                    |
| `tls.ciphers`               | `1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| null`                   | Não         | A suíte de cifras.                                                      |
| `tls.minimumVersion`        | `'' \| 'tls_1_0' \| 'tls_1_1' \| 'tls_1_2' \| 'tls_1_3' \| null` | Não         | A versão mínima do TLS.                                                 |
| `protocols.http.versions`   | `('http1' \| 'http2' \| 'http3')[]`                              | Sim         | As versões de HTTP servidas.                                            |
| `protocols.http.httpPorts`  | `number[]`                                                       | Sim         | As portas HTTP.                                                         |
| `protocols.http.httpsPorts` | `number[]`                                                       | Sim         | As portas HTTPS.                                                        |
| `protocols.http.quicPorts`  | `number[] \| null`                                               | Não         | As portas QUIC.                                                         |
| `mtls.enabled`              | `boolean`                                                        | Sim         | Se o TLS mútuo (mTLS) está ligado.                                      |
| `mtls.config.verification`  | `'enforce' \| 'permissive'`                                      | Sim         | O modo de verificação do mTLS.                                          |
| `mtls.config.certificate`   | `number \| null`                                                 | Não         | O ID do certificado de CA confiável.                                    |
| `mtls.config.crl`           | `number[] \| null`                                               | Não         | Os IDs das listas de revogação de certificados.                         |
| `deployments`               | `AzionWorkloadDeployment[]`                                      | Não         | Os deployments do workload.                                             |

#### Deployments do workload

Cada entrada do `deployments` de um workload define qual aplicação, firewall e custom page o workload serve.

| Propriedade                       | Tipo                       | Obrigatório | Descrição                                                       |
| --------------------------------- | -------------------------- | ----------- | --------------------------------------------------------------- |
| `name`                            | `string`                   | Sim         | O nome do deployment.                                           |
| `current`                         | `boolean`                  | Não         | Se este é o deployment atual.                                   |
| `active`                          | `boolean`                  | Não         | Se o deployment está ativo.                                     |
| `strategy.type`                   | `string`                   | Sim         | A estratégia do deployment. Os arquivos gerados usam `default`. |
| `strategy.attributes.application` | `string \| number`         | Sim         | A aplicação, pelo nome ou ID.                                   |
| `strategy.attributes.firewall`    | `string \| number \| null` | Não         | O firewall, pelo nome ou ID.                                    |
| `strategy.attributes.customPage`  | `string \| number \| null` | Não         | A custom page, pelo nome ou ID.                                 |

### customPages

Cada entrada de `customPages` declara um conjunto de [custom pages](/pt-br/documentacao/plataforma/workloads/custom-pages/configuracoes/), as páginas que a Azion retorna no lugar de uma resposta de erro.

| Propriedade | Tipo                     | Obrigatório | Descrição                           |
| ----------- | ------------------------ | ----------- | ----------------------------------- |
| `name`      | `string`                 | Sim         | O nome do conjunto de custom pages. |
| `active`    | `boolean`                | Não         | Se o conjunto está ativo.           |
| `pages`     | `AzionCustomPageEntry[]` | Sim         | Uma entrada por código de erro.     |

#### Entradas de custom page

Cada entrada do `pages` de um conjunto de custom pages associa um código de erro a uma página que um connector serve.

| Propriedade                        | Tipo               | Obrigatório | Descrição                                                                                                                                                                                                                              |
| ---------------------------------- | ------------------ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `code`                             | `string`           | Sim         | O código de erro: `'default'`, `'400'`, `'401'`, `'403'`, `'404'`, `'405'`, `'406'`, `'408'`, `'409'`, `'410'`, `'411'`, `'414'`, `'415'`, `'416'`, `'426'`, `'429'`, `'431'`, `'500'`, `'501'`, `'502'`, `'503'`, `'504'` ou `'505'`. |
| `page.type`                        | `'page_connector'` | Não         | O tipo de página.                                                                                                                                                                                                                      |
| `page.attributes.connector`        | `string \| number` | Sim         | O connector que serve a página, pelo nome ou ID.                                                                                                                                                                                       |
| `page.attributes.ttl`              | `number`           | Não         | Por quanto tempo a página fica em cache, em segundos.                                                                                                                                                                                  |
| `page.attributes.uri`              | `string \| null`   | Não         | O caminho da página.                                                                                                                                                                                                                   |
| `page.attributes.customStatusCode` | `number \| null`   | Não         | O código de status retornado com a página.                                                                                                                                                                                             |

### kv

Cada entrada de `kv` declara um namespace do [KV Store](/pt-br/documentacao/plataforma/kv-store/).

| Propriedade | Tipo     | Obrigatório | Descrição            |
| ----------- | -------- | ----------- | -------------------- |
| `name`      | `string` | Sim         | O nome do namespace. |

---

## Variáveis de regra

As regras de aplicação e as regras de firewall avaliam conjuntos diferentes de variáveis nos seus critérios.

### Variáveis de regra de aplicação

Um critério de regra de aplicação recebe sua `variable` envolvida em `${}`, como `${uri}`; o build recusa um nome sem ela. Estas variáveis estão disponíveis nas duas fases:

| Variável                    | Descrição                           |
| --------------------------- | ----------------------------------- |
| `args`                      | Os argumentos da requisição.        |
| `device_group`              | O device group.                     |
| `domain`                    | O domínio.                          |
| `geoip_city`                | A cidade, pelo GeoIP.               |
| `geoip_city_continent_code` | O código do continente, pelo GeoIP. |
| `geoip_city_country_code`   | O código do país, pelo GeoIP.       |
| `geoip_city_country_name`   | O nome do país, pelo GeoIP.         |
| `geoip_continent_code`      | O código do continente.             |
| `geoip_country_code`        | O código do país.                   |
| `geoip_country_name`        | O nome do país.                     |
| `geoip_region`              | A região, pelo GeoIP.               |
| `geoip_region_name`         | O nome da região, pelo GeoIP.       |
| `host`                      | O host da requisição.               |
| `network`                   | A rede.                             |
| `remote_addr`               | O endereço IP remoto.               |
| `remote_port`               | A porta remota.                     |
| `remote_user`               | O usuário remoto.                   |
| `request`                   | A requisição completa.              |
| `request_body`              | O corpo da requisição.              |
| `request_method`            | O método HTTP.                      |
| `request_uri`               | A URI da requisição.                |
| `scheme`                    | O esquema, `http` ou `https`.       |
| `uri`                       | A URI.                              |

Estas variáveis estão disponíveis apenas na fase de requisição:

| Variável                  | Descrição                                                    |
| ------------------------- | ------------------------------------------------------------ |
| `server_addr`             | O endereço do servidor.                                      |
| `server_port`             | A porta do servidor.                                         |
| `ssl_client_cert`         | O certificado SSL do cliente.                                |
| `ssl_client_escaped_cert` | O certificado SSL do cliente, escapado.                      |
| `ssl_client_fingerprint`  | A impressão digital do certificado SSL do cliente.           |
| `ssl_client_i_dn`         | O DN do emissor do certificado SSL do cliente.               |
| `ssl_client_s_dn`         | O DN do titular do certificado SSL do cliente.               |
| `ssl_client_s_dn_parsed`  | O DN do titular, interpretado.                               |
| `ssl_client_serial`       | O número de série do certificado SSL do cliente.             |
| `ssl_client_v_end`        | A data final da validade do certificado SSL do cliente.      |
| `ssl_client_v_remain`     | Os dias restantes da validade do certificado SSL do cliente. |
| `ssl_client_v_start`      | A data inicial da validade do certificado SSL do cliente.    |
| `ssl_client_verify`       | O status da verificação SSL.                                 |

Estas variáveis estão disponíveis apenas na fase de resposta:

| Variável          | Descrição                      |
| ----------------- | ------------------------------ |
| `sent_http_name`  | O nome HTTP enviado.           |
| `status`          | O código de status HTTP.       |
| `tcpinfo_rtt`     | O tempo de ida e volta do TCP. |
| `upstream_addr`   | O endereço do upstream.        |
| `upstream_status` | O status do upstream.          |

Uma variável também pode indicar um argumento, um cookie ou um header específico, com um prefixo seguido do nome:

| Prefixo                  | Descrição                     |
| ------------------------ | ----------------------------- |
| `arg_<name>`             | Um argumento da requisição.   |
| `cookie_<name>`          | Um cookie.                    |
| `http_<name>`            | Um header HTTP da requisição. |
| `sent_http_<name>`       | Um header HTTP enviado.       |
| `upstream_cookie_<name>` | Um cookie do upstream.        |
| `upstream_http_<name>`   | Um header HTTP do upstream.   |

### Variáveis de regra de firewall

Um critério de regra de firewall aceita seu próprio conjunto de 15 variáveis, com ou sem `${}`: `client_certificate_validation`, `header_accept`, `header_accept_encoding`, `header_accept_language`, `header_cookie`, `header_origin`, `header_referer`, `header_user_agent`, `host`, `network`, `request_args`, `request_method`, `request_uri`, `scheme` e `ssl_verification_status`. O build recusa qualquer outra variável em uma regra de firewall, incluindo `remote_addr` e os nomes com prefixo.

---

## Operadores de comparação

O `operator` de um critério de aplicação ou de firewall recebe um destes valores. Um operador que recebe um valor precisa de um `argument`:

| Operador              | Recebe um valor | Descrição                            |
| --------------------- | --------------- | ------------------------------------ |
| `is_equal`            | Sim             | É igual a.                           |
| `is_not_equal`        | Sim             | Não é igual a.                       |
| `starts_with`         | Sim             | Começa com.                          |
| `does_not_start_with` | Sim             | Não começa com.                      |
| `matches`             | Sim             | Corresponde à expressão regular.     |
| `does_not_match`      | Sim             | Não corresponde à expressão regular. |
| `is_in_list`          | Sim             | Está na lista.                       |
| `is_not_in_list`      | Sim             | Não está na lista.                   |
| `exists`              | Não             | Existe.                              |
| `does_not_exist`      | Não             | Não existe.                          |

---

## Exemplos

Os dois arquivos abaixo são o arquivo que `azion init` gera para um projeto de function e um arquivo escrito à mão para `azion config apply`.

### Projeto de function gerado pelo azion init

`azion init` com o preset JavaScript escreve este `azion.config.mjs`. Ele declara uma function, uma aplicação cuja regra executa a function em toda requisição e um workload que serve a aplicação:

```javascript
/**
 * This file was automatically generated based on your preset configuration.
 *
 * For better type checking and IntelliSense:
 * 1. Install azion config as dev dependency:
 *    npm install -D @aziontech/config
 *
 * 2. Use defineConfig:
 *    import { defineConfig } from '@aziontech/config'
 *
 * 3. Replace the configuration with defineConfig:
 *    export default defineConfig({
 *      // Your configuration here
 *    })
 *
 * For more configuration options, visit:
 * https://github.com/aziontech/lib/tree/main/packages/config
 */

export default {
  build: {
    preset: 'javascript',
    polyfills: true
  },
  functions: [
    {
      name: '$FUNCTION_NAME',
      path: './functions/index.js'
    }
  ],
  applications: [
    {
      name: '$APPLICATION_NAME',
      rules: {
        request: [
          {
            name: 'Execute Function',
            description: 'Execute function for all requests',
            active: true,
            criteria: [
              [
                {
                  variable: '${uri}',
                  conditional: 'if',
                  operator: 'matches',
                  argument: '^/'
                }
              ]
            ],
            behaviors: [
              {
                type: 'run_function',
                attributes: {
                  value: '$FUNCTION_NAME'
                }
              }
            ]
          }
        ]
      },
      functionsInstances: [
        {
          name: '$FUNCTION_INSTANCE_NAME',
          ref: '$FUNCTION_NAME'
        }
      ]
    }
  ],
  workloads: [
    {
      name: '$WORKLOAD_NAME',
      active: true,
      infrastructure: 1,
      deployments: [
        {
          name: '$DEPLOYMENT_NAME',
          current: true,
          active: true,
          strategy: {
            type: 'default',
            attributes: {
              application: '$APPLICATION_NAME'
            }
          }
        }
      ]
    }
  ]
}
```

Depois do primeiro `azion deploy`, cada placeholder `$` do arquivo guarda o nome do projeto, como `my-function`.

### Configuração aplicada com azion config apply

Este `azion.config.mjs` declara uma aplicação com um cache setting e uma regra que o aplica, e um workload que serve a aplicação:

```javascript
export default {
  applications: [
    {
      name: 'my-app',
      active: true,
      cache: [
        {
          name: 'my-app-cache',
          browser: { maxAgeSeconds: 600 },
          edge: { maxAgeSeconds: 600 }
        }
      ],
      rules: {
        request: [
          {
            name: 'Set cache policy',
            active: true,
            criteria: [[{ variable: '${uri}', conditional: 'if', operator: 'starts_with', argument: '/' }]],
            behaviors: [{ type: 'set_cache_policy', attributes: { value: 'my-app-cache' } }]
          }
        ]
      }
    }
  ],
  workloads: [
    {
      name: 'my-app',
      active: true,
      infrastructure: 1,
      deployments: [
        {
          name: 'my-app',
          current: true,
          active: true,
          strategy: { type: 'default', attributes: { application: 'my-app' } }
        }
      ]
    }
  ]
}
```

Execute [`azion config apply`](/pt-br/documentacao/devtools/cli/config/) na pasta do projeto para criar os recursos que o arquivo declara:

```bash
azion config apply
```

O comando cria cada recurso e exibe o ID dele:

```text
…
[Azion] [IaC] › ✔  success   Manifest generated successfully at <project-dir>/.edge/manifest.json
Reading manifest.json file
Edge Application my-app with id 1234567894 successfully created
Cache Setting my-app-cache with id 123469 successfully created
Rule Engine Set cache policy with id 123462 successfully created
Rules Engine of Application with id 1234567894 successfully ordered (request phase)
Workload my-app with id 1234567904 successfully created
Workload Deployment my-app with id 123474 successfully created
Configuration applied successfully: 3 resource(s) applied
```

Executar `azion config apply` de novo com o mesmo arquivo atualiza os mesmos recursos: cada linha passa a dizer `successfully updated` e mantém o mesmo ID.

---

## Migrar de uma configuração v3

Uma configuração escrita para a API v3 guarda seus recursos em chaves planas de primeiro nível, como `origin`, `cache` e `rules`. A configuração v4 move os cache settings e as regras para dentro de cada aplicação, substitui as origens por connectors e adiciona workloads para servir as aplicações. Para as mudanças da plataforma por trás da estrutura v4, consulte [Migração para API v4](/pt-br/documentacao/fundamentos/api-v4-migration/).

### Chaves renomeadas

Esta tabela associa cada chave v3 ao seu lugar na v4:

| Chave v3                                            | Chave v4               | O que mudou                                                                                                                     |
| --------------------------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `origin`                                            | `connectors`           | Uma origem passa a ser um connector com um `type` e um objeto `attributes`.                                                     |
| `cache`                                             | `applications[].cache` | Os cache settings pertencem a uma aplicação.                                                                                    |
| `rules`                                             | `applications[].rules` | As regras pertencem a uma aplicação e recebem `criteria` e `behaviors`.                                                         |
| `networkLists`                                      | `networkList`          | A chave fica no singular, e cada lista recebe `name`, `type` e `items` no lugar de `id`, `listType` e `listContent`.            |
| `build.builder`                                     | `build.bundler`        | Os mesmos valores, `esbuild` ou `webpack`.                                                                                      |
| `build.custom`                                      | `build.extend`         | Uma função que estende a configuração do bundler substitui o objeto de configuração personalizada.                              |
| `purge[].urls`                                      | `purge[].items`        | A propriedade `method` deixa de existir, e `layer` recebe `cache` ou `tiered_cache` no lugar de `edge_caching` ou `l2_caching`. |
| `cacheByCookie.option`, `cacheByQueryString.option` | Iguais                 | Os valores são `ignore`, `all`, `allowlist` e `denylist` no lugar de `ignore`, `varies`, `whitelist` e `blacklist`.             |
| `inputValue` nos critérios de firewall              | `argument`             | Mesmo significado.                                                                                                              |
| `edgeFunctions` no firewall                         | `functions`            | Mesmo significado.                                                                                                              |
| `behavior` na regra de firewall                     | `behaviors`            | Um array de objetos `{ type, attributes }` substitui um único objeto.                                                           |
| `limitBy` e `type` do rate limit                    | Iguais                 | `limitBy` recebe `client_ip` ou `global`, sem `token`; `type` recebe `second` ou `minute`, sem `hour`.                          |
| `mode` e configurações de ameaça do WAF             | `engineSettings`       | Limiares por ameaça substituem os objetos por ameaça; o modo passa para o behavior `set_waf` da regra de firewall.              |

### De origens para connectors

Uma origem v3 declarava seus endereços diretamente:

```javascript
origin: [{
  name: 'my-origin',
  type: 'single_origin',
  addresses: ['origin.example.com']
}]
```

O connector v4 guarda os endereços, as opções de conexão e os `modules` dentro de `attributes`:

```javascript
export default {
  connectors: [
    {
      name: 'my-origin',
      type: 'http',
      attributes: {
        addresses: [{ address: 'origin.example.com' }],
        connectionOptions: { transportPolicy: 'force_https' },
        modules: {
          loadBalancer: { enabled: false, config: null },
          originShield: { enabled: false, config: null }
        }
      }
    }
  ]
}
```

### Regras com critérios

Uma regra v3 correspondia a uma expressão e executava um objeto de behavior:

```javascript
rules: {
  request: [{
    name: 'My Rule',
    match: '^/api/',
    behavior: { ... }
  }]
}
```

A regra v4 fica dentro de uma aplicação, faz a correspondência com grupos de critérios e executa um array de behaviors:

```javascript
export default {
  applications: [
    {
      name: 'my-app',
      rules: {
        request: [
          {
            name: 'My Rule',
            criteria: [[{ variable: '${uri}', conditional: 'if', operator: 'starts_with', argument: '/api/' }]],
            behaviors: [{ type: 'deliver' }]
          }
        ]
      }
    }
  ]
}
```

### Behaviors de firewall

Uma regra de firewall v3 executava um objeto de behavior:

```javascript
behavior: {
  deny: true
}
```

A regra de firewall v4 recebe um array, então uma regra pode executar vários behaviors:

```javascript
export default {
  firewall: [
    {
      name: 'my-firewall',
      rules: [
        {
          name: 'Block API',
          criteria: [{ variable: '${request_uri}', conditional: 'if', operator: 'starts_with', argument: '/api/' }],
          behaviors: [{ type: 'deny' }]
        }
      ]
    }
  ]
}
```

### Configurações do WAF

Um WAF v3 definia um modo e um objeto de sensibilidade por ameaça:

```javascript
waf: [{
  name: 'My WAF',
  mode: 'blocking',
  sqlInjection: { sensitivity: 'high' }
}]
```

O WAF v4 lista um limiar por ameaça em `engineSettings`, e a regra de firewall que o aplica define o modo:

```javascript
export default {
  waf: [
    {
      name: 'My WAF',
      engineSettings: {
        engineVersion: '2021-Q3',
        type: 'score',
        attributes: {
          rulesets: [1],
          thresholds: [{ threat: 'sql_injection', sensitivity: 'high' }]
        }
      }
    }
  ],
  firewall: [
    {
      name: 'my-firewall',
      waf: true,
      rules: [
        {
          name: 'Apply WAF',
          criteria: [{ variable: '${request_uri}', conditional: 'if', operator: 'starts_with', argument: '/' }],
          behaviors: [{ type: 'set_waf', attributes: { mode: 'blocking', wafId: 'My WAF' } }]
        }
      ]
    }
  ]
}
```

---

## Recursos relacionados

- [Azion CLI config](/pt-br/documentacao/devtools/cli/config.md): Os comandos que aplicam os recursos que este arquivo declara, ou os excluem.
- [Azion CLI build](/pt-br/documentacao/devtools/cli/build.md): Como o build lê este arquivo e escreve o manifesto que o deploy usa.
- [Azion CLI deploy](/pt-br/documentacao/devtools/cli/deploy.md): Como um deploy cria ou atualiza os recursos que este arquivo declara.
- [Azion Lib config](/pt-br/documentacao/devtools/azion-lib/config.md): A biblioteca que fornece `defineConfig` e os tipos da configuração.
