# Primeiros passos com Applications

Este guia orienta você a entregar o conteúdo da sua origem pela sua primeira [aplicação](/pt-br/documentacao/plataforma/applications/).

- Crie um [connector](/pt-br/documentacao/plataforma/connectors/) que alcança a sua origem por HTTPS.
- Crie uma aplicação.
- Adicione uma regra que envia toda requisição para o connector.
- Entregue a aplicação por um [workload](/pt-br/documentacao/plataforma/workloads/).
- Envie uma requisição para o domínio do workload e receba a resposta da sua origem.

Cinco partes formam a cadeia, listadas na ordem em que este guia as usa:

1. O **connector** guarda o endereço da sua origem e a forma como a Azion se conecta a ela.
2. A **aplicação** guarda as regras que decidem o que acontece com uma requisição. Uma aplicação nova não tem regras.
3. A **regra** na aplicação combina um critério com um behavior. Neste guia, o critério corresponde a toda requisição, e o behavior **Set Connector** nomeia o connector.
4. O **workload** guarda o domínio que recebe as requisições. O **deployment** dele nomeia a aplicação.
5. A **requisição** para o domínio do workload encontra a regra, e o connector a passa para a sua origem.

Um connector só recebe requisições depois que uma regra o nomeia, e uma aplicação só depois que um deployment a nomeia.

Em uma aplicação, você habilita três Produtos: Cache, Application Accelerator e Image Processor. Uma aplicação nova começa com Cache ativado e os outros dois desativados, e este guia não altera nenhum deles. Para ativar um deles depois, abra a aba **Main Settings** da aplicação, ative o interruptor dele em **Modules** e selecione **Save**. Os primeiros passos de cada Produto começam onde este guia termina, com uma aplicação que já entrega conteúdo.

---

Os pré-requisitos e as cinco etapas mostram os passos de uma interface por vez. Selecione a sua:

## Pré-requisitos

- Uma conta Azion. Para mais informações, consulte [Criar uma conta](/pt-br/documentacao/fundamentos/criar-uma-conta/).
- Um servidor de origem que responde a requisições HTTPS na porta `443` em um hostname público. Este guia escreve esse hostname como `<your-origin-hostname>`.
- O `curl`, para enviar uma requisição pelo workload.

**Console**

Você também precisa de acesso ao Azion Console. Para mais informações, consulte [Como acessar o Azion Console](/pt-br/documentacao/guias/plataforma/conta-e-billing/como-acessar-o-azion-console/).

**CLI**

Você também precisa da [Azion CLI](/pt-br/documentacao/devtools/cli/) na sua máquina, autorizada com um personal token.

**API**

Você também precisa de um personal token para o header `Authorization`. Para criar um, consulte [Como criar um personal token](/pt-br/documentacao/guias/plataforma/conta-e-billing/personal-tokens/).

---

## Crie um connector para a sua origem

Um connector guarda o endereço da sua origem e as configurações que a Azion usa para alcançá-la. Você o cria à parte, fora de qualquer aplicação, e uma regra o nomeia depois. Este connector tem um endereço e se conecta à sua origem por HTTPS. Ele envia o hostname da sua origem no header `Host`.

**Console**

Para criar o connector pelo Azion Console:

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

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

2. **Inicie um novo connector**

3. **Nomeie o connector**

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

4. **Selecione o tipo HTTP**

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

5. **Insira o hostname da sua origem como endereço**

   Em **Address Management**, insira `<your-origin-hostname>` em **Address**, sem protocolo e sem porta.

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

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

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

8. **Selecione Create**

O connector existe na sua conta, e a regra que você adiciona à aplicação o seleciona. Para todos os campos do formulário do connector, consulte [Connectors](/pt-br/documentacao/plataforma/connectors/).

**CLI**

Para criar o connector pela Azion CLI, coloque-o primeiro em um arquivo JSON. Salve este corpo como `connector.json` e substitua `<your-origin-hostname>` nos dois lugares:

```json
{
  "name": "origin-connector",
  "type": "http",
  "attributes": {
    "addresses": [
      { "address": "<your-origin-hostname>" }
    ],
    "connection_options": {
      "transport_policy": "force_https",
      "host": "<your-origin-hostname>"
    }
  }
}
```

`addresses` lista os servidores de origem, e `connection_options.host` é o header `Host` que o connector envia. `force_https` faz toda conexão com a origem usar HTTPS.

Crie o connector a partir do arquivo:

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

Anote o ID do connector novo na saída do comando: a regra o passa como `<connector-id>`.

**API**

Para criar o connector pela API, envie uma requisição `POST` para o endpoint de connectors. Substitua `[TOKEN VALUE]` pelo seu personal token e `<your-origin-hostname>` pelo hostname da sua origem:

```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": "<your-origin-hostname>" }],
    "connection_options": {
      "transport_policy": "force_https",
      "host": "<your-origin-hostname>"
    }
  }
}'
```

A resposta retorna o connector, com um valor para cada configuração que a requisição omitiu. Este trecho mostra esses valores:

```json
{
  "state": "pending",
  "data": {
    "id": <connector-id>,
    "name": "origin-connector",
    "last_editor": "user@example.com",
    …
    "active": true,
    …
    "type": "http",
    "attributes": {
      "addresses": [
        {
          "active": true,
          "address": "<your-origin-hostname>",
          "http_port": 80,
          "https_port": 443,
          "modules": null
        }
      ],
      "connection_options": {
        "dns_resolution": "both",
        "transport_policy": "force_https",
        "http_version_policy": "http1_1",
        "host": "<your-origin-hostname>",
        "path_prefix": "",
        "following_redirect": false,
        "real_ip_header": "X-Real-IP",
        "real_port_header": "X-Real-PORT"
      },
      "modules": {
        "load_balancer": { "enabled": false, "config": null },
        "origin_shield": { "enabled": false, "config": null }
      }
    },
    …
  }
}
```

