# Como instanciar functions em seu firewall

import Tabs from '~/components/tabs/Tabs'
import Code from '~/components/Code/Code.astro'

Instancie [funções serverless](/pt-br/documentacao/produtos/secure/firewall/functions-instances/) diretamente no seu firewall.

Este guia utiliza a função configurada [Recusando uma requisição baseando⁠-⁠se em Geoip](/pt-br/documentacao/produtos/applications/functions/javascript-examples/deny-request/). Você pode repetir este processo usando qualquer função já disponível no [Marketplace da Azion](/pt-br/documentacao/produtos/marketplace/) ou [desenvolver outras funções](/pt-br/documentacao/produtos/guias/edge-functions/api-builder/).

Este guia também presume que você possui uma network list do tipo [Countries](/pt-br/documentacao/produtos/secure/firewall/network-shield/network-lists/#tipos-de-network-lists).

:::caution[atenção]
Você deve ativar o módulo [Functions](/pt-br/documentacao/produtos/secure/firewall/functions/) para implementar funções em suas aplicações. Se o **Functions** estiver ativado, o tempo de computação e as invocações podem gerar custos relacionados ao uso. Consulte a [página de preços](/pt-br/documentacao/produtos/precos/) para obter mais informações.
:::

---

<Tabs client:visible>
    <Fragment slot="tab.console">Console</Fragment>
    <Fragment slot="tab.api">API</Fragment>

<Fragment slot="panel.console">
1. Acesse o [Azion Console](/pt-br/documentacao/produtos/guias/como-acessar-o-azion-console/) > **Firewall**.
2. Clique no firewall que você deseja configurar.
3. Na aba **Main Settings**, ative o switch do módulo **Functions** para habilitar as funções.
4. Clique no botão **Save**.
5. Vá para a aba **Functions Instances**.
6. Clique em **+ Function Instance**.
7. Nomeie sua instância de função. Por exemplo: `Função de Recusar Geoip`.
8. No menu suspenso **Functions**, selecione a função que deseja usar. Neste exemplo, `Função de Recusar Geoip`.
- Se desejar, pode editar os **Arguments**.
1. Clique no botão **Save**.

A página de funções agora lista a instância recém-criada. No entanto, esta nova função ainda não está ativa em sua. Você precisa definir o que acionará a função.

Ainda na página do **Firewall**:

1. Navegue até a aba **Rules Engine**.
2. Clique no botão **+ Rule**.
3. Dê um nome para o seu conjunto de regras.
4. Na seção **Criteria**, selecione a variável `Network`.
5. Como operador de comparação, selecione **matches**.
6. Como argumento, selecione a network list do tipo Countries que deseja usar. Por exemplo: `Países Bloqueados Geoip`.
7. Na seção **Behaviors**, selecione **Run Function** na lista de comportamentos.
8. Selecione a função que deseja usar. Neste exemplo, `Função de Recusar Geoip`.
9. Clique no botão **Save**.

Quando sua aplicação receber uma requisição gerada de um dos países na lista de rede, a função em seu firewall recusará a requisição com base no Geo IP.
</Fragment>

<Fragment slot="panel.api">
1. Execute a seguinte requisição `PATCH` no seu terminal, substituindo `[VALOR DO TOKEN]` pelo seu [token pessoal](/pt-br/documentacao/produtos/guias/personal-tokens/) e a variável `<edge_firewall_id>` pelo [ID do seu firewall](https://api.azion.com/v4#/operations/GetEdgeFirewallFirewalls)) para ativar o módulo **Functions**:

<Code lang="bash" code={`
curl --request PATCH \
  --url https://api.azion.com/v4/edge_firewall/firewalls/<edge_firewall_id> \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
    "modules": {
      "edge_functions": { "enabled": true },
    },
  }'
`} />


2. Você receberá uma resposta com o valor atualizado.
3. Execute a seguinte requisição `GET` para obter o `edge_function_id` da função `Recusar Geoip`:

<Code lang="bash" code={`
curl --request GET \
  --url https://api.azion.com/v4/edge_functions/functions \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]]'
`} />


4. Você receberá uma resposta semelhante a esta:

<Code lang="json" code={`
{
  "count": 1,
  "total_pages": 1,
  "schema_version": 3,
  "links": {
    "previous": null,
    "next": null
  },
  "results": [
    {
      "id": 13426,
      "name": "Função de Recusar Geoip",
      "language": "javascript",
      "code": "async function firewallHandler(event){\n    // Access the country code through geoip\n    let countryCode = event.request.metadata[\"geoip_country_code\"]\n\n    // Do some logic here\n    // In this example, we are blocking access from Brazil\n    if (countryCode === \"BR\"){\n        event.deny();\n    }\n\n    // Then, if it comes from any other country,\n    // the processing continues\n    event.continue();\n}\n\naddEventListener(\"firewall\", (event)=>event.waitUntil(firewallHandler(event)));",
      "json_args": {
        "value": "hello_world"
      },
      "function_to_run": "",
      "initiator_type": "edge_firewall",
      "active": true,
      "last_editor": "user@email.com",
      "modified": "2023-11-14T20:09:48.657555Z",
      "is_proprietary_code": false,
      "reference_count": 1
    }
  ]
}
`} />

5. Copie o valor `<function_id>`.
6. Execute a seguinte requisição `POST`, substituindo a variável `<edge_firewall_id` pelo [ID do seu firewall](https://api.azion.com/#015cb4a3-8fa2-4625-9792-2cc271e184eb) e o valor `<function_id>` pelo valor que você recebeu na resposta anterior:

<Code lang="bash" code={`
curl --request POST \
  --url https://api.azion.com/v4/edge_firewall/firewalls/<edge_firewall_id>/functions \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Deny Geoip",
  "args": {
  },
  "edge_function": <function_id>,
  "active": true
}'
`} />

7. Você receberá uma resposta semelhante a esta:

<Code lang="json" code={`
{
  "results": {
    "name": "Deny Geoip",
    "json_args": {},
    "edge_function": <function_id>,
    "last_modified": "2023-11-22T18:50:11.812819Z",
    "last_editor": "your-email@example.com",
    "id": 2806
  },
  "schema_version": 3
}
`} />

| Chave | Descrição |
| --- | ----------- |
| `name` | Nome da função instanciada |
| `edge_function` | O ID da function. Este não é o mesmo que o ID da função instanciada, que é único para cada instância de função |
| `json_args` | Definição de argumentos necessários para a função. Algumas funções não aceitam argumentos |

8. Execute a seguinte requisição `GET` para obter o `id` da network list `Blocked Countries Geoip`:

<Code lang="bash" code={`
curl --request GET \
  --url https://api.azion.com/v4/workspace/network_lists \
  --header 'Accept: application/json' \
  --header 'Authorization: Token azion060b7df4369b5688b37b4645a3f5199db87'
`} />

9. Você receberá uma resposta semelhante a esta:

<Code lang="json" code={`
{
  "count": 2,
  "total_pages": 1,
  "schema_version": 3,
  "links": {
    "previous": null,
    "next": null
  },
  "results": [
    {
      "id": 6217,
      "last_editor": "your-email@example.com",
      "last_modified": "2023-11-14T21:35:39.808175Z",
      "list_type": "countries",
      "name": "Deny Geoip",
      "country_list": [
        "Brazil"
      ],
      "ip_list": []
    }
  ]
}
}
`} />


| Chave | Descrição |
| --- | ----------- |
| `name` | Nome da lista de rede |
| `id` | ID da lista de rede |
| `list_type` | Definição do tipo da lista de rede |
| `country_list` | Itens que compõem a lista |

10. Execute a seguinte requisição `POST` no seu terminal, substituindo `[VALOR DO TOKEN]` pelo seu [personal token](/pt-br/documentacao/produtos/guias/personal-tokens/), a variável `<edge_firewall_id>` pelo ID do seu firewall, o valor `<edge_function_instance_id>` pelo ID da instância da função e o valor `<network_list_id>` pelo ID da network list:

<Code lang="bash" code={`
curl --request POST \
  --url https://api.azion.com/v4/edge_firewall/firewalls/{edge_firewall_id}/request_rules \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Create rule",
    "active": true,
    "criteria": [
      [
        {
          "conditional": "if",
          "variable": "\${network}",
          "operator": "is_in_list",
          "argument": <network_list_id>
        }
      ]
    ],
    "behaviors": [
      {
        "type": "run_function",
        "attributes": {
          "function_instance_id": <edge_function_instance_id>
        }
      }
    ]
  }'
`} />

:::tip
Para obter mais informações sobre o endpoint de Rules Engine, consulte [Trabalhar com rules engine](/pt-br/documentacao/produtos/guias/secure/trabalhar-com-rules-engine/).
:::


11. Aguarde alguns minutos para que as alterações se propaguem.

Quando sua aplicação receber uma requisição gerada de um dos países na network list, a função em seu firewall recusará a requisição com base no Geo IP.

:::tip
Consulte a [documentação da API da Azion](https://api.azion.com/) para saber mais sobre o que a API da Azion pode oferecer.
:::
</Fragment>

</Tabs>

---