---
name: azion-instale-a-integracao-send-event-to-endpoint
description: >-
  Instale Send Event to Endpoint pelo Azion Marketplace e execute-a em um firewall para transmitir dados da requisição a um endpoint HTTP ou um bucket S3.
---

# Instale a integração Send Event to Endpoint

Você instala a integração Send Event to Endpoint pelo Azion Marketplace e a executa em um [Firewall](/pt-br/documentacao/plataforma/firewall/), pelo Azion Console. A function recebe os dados da requisição e os envia a um endpoint que você define, por meio da API fetch do JavaScript. Um arquivo de argumentos em JSON define quais dados a function captura e, depois que ela envia os dados, a requisição segue pelo Rules Engine.

Cinco objetos precisam existir antes que os dados da requisição sejam transmitidos: a function instalada, um firewall com o módulo **Functions**, uma function instance com os argumentos, uma regra do Rules Engine com o behavior **Run Function** e um deployment do workload vinculado ao firewall. Cada seção abaixo cria um deles.

---

## Pré-requisitos

- Uma conta Azion. Para entrar, consulte [Como acessar o Azion Console](/pt-br/documentacao/guias/plataforma/conta-e-billing/como-acessar-o-azion-console/).
- Uma application servida por um [workload](/pt-br/documentacao/plataforma/workloads/), cujo deployment você vincula ao firewall na última seção.
- Um endpoint HTTP que recebe os dados, um bucket S3 com a access key e a secret key dele, ou os dois.
- A [Azion CLI](/pt-br/documentacao/devtools/cli/) instalada e autorizada, para a última seção.
- Ativar um produto ou um módulo pode gerar custos de uso. Para mais informações, consulte [Preços](/pt-br/documentacao/fundamentos/precos/).

---

## Instale a integração

A function é instalada uma vez por conta. Para instalá-la:

1. **Abra o Marketplace**

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

2. **Encontre a integração**

   Digite `Send Event to Endpoint` no campo **Search on Marketplace** e selecione o card da integração. Navegar pelos cards e pelas categorias leva à mesma página.

3. **Selecione Install**

O card mostra `Successfully installed!` e `Latest version installed!`, e a function aparece na lista **Function** do drawer **Create Instance**.

---

## Crie o firewall