O connector está ativo, e o endereço dele aceita conexões HTTPS na `https_port` `443`. [Load Balancer](/pt-br/documentacao/plataforma/connectors/#load-balancer) e [Origin Shield](/pt-br/documentacao/plataforma/connectors/#origin-shield) começam desativados. Anote o `id`: a regra o passa como `<connector-id>`.

---

## Crie a aplicação

Uma aplicação guarda as regras que decidem o que acontece com cada requisição. Ela precisa apenas de um nome, e todas as outras configurações mantêm o valor padrão. Enquanto uma regra não nomear um connector, a aplicação não tem uma origem para onde enviar as requisições.

**Console**

Para criar a aplicação pelo Azion Console:

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

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

2. **Inicie uma nova aplicação**

3. **Nomeie a aplicação**

   Em **General**, insira `first-application` como **Name**.

4. **Selecione Create**

A aplicação existe, e a aba **Rules Engine** dela ainda não tem regras.

**CLI**

Para criar a aplicação pela Azion CLI:

```bash
azion create application --name first-application --active true
```

A saída traz o ID da aplicação:

```text
Created Application with ID <application-id>
```

A aplicação está ativa e não tem regras. Cache e Functions começam ativados, e Application Accelerator e Image Processor começam desativados. Anote o ID: a regra e o deployment o passam como `<application-id>`.

**API**

Para criar a aplicação pela API, envie uma requisição `POST` para o endpoint de applications. Substitua `[TOKEN VALUE]` pelo seu personal token:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/applications \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{"name": "first-application", "active": true}'
```

Na resposta, `modules` lista os interruptores com que a aplicação começa:

```json
{
  "state": "pending",
  "data": {
    "id": <application-id>,
    "name": "first-application",
    "last_editor": "user@example.com",
    …
    "modules": {
      "cache": { "enabled": true },
      "functions": { "enabled": true },
      "application_accelerator": { "enabled": false },
      "image_processor": { "enabled": false }
    },
    "active": true,
    "debug": false,
    "product_version": "3.0",
    …
  }
}
```

A aplicação está ativa e não tem regras. Em `modules`, `cache` e `functions` começam ativados, enquanto `application_accelerator` e `image_processor` começam desativados. Anote o `id`: a regra e o deployment o passam como `<application-id>`.

---

## Envie toda requisição para o connector

Uma regra no [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine/) combina critérios com behaviors. Esta regra roda na fase de requisição. O critério dela, `${uri}` começando com `/`, corresponde a toda requisição. O behavior dela, **Set Connector**, envia cada requisição correspondente para o seu connector. Para mais informações, consulte [Set Connector](/pt-br/documentacao/plataforma/applications/rules-engine/#set-connector).

O critério usa `${uri}`, não `${request_uri}`. `${request_uri}` precisa de Application Accelerator ativado. Em uma aplicação sem ele, a API recusa a regra com `400` e o erro `25047`, `Missing Required Modules`.

**Console**

Para criar a regra pelo Azion Console:

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

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

2. **Selecione a aba Rules Engine**

3. **Selecione + Rule**

4. **Nomeie a regra**

   Em **General**, insira `send-to-origin` como **Name**.

5. **Selecione a fase de requisição**

   Em **Phase**, selecione *Request Phase*. A fase de uma regra não pode mudar depois que você cria a regra.

6. **Defina o critério**

   Em **Criteria**, selecione a variável `${uri}` e o operador `starts_with`. Em seguida, insira `/` como argumento.

7. **Selecione o behavior Set Connector**

   Em **Behaviors**, selecione **Set Connector**.

8. **Selecione o seu connector**

   Em **Connector**, selecione o connector que você criou.

9. **Selecione Save**

A regra aparece na aba **Rules Engine**, sob o título **Request**.

**CLI**

Para criar a regra pela Azion CLI, mantenha a regra em um arquivo: em uma linha de comando, o shell expandiria `${uri}`. Salve este corpo como `rule.json` e substitua `<connector-id>` pelo ID do seu connector:

```json
{
  "name": "send-to-origin",
  "active": true,
  "criteria": [
    [
      {
        "variable": "${uri}",
        "conditional": "if",
        "operator": "starts_with",
        "argument": "/"
      }
    ]
  ],
  "behaviors": [
    {
      "type": "set_connector",
      "attributes": { "value": <connector-id> }
    }
  ]
}
```

Cada grupo em `criteria` abre com uma condição cujo conditional é `if`. Crie a regra na fase de requisição da sua aplicação. Substitua `<application-id>` pelo ID da sua aplicação:

```bash
azion create rules-engine --application-id <application-id> --phase request --file rule.json
```

A saída traz o ID da regra:

```text
Created Rules Engine with ID <rule-id>
```

A regra está ativa na sua aplicação e envia toda requisição para o seu connector.

**API**

Para criar a regra pela API, mantenha o corpo da requisição em um arquivo: em uma linha de comando, o shell expandiria `${uri}`. Salve este corpo como `rule.json` e substitua `<connector-id>` pelo ID do seu connector:

```json
{
  "name": "send-to-origin",
  "active": true,
  "criteria": [
    [
      {
        "variable": "${uri}",
        "conditional": "if",
        "operator": "starts_with",
        "argument": "/"
      }
    ]
  ],
  "behaviors": [
    {
      "type": "set_connector",
      "attributes": { "value": <connector-id> }
    }
  ]
}
```

Cada grupo em `criteria` abre com uma condição cujo conditional é `if`. Envie uma requisição `POST` para as regras da fase de requisição da sua aplicação. Substitua `<application-id>` pelo ID da sua 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 @rule.json
```

A resposta traz a regra armazenada. Este trecho mantém o `id`, o critério, o behavior e o `order` dela:

```json
{
  "state": "pending",
  "data": {
    "id": <rule-id>,
    "name": "send-to-origin",
    "active": true,
    "criteria": [
      [
        {
          "conditional": "if",
          "variable": "${uri}",
          "operator": "starts_with",
          "argument": "/"
        }
      ]
    ],
    "behaviors": [
      {
        "type": "set_connector",
        "attributes": { "value": <connector-id> }
      }
    ],
    "description": "",
    "order": 0,
    …
  }
}
```

`order` é `0`, a posição da primeira regra na aplicação. A regra está ativa e envia toda requisição para o seu connector.

---

## Entregue a aplicação por um workload

Um workload guarda o que recebe as requisições: o domínio, os protocolos e os certificados. A aplicação não guarda nenhuma dessas configurações. O deployment do workload nomeia a aplicação que ele executa, e o deployment atual é o que atende as requisições. Um workload novo responde em um domínio de workload que a Azion atribui sob `map.azionedge.net`.

**Console**

Para criar o workload e o deployment dele pelo Azion Console:

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

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

2. **Inicie um novo workload**

   A página **Create Workload** abre.

3. **Nomeie o workload**

   Insira um nome, como `first-workload`.

4. **Selecione a sua aplicação**

   Em **Deployment Settings**, defina **Application** como a aplicação que você criou.

5. **Deixe Firewall e Custom Page vazios**

6. **Selecione Create Workload**

O workload existe, e o deployment dele nomeia a sua aplicação. Para copiar o endereço para onde vai a requisição final, selecione **Copy Workload URL**.

**CLI**

Para criar o workload pela Azion CLI:

```bash
azion create workload --name first-workload --active true
```

A saída traz o ID do workload:

```text
Created Workload with ID <workload-id>
```

Crie o deployment que nomeia a sua aplicação. Substitua `<workload-id>` e `<application-id>`:

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

A saída traz o ID do deployment:

```text
Created Workload Deployment with ID <deployment-id>
```

`--current true` faz deste deployment o que o workload entrega. Ele nomeia a sua aplicação e nenhum firewall.

Para encontrar o domínio de workload, descreva o workload em JSON:

```bash
azion describe workload --workload-id <workload-id> --format json
```

O campo `workload_domain` guarda o domínio para onde vai a requisição final.

**API**

Para criar o workload pela API, envie uma requisição `POST` para o endpoint de workloads. `infrastructure` definido como `1` seleciona a infraestrutura de produção, e `workload_domain_allow_access` definido como `true` deixa o workload responder no domínio de workload dele:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/workloads \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "first-workload",
  "active": true,
  "infrastructure": 1,
  "workload_domain_allow_access": true
}'
```

A resposta traz as configurações iniciais do workload e o domínio que a Azion atribuiu a ele:

```json
{
  "state": "pending",
  "data": {
    "id": <workload-id>,
    "name": "first-workload",
    "active": true,
    …
    "infrastructure": 1,
    "tls": {
      "certificate": null,
      "ciphers": 7,
      "minimum_version": "tls_1_3"
    },
    "protocols": {
      "http": {
        "versions": ["http1", "http2", "http3"],
        "http_ports": [80],
        "https_ports": [443],
        "quic_ports": [443]
      }
    },
    …
    "domains": [],
    "workload_domain_allow_access": true,
    "workload_domain": "<your-workload-domain>",
    "product_version": "1.0"
  }
}
```

O workload não tem domínios próprios, e `workload_domain` guarda o domínio que a Azion atribuiu. Anote o `id` e o `workload_domain`.

Crie o deployment que nomeia a sua aplicação. Envie uma requisição `POST` para os deployments do seu workload e substitua `<workload-id>` e `<application-id>`:

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/workloads/<workload-id>/deployments \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "first-deployment",
  "current": true,
  "active": true,
  "strategy": {
    "type": "default",
    "attributes": {
      "application": <application-id>
    }
  }
}'
```

