# Primeiros passos com Functions

Este guia conduz você por executar sua primeira função na Azion. Os passos levam cerca de 10 minutos.

- Criar uma função que retorna `Hello World!`.
- Instanciar a função em uma aplicação.
- Adicionar uma regra do Rules Engine que executa a instância na URI `/hello-world`.
- Requisitar essa URI e ler a resposta.

Três objetos fazem uma função ser executada, e cada um se conecta ao seguinte:

1. A **função** contém o código JavaScript.
2. A **instância de função** vincula a função a uma aplicação. Ela também carrega os Args, um objeto JSON passado para o contexto de execução.
3. A regra do **Rules Engine** seleciona a instância com o comportamento **Run Function**. A regra define a fase de execução e os critérios que a acionam.

Criar uma função não a executa. Uma instância sem uma regra do Rules Engine nunca é executada.

O [Azion Terraform provider](/pt-br/documentacao/devtools/terraform/) gerencia os mesmos três objetos. Para conhecer todas as interfaces que os carregam, consulte [Functions](/pt-br/documentacao/plataforma/functions/#escopo-e-limites).

---

Selecione a interface que você vai usar. Os pré-requisitos e todas as etapas abaixo seguem essa escolha.

## Pré-requisitos

- Uma conta Azion. Para criar uma, consulte [Como criar uma conta na Azion](/pt-br/documentacao/fundamentos/criar-uma-conta/).
- A permissão **Edit Functions** na conta. Ela concede permissão para criar, editar e remover funções, e também requer a permissão **View Functions**.
- A permissão **Edit Applications** na conta. A instância e a regra alteram uma aplicação, e essa permissão concede permissão para editar, criar e remover aplicações. Ela também requer a permissão **View Applications**. Consulte [Teams Permissions](/pt-br/documentacao/fundamentos/teams-permissions/).
- Uma aplicação. Para criar uma, consulte [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/).

**Console**

- Acesso ao Azion Console. Para entrar, consulte [Como acessar o Azion Console](/pt-br/documentacao/guias/plataforma/conta-e-billing/como-acessar-o-azion-console/).

**CLI**

- A [Azion CLI](/pt-br/documentacao/devtools/cli/) instalada e autorizada.

**API**

- Um [personal token](/pt-br/documentacao/guias/plataforma/conta-e-billing/personal-tokens/) e o `curl`.

---

## Crie a função

A função contém o código que responde à requisição. Esta retorna a string `Hello World!`.

**Console**

Para criar a função pelo Azion Console:

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

   Acesse [Azion Console](https://console.azion.com/) > **Products Menu** > **Libraries** > **Functions**.

2. **Selecione + Function**

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

   Digite um nome para a função. Por exemplo: `hello-world`.

4. **Cole o código na aba Code**

   Na aba **Code**, cole o código a seguir:

   ```javascript
   export default {
     async fetch(request, env, ctx) {
       return new Response('Hello World!');
     },
   };
   ```

5. **Selecione Save**

A função é salva e fica disponível para ser instanciada em uma aplicação.

> **dica**
>
> Para ler a resposta da função antes que ela atenda tráfego, use o [Preview deployment](/pt-br/documentacao/plataforma/functions/preview-deployment/). Ele roda o código no Azion Console sem um deployment.

**CLI**

A CLI lê o código de um arquivo local. Para criar a função:

1. **Salve o código em um arquivo**

   Escreva o código a seguir em `index.js`:

   ```javascript
   export default {
     async fetch(request, env, ctx) {
       return new Response('Hello World!');
     },
   };
   ```

2. **Execute o comando de criação**

   ```bash
   azion create function --name hello-world --code ./index.js --active true
   ```

3. **Leia a saída**

   O comando imprime o id da nova função:

   ```text
   Created function with ID 12346
   ```

Registre o id. A instância o recebe. Para todas as flags que o comando aceita, consulte [Azion CLI create](/pt-br/documentacao/devtools/cli/recursos/).

**API**

O body da requisição carrega o código como uma string JSON, então as quebras de linha são escapadas como `\n`.

1. **Envie a requisição de criação**

   Substitua `[TOKEN VALUE]` pelo seu personal token:

   ```bash
   curl --request POST \
     --url https://api.azion.com/v4/workspace/functions \
     --header 'Accept: application/json' \
     --header 'Authorization: Token [TOKEN VALUE]' \
     --header 'Content-Type: application/json' \
     --data '{
     "name": "hello-world",
     "code": "export default {\n  async fetch(request, env, ctx) {\n    return new Response(\"Hello World!\");\n  },\n};"
   }'
   ```

2. **Leia a resposta**

   Um `202` carrega a função:

   ```json
   {
     "state": "pending",
     "data": {
       "id": 12345,
       "name": "hello-world",
       "last_editor": "user@example.com",
       "last_modified": "2026-01-01T12:00:00.385220Z",
       "product_version": "2.0",
       "active": true,
       "runtime": "azion_js",
       "execution_environment": "application",
       "default_args": {},
       "reference_count": 0,
       "code": "export default {\n  async fetch(request, env, ctx) {\n    return new Response(\"Hello World!\");\n  },\n};"
     }
   }
   ```

Registre o `id`. A instância o recebe. O valor `"state": "pending"` significa que a alteração leva alguns minutos para propagar.

---

## Instancie a função na sua aplicação

Uma instância vincula a função a uma aplicação, e uma função pode sustentar várias instâncias. Cada caminho ativa o módulo **Functions** na aplicação e então cria a instância.

> **Atenção**
>
> Tempo de computação e invocações de funções geram custos relacionados ao uso. Para as taxas, consulte [Preços](/pt-br/documentacao/fundamentos/precos/).

**Console**

Para vincular a função a uma aplicação pelo Azion Console:

1. **Ainda em Azion Console, vá para Products Menu > Build > Applications**

2. **Selecione a aplicação que executa a função**

3. **Na aba Main Settings, ative o módulo Functions**

4. **Selecione Save**

5. **Vá para a aba Functions Instances**

6. **Selecione + Function Instance**

7. **Nomeie a instância**

   Digite um nome para a instância. Por exemplo: `hello-world instance`.

8. **Selecione a função**

   Selecione a função `hello-world`.

9. **Selecione Save**

A nova instância aparece na aba **Functions Instances**.

**CLI**

Para ativar o módulo e criar a instância com a Azion CLI, substitua o id da aplicação e o id da função pelos seus:

1. **Ative o módulo Functions**

   ```bash
   azion update application --application-id <application_id> --functions true
   ```

   O comando confirma a aplicação:

   ```text
   Updated Application with ID <application_id>
   ```

2. **Crie a instância**

   ```bash
   azion create function-instance --application-id <application_id> --function-id <function_id> --name "hello-world instance"
   ```

3. **Leia a saída**

   O comando imprime o id da nova instância:

   ```text
   Created Function Instance with ID 12348
   ```

Registre o id da instância. A regra o recebe.

**API**

Duas requisições ativam o módulo e criam a instância.

1. **Ative o módulo Functions**

   Substitua `<application_id>` pelo [ID da sua aplicação](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/primeiros-passos/definir-configuracoes-principais/):

   ```bash
   curl --request PATCH \
     --url https://api.azion.com/v4/workspace/applications/<application_id> \
     --header 'Accept: application/json' \
     --header 'Authorization: Token [TOKEN VALUE]' \
     --header 'Content-Type: application/json' \
     --data '{
     "modules": {
       "functions": {
         "enabled": true
       }
     }
   }'
   ```

   A resposta retorna os módulos que a aplicação agora carrega:

   ```json
   {
     "cache": { "enabled": true },
     "functions": { "enabled": true },
     "application_accelerator": { "enabled": false },
     "image_processor": { "enabled": false }
   }
   ```

2. **Crie a instância**

   Substitua `<function_id>` pelo `id` que a criação da função retornou:

   ```bash
   curl --request POST \
     --url https://api.azion.com/v4/workspace/applications/<application_id>/functions \
     --header 'Accept: application/json' \
     --header 'Authorization: Token [TOKEN VALUE]' \
     --header 'Content-Type: application/json' \
     --data '{
     "name": "hello-world instance",
     "function": <function_id>,
     "args": {},
     "active": true
   }'
   ```

3. **Leia a resposta**

   Um `202` carrega a instância:

   ```json
   {
     "state": "pending",
     "data": {
       "id": 12347,
       "name": "hello-world instance",
       "args": {},
       "function": 12345,
       "active": true,
       "last_editor": "user@example.com",
       "last_modified": "2026-01-01T12:00:21.272376Z"
     }
   }
   ```

   O campo `function` carrega o id da função que a instância executa. Ele é diferente de `id`, que é único para cada instância.

Registre o `id` da instância. A regra o recebe.

---

## Adicione a regra que executa a função

Uma instância é executada apenas quando uma regra do Rules Engine a seleciona. Esta regra executa a instância em requisições para `/hello-world`.

**Console**

Para adicionar a regra pelo Azion Console:

1. **Na mesma aplicação, vá para a aba Rules Engine**

2. **Selecione + Rule**

3. **Nomeie a regra**

   Digite um nome para a regra. Por exemplo: `Run hello-world`.

4. **Selecione Request Phase**

5. **Selecione a variável na seção Criteria**

   Na seção **Criteria**, selecione a variável `${uri}`.

6. **Selecione is equal como operador de comparação**

7. **Digite o argumento**

   Digite `/hello-world` como argumento.

8. **Na seção Behaviors, selecione Run Function**

9. **Selecione a instância que você criou**

10. **Selecione Save**

A regra executa a instância em toda requisição cuja URI é `/hello-world`.

> **nota**
>
> Se **Run Function** não estiver na lista de **Behaviors**, a aplicação também precisa do módulo **Application Accelerator**. Consulte [Run Function não aparece na lista de comportamentos](/pt-br/documentacao/plataforma/functions/solucao-de-problemas/#run-function-nao-aparece-na-lista-de-comportamentos) para a correção.

**CLI**

A CLI lê a regra de um arquivo JSON. Para adicionar a regra:

1. **Escreva a regra em um arquivo**

   Salve o conteúdo a seguir como `rule.json`, com o id da sua instância em `attributes.value`:

   ```json
   {
     "name": "Run hello-world",
     "description": "Run the function on /hello-world",
     "active": true,
     "criteria": [
       [
         {
           "conditional": "if",
           "variable": "${uri}",
           "operator": "is_equal",
           "argument": "/hello-world"
         }
       ]
     ],
     "behaviors": [
       {
         "type": "run_function",
         "attributes": { "value": 12348 }
       }
     ]
   }
   ```

2. **Crie a regra**

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

3. **Leia a saída**

   O comando imprime o id da nova regra:

   ```text
   Created Rules Engine with ID 234568
   ```

A regra executa a instância em toda requisição cuja URI é `/hello-world`.

**API**

Para adicionar a regra com a Azion API:

1. **Escreva a regra em um arquivo**

   Os critérios carregam `${uri}`, que um shell expande, então o body é enviado a partir de um arquivo. Salve o conteúdo a seguir como `rule.json`, com o id da sua instância em `attributes.value`:

   ```json
   {
     "name": "Run hello-world",
     "description": "Run the function on /hello-world",
     "active": true,
     "criteria": [
       [
         {
           "conditional": "if",
           "variable": "${uri}",
           "operator": "is_equal",
           "argument": "/hello-world"
         }
       ]
     ],
     "behaviors": [
       {
         "type": "run_function",
         "attributes": { "value": 12347 }
       }
     ]
   }
   ```

2. **Envie a requisição de criaçã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
   ```

3. **Leia a resposta**

   Um `202` carrega a regra, com o `order` que ela ocupa entre as regras da aplicação:

   ```json
   {
     "state": "pending",
     "data": {
       "id": 234567,
       "name": "Run hello-world",
       "active": true,
       "behaviors": [
         {
           "type": "run_function",
           "attributes": { "value": 12347 }
         }
       ],
       "order": 0,
       "last_editor": "user@example.com",
       "last_modified": "2026-01-01T12:01:25.270982Z"
     }
   }
   ```

A regra executa a instância em toda requisição cuja URI é `/hello-world`.

Novas regras podem levar alguns minutos para propagar. Aguarde antes de requisitar a URI.

---

## Verifique a resposta

Sua aplicação responde em um domínio no formato `xxxxxxxxx.map.azionedge.net`. Para definir o domínio da sua aplicação, consulte [Adicione um domínio a um workload](/pt-br/documentacao/guias/plataforma/migracao/configurar-dominio/).

Para confirmar que a função é executada, requisite a URI definida na regra:

```bash
curl https://<your-azion-domain>/hello-world
```

O corpo da resposta é a string que a função retorna:

```
Hello World!
```

A função agora é executada em toda requisição que corresponde aos critérios da regra.

---

## Próximos passos

- [Como funciona](/pt-br/documentacao/plataforma/functions/como-funciona.md): A cadeia de invocação em detalhe, da função à requisição que a aciona.
- [Instâncias de função](/pt-br/documentacao/plataforma/applications/functions-instances.md): Passe Args para uma instância em JSON.
- [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables.md): Armazene configurações e segredos fora do código da função e leia cada valor pela chave em tempo de execução.
- [Exemplos em JavaScript](/pt-br/documentacao/plataforma/functions/javascript-exemplos.md): Código de função para adaptar à sua própria lógica.
- [Boas práticas](/pt-br/documentacao/plataforma/functions/boas-praticas.md): O que cada parte do handler faz e as decisões de design que mantêm uma invocação dentro dos seus limites.
- [Desenvolvimento local](/pt-br/documentacao/devtools/cli/dev-comando.md): Compile e execute o projeto na sua própria máquina com o comando azion dev.