O firewall é onde a function é instanciada e onde fica a regra que a executa. Para criar um:

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

   Acesse [Azion Console](https://console.azion.com/) > **Firewalls** e crie um firewall.

2. **Nomeie o firewall**

   Na seção **General**, digite um **Name**. Por exemplo: `send-event-firewall`.

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

   Na seção **Modules**, ative o switch **Functions**.

4. **Salve o firewall**

O firewall mostra uma aba **Functions Instances** enquanto o módulo **Functions** estiver ativado. Para usar um firewall existente, ative o módulo **Functions** dele e salve-o. Para conhecer cada configuração deste formulário, consulte [Defina as configurações principais de um firewall](/pt-br/documentacao/guias/seguranca-de-aplicacoes/firewall-e-waf/firewall-definir-main-settings/).

---

## Crie a function instance

A instância guarda a seleção de dados e os argumentos de conexão com o endpoint ou o bucket. Para criá-la:

1. **Abra a aba Functions Instances**

   Em **Firewalls**, selecione seu firewall e selecione a aba **Functions Instances**.

2. **Selecione + Function**

   Um firewall que não tem instância mostra a mesma ação como **Function Instance**. O drawer **Create Instance** abre.

3. **Nomeie a instância**

   Em **Name**, digite um nome. Por exemplo: `send-event`.

4. **Selecione a function instalada**

   Em **Function**, selecione a function Send Event to Endpoint. A lista contém apenas as functions que executam em um firewall.

5. **Digite os argumentos**

   Em **Arguments**, o editor vem preenchido com os argumentos padrão da integração em JSON. Digite seus valores, como a próxima seção descreve.

6. **Selecione Save**

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

### Argumentos

Os argumentos padrão têm esta forma:

```json
{
  "metadata": ["remote_addr"],
  "headers": ["x-hello"],
  "body": ["message", "user.id"],
  "http_connection_args": {
	"endpoint": "http://example_api:3000/test",
	"headers": {
  	"Authorization": "FakeAuth",
  		"X-Provider": "Azion Cells"
	}
  }
}
```

| Campo                                | Obrigatório                         | Tipo de dado  | Observações                                                                                                                                                                                                                                                                                                                                                                                                             |
| ------------------------------------ | ----------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `metadata`                           | Não                                 | Null ou Array | Os campos de metadados que a function transmite. Quando é `null` ou não está definido, a function transmite todos os campos de metadados. Para não transmitir nenhum metadado, defina um array vazio `[ ]` como valor.                                                                                                                                                                                                  |
| `headers`                            | Não                                 | Null ou Array | Os cabeçalhos da requisição que a function transmite. Quando é `null` ou não está definido, a function transmite todos os cabeçalhos da requisição. Para não transmitir nenhum cabeçalho, defina um array vazio `[ ]` como valor.                                                                                                                                                                                       |
| `body`                               | Não                                 | Null ou Array | Os campos do corpo da requisição que a function transmite. Quando é `null` ou não está definido, a function transmite todos os campos do corpo da requisição. Para não transmitir nenhum campo do corpo, defina um array vazio `[ ]` como valor. Para filtrar campos de vários níveis, use notação de ponto: a string `'user.name'` faz a function procurar o campo `'name'` no objeto `'user'` do corpo da requisição. |
| `connection_args`                    | Sim                                 | Objeto        | Os dados que a function usa para transmitir os dados da requisição. O endpoint é a URL que recebe os dados. Os headers são os cabeçalhos que a requisição fetch inclui. A function também adiciona um cabeçalho `'Content-Type: application/json'`.                                                                                                                                                                     |
| `s3_connection_args`                 | Não                                 | Objeto        | Os argumentos que a function usa para se conectar ao bucket S3.                                                                                                                                                                                                                                                                                                                                                         |
| `s3_connection_args.full_host`       | Apenas ao usar `s3_connection_args` | String        | O host completo do bucket S3.                                                                                                                                                                                                                                                                                                                                                                                           |
| `s3_connection_args.region`          | Apenas ao usar `s3_connection_args` | String        | A região do bucket S3.                                                                                                                                                                                                                                                                                                                                                                                                  |
| `s3_connection_args.access_key`      | Apenas ao usar `s3_connection_args` | String        | A access key da conexão com o bucket S3.                                                                                                                                                                                                                                                                                                                                                                                |
| `s3_connection_args.secret_key`      | Apenas ao usar `s3_connection_args` | String        | A secret key da conexão com o bucket S3.                                                                                                                                                                                                                                                                                                                                                                                |
| `s3_connection_args.file_path`       | Não                                 | String        | O caminho onde a function armazena o arquivo que cria. Valor padrão: `/`                                                                                                                                                                                                                                                                                                                                                |
| `s3_connection_args.use_date_prefix` | Não                                 | String        | Quando ativado, a function adiciona ao caminho do arquivo uma subpasta com o nome da data atual, no formato YYYY-MM-DD. Valor padrão: `true`                                                                                                                                                                                                                                                                            |

Você também pode usar um arquivo de argumentos catch-all, como este:

```json
{
    "connection_args": {
        "endpoint": "http://example_api:3000/test", 
    }
}
```

Quando você fornece argumentos de conexão válidos tanto para o endpoint HTTP quanto para o bucket S3, a function entrega os dados do evento aos dois ao mesmo tempo.

### Dados transmitidos

A function envia os dados transmitidos como um arquivo JSON como este:

```json
{
  "body": {
	"field_a": <data>,
	...
  },
  "geoip_asn": <data>,
  "geoip_city": <data>,
  "geoip_city_continent_code": <data>,
  "geoip_city_country_code": <data>,
  "geoip_city_country_name": <data>,
  "geoip_continent_code": <data>,
  "geoip_country_code": <data>,
  "geoip_country_name": <data>,
  "geoip_region": <data>,
  "geoip_region_name": <data>,
  "headers": {
	"x-header-a": <data>,
	...
  },
  "remote_addr": <data>,
  "remote_port": <data>,
  "remote_user": <data>,
  "request_id": <data>,
  "request_url": <data>,
  "server_protocol": <data>,
  "ssl_cipher": <data>,
  "ssl_protocol": <data>
}
```

O `request_id`, o `request_url` e os campos de metadados ficam na raiz do arquivo JSON. Os campos do corpo e os cabeçalhos da requisição ficam em objetos.

### Arquivos de saída no S3

Cada execução da function cria um novo arquivo no bucket S3. O arquivo recebe o nome do ID da requisição que executou a function.

Por exemplo: `connection_args.file_path` está definido como `/my-data/`, e a function executa em 9 de maio de 2023, para o ID de requisição `abcd-1234`. A function salva o arquivo em `/my-data/2023-05-09/abcd-1234.json`. Quando `connection_args.use_date_prefix` está definido como `false`, a function salva o arquivo como `/my-data/abcd-1234.json`.

> **Atenção**
>
> A integração não é compatível com a autenticação HMAC AWS Signature Version 4 (SigV4). Em um bucket Amazon S3 com HMAC ativado, a function não consegue entregar os dados, e o [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/) mostra este erro:
>
> ```xml
> <Error>
>   <Code>InvalidRequest</Code>
>   <Message>Missing required header for this request: x-amz-content-sha256</Message>
> </Error>
> ```
>
> A autenticação HMAC AWS SigV4 exige o cabeçalho `x-amz-content-sha256`, e a integração não o gera. Para resolver isso, desative a autenticação HMAC no seu bucket S3. Para mais detalhes, consulte a [documentação da AWS sobre autenticação no S3](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html).

### Erros de conexão

Quando o arquivo de argumentos não tem `http_connection_args` nem `s3_connection_args`, a function não tem argumentos de conexão válidos. A function encerra a requisição e retorna uma mensagem de erro em JSON com a causa:

```json
{
  "error": "A001",
  "detail": "The function instance is missing or has invalid required arguments."
}
```

Quando a function não consegue se conectar ao endpoint HTTP ou ao provedor S3, ela ignora a requisição do usuário. A function ainda cria um log de erro, que você acessa pelo [Data Stream](/pt-br/documentacao/plataforma/data-stream/). Por exemplo, uma access key inválida mostra esta mensagem:

```json
[Send event to endpoint] S3 connection error; 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Error>
	<Code>InvalidAccessKeyId</Code>
	<Message>The key 'DAKEY' is not valid</Message>
</Error>
```

---

## Crie a regra

A instância não transmite nada até que uma regra a execute. Uma regra do [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/) seleciona as requisições que chegam à instância, por meio de um behavior **Run Function**. Para criar a regra:

1. **Abra a aba Rules Engine**

   Em **Firewalls**, selecione seu firewall e selecione a aba **Rules Engine**.

2. **Selecione + Rule**

3. **Nomeie a regra**

   Em **Name**, digite um nome. Por exemplo: `Run Send Event to Endpoint`.

4. **Defina o critério**

   Na seção **Criteria**, selecione os domínios que executam a integração. Por exemplo: if `Host` *matches* `yourdomain.com`.

5. **Adicione o behavior Run Function**

   Na seção **Behaviors**, selecione **Run Function** e selecione a instância pelo nome que você deu a ela.

6. **Selecione Save**

O firewall executa a instância em cada requisição aos domínios do critério.

---

## Vincule o firewall ao workload

O vínculo fica no deployment do workload, então crie um deployment que indique tanto a application quanto o firewall:

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

O comando imprime o id do novo deployment:

```text
Created Workload Deployment with ID 123456
```

As requisições ao domínio do workload chegam ao firewall, e a regra executa a instância de Send Event to Endpoint em cada uma delas.

---

## Próximos passos

- [Integrações do Marketplace](/pt-br/documentacao/plataforma/marketplace/integracoes.md): Todas as integrações que o Azion Marketplace oferece e onde cada uma executa.
- [Rules Engine para Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine.md): Todos os critérios e behaviors que uma regra de firewall aceita.
- [Data Stream](/pt-br/documentacao/plataforma/data-stream.md): Leia os logs de erro que a function grava quando uma conexão falha.
- [Atualize uma integração](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/atualizar-uma-integracao.md): Mova uma integração instalada para a versão mais recente.