A resposta retorna o deployment novo, com a sua aplicação em `strategy.attributes`. `current` definido como `true` faz dele o deployment que o workload entrega.

---

## Envie uma requisição pelo workload

Esta etapa precisa apenas do `curl`, qualquer que seja a interface que você usou para montar a cadeia. No comando, substitua `<your-workload-domain>` pelo domínio de workload do workload que você criou.

Um workload novo não responde de imediato. O primeiro deployment dele pode levar vários minutos para chegar ao tráfego, e nenhuma duração é garantida. Até lá, o domínio de workload responde `404` com uma página provisória. Enquanto o deployment se propaga, as respostas à mesma requisição podem alternar entre esse `404` e a resposta da sua origem. Repita a requisição até a resposta vir da sua origem.

Envie uma requisição para o caminho raiz do seu domínio de workload:

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

A resposta é a que a sua origem retorna para `/`: o status, os headers e o corpo dela. Qualquer outro caminho chega à sua origem da mesma forma, porque a regra corresponde a toda URI que começa com `/`. A sua aplicação agora envia toda requisição no domínio de workload dela para a sua origem pelo connector.

---

## Próximos passos

- [Primeiros passos com Cache](/pt-br/documentacao/plataforma/applications/cache/primeiros-passos.md): Crie um cache setting, aplique-o a um caminho com uma regra e leia se uma resposta veio do cache.
- [Primeiros passos com Application Accelerator](/pt-br/documentacao/plataforma/applications/application-accelerator/primeiros-passos.md): Ative Application Accelerator e coloque em cache uma listagem que varia por um argumento de query string.
- [Primeiros passos com Image Processor](/pt-br/documentacao/plataforma/applications/image-processor/primeiros-passos.md): Ative Image Processor, dê a cada transformação a sua própria entrada de cache e requisite a sua primeira imagem derivada.
- [Rules Engine para Applications](/pt-br/documentacao/plataforma/applications/rules-engine.md): As fases, variáveis, operadores e behaviors que uma regra em uma aplicação aceita, entre eles Set Connector.
- [Como Applications funciona](/pt-br/documentacao/plataforma/applications/como-funciona.md): Como uma requisição vai de um workload, pelas regras de uma aplicação, até uma origem.
- [Limites de Applications](/pt-br/documentacao/plataforma/applications/limites.md): Os limites de uma aplicação e dos Produtos habilitados nela.
