# Edge Services

O **Azion Edge Services** é um módulo do produto **Orchestrator** que permite o gerenciamento de serviços orquestrados em seus próprios nodes, habilitando o cadastro de recursos e demais configurações via [Azion Console](https://console.azion.com) e a criação e customização de serviços para que possam ser orquestrados nos Edge Nodes definidos.

Configure os gatilhos de instalação, desinstalação e recarregamento e defina as dependências entre os recursos necessários para a execução de seu serviço na sua rede Edge.

---

## Implementação

| Escopo        | Guia                                                                                                               |
| ------------- | ------------------------------------------------------------------------------------------------------------------ |
| Edge Services | [Criando um edge service](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/automacao/criando-edge-service/) |

---

## Como funciona

Ao utilizar a Azion como sua plataforma de Edge, você pode criar e customizar serviços para serem executados na sua rede Edge privada e híbrida. O Azion Edge Services funciona por meio de gatilhos para instalação, desinstalação e recarregamento, com definição das dependências entre os recursos, e implementa nativamente um conjunto de funcionalidades da Azion, como Applications, Firewall e Functions, utilizando como base a tecnologia de Azion Cells.

Dessa forma, permite construir Applications para uma grande variedade de casos de uso, que variam desde uma CDN de alta escala e qualidade até a hospedagem de aplicações web, aplicações de AI, VR e muitas outras. Para isso, *ative* o **Azion Cells** e defina os **Edge Nodes** que devem receber determinadas aplicações, tudo controlado pelo painel de controle da Azion ou APIs, em uma interface centralizada e com diferentes controles de acesso.

## Resources

Para poder orquestrar serviços em seu dispositivo, você precisa configurar todos os **resources** (recursos) necessários para instalar, desinstalar e recarregar seus serviços.

Um recurso do tipo **Text** indica que o conteúdo será copiado como texto simples para o dispositivo. Esses tipos de recursos normalmente são usados para arquivos de configuração.

Um recurso do tipo **Shell Script** indica que o recurso será instalado e executado conforme o **trigger** selecionado. O agente do Orchestrator utiliza o *sh-bang* informado no cabeçalho do conteúdo para a execução do script; na ausência de um, é utilizado o **shell** compatível com o padrão POSIX no dispositivo (*/bin/sh*).

Ambos os tipos de recursos são compatíveis com o uso de **variables** (variáveis) e **facts** (fatos), desde que a etiqueta `{{ VARNAME }}` ou `{{ FACT_NAME }}` esteja incluída.

Todos os recursos são executados usando o *Path* referido no registro. O campo *Path* refere-se ao caminho absoluto do diretório. Caminhos relativos não serão aceitos e não são suportados.

**Nota:** Há um problema conhecido quando se usa a sintaxe `{#`. Se você usar `{#` e não usar` #}` como fechamento, o resource não será processado e não será provisionado nos edges. Se você usar `{#` e depois usar `#}`, o conteúdo dentro do bloco é considerado um comentário. Neste caso, o arquivo é processado e provisionado, mas sem o conteúdo dentro do comentário. Para provisionar um resource com `{# meu conteúdo #}` você deve usar o seguinte padrão: `{{'{# meu conteúdo #}'}}`. Nossa equipe de engenharia está ciente do problema e está trabalhando para resolvê-lo.

## Variables

As variáveis são valores dinâmicos que afetam os Edge Services que serão orquestrados e executados em Edge Nodes. Em outras palavras, é possível orquestrar e executar o mesmo serviço, em dispositivos diferentes, com valores diferentes para as configurações, como configurar um serviço na porta 3306 em um dispositivo, e na porta 3307 em outro dispositivo.

Variáveis  podem ser usadas no conteúdo do recurso se a *tag* `{{VARNAME }}` for utilizada. Por exemplo:\
`port = {{ PORT_HTTP }}`

Há algumas variáveis especiais pré-definidas que, como fatos, não podem ser sobrescritas. Veja a lista na tabela abaixo:

| Variável                 | Descrição                                                                                                                                    | Valor  | Observação                                                                                        |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------- |
| **CHANGESET\_RM\_PATH**  | Contém um *path* para um arquivo que contém uma lista de *paths* de todos os arquivos **removidos** ou **modificados** no manifesto atual.   | STRING | Está disponível somente enquanto o manifesto está sendo aplicado. Cada linha tem um único *path*. |
| **CHANGESET\_ADD\_PATH** | Contém um *path* para um arquivo que contém uma lista de *paths* de todos os arquivos **adicionados** ou **modificados** no manifesto atual. | STRING | Está disponível somente enquanto o manifesto está sendo aplicado. Cada linha tem um único *path*. |

## Facts

Em complemento às variáveis definidas, você também pode utilizar **Facts** que são informações técnicas disponíveis sobre seu node, tais como arquitetura, versão do cliente, sistema operacional e versão do sistema operacional. Você pode usá-los, por exemplo, se você estiver configurando múltiplos nodes.

Esses valores não podem ser sobrescritos e podem ser usados em **resources** usando a tag  `{{ FACT_NAME }}`. Por exemplo:\
`{{CLIENT_VERSION}}`.

| Fact                |                                      Descrição                                      |                               Valor                              |                                                                                                                                                           Observação                                                                                                                                                          |
| :------------------ | :---------------------------------------------------------------------------------: | :--------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| **CLIENT\_VERSION** |                             Versão do Orchestrator agent                            |                         MAJOR.MINOR.PATCH                        |                                                                                                                                    Exemplo: 1.10.3, onde 1 é MAJOR, 10 é MINOR e 3 é PATCH.                                                                                                                                   |
| **ARCH**            |                              Arquitetura do processador                             |            ARM ou; AMD (x86), ambos com 32 ou 64 bits            |                                                                                                                                                                                                                                                                                                                               |
| **OS\_NAME**        |                             Nome do Sistema Operacional                             | macOS; Linux; FreeBSD; OpenBSD; DragonFlyBSD; NetBSD ou; Solaris |                                                                                                                                                                                                                                                                                                                               |
| **OS\_DISTRO**      | Nome da distribuição do Sistema Operacional, apenas para sistemas baseados em Linux |                          NAME + RELEASE                          | NAME: Debian; Ubuntu; openSUSE; Mint Linux; Gentoo; Fedora; CentOS; Arch Linux ou; Kali Linux <br> <br> RELEASE: primeiramente obtendo via LSB Release, caso não exista busca em <br>/etc/os-release o valor de VERSION\_ID ou DISTRIB\_RELEASE <br> <br> No caso dos demais Sistemas Operacionais o valor será sempre vazio. |
| **OS\_VERSION**     |                   Versão do sistema operacional, apenas para MacOS                  |                            MAJOR.MINOR                           |                                                                                                                               Exemplo: 10.5. Para demais Sistemas Operacionais será sempre vazio                                                                                                                              |
| **CPUS**            |                              Número de CPUs disponíveis                             |                              INTEGER                             |                                                                                                                                                       Exemplo: 1, 2, 4.                                                                                                                                                       |
| **RAM\_SIZE**       |                               Memória total do sistema                              |                               BYTES                              |                                                                                                                                                        Exemplo: 1048576                                                                                                                                                       |

## Triggers

Ao configurar resources do tipo **Shell Script**, é necessário definir quais serão os gatilhos (triggers) que farão com que o recurso seja executado.

Os gatilhos são: *"Install"*, *"Reload"* e *"Uninstall"*, tendo cada uma deles uma função e ordem de execução:

**1) Install:** é o primeiro a ser executado e deve ter em seu conteúdo o script necessário para a instalação do serviço.

**2) Reload:** quando configurado, será executado ao final da instalação de todos os resources e também sempre que houver alteração nos vínculos entre Edge Service e Edge Node - por exemplo, uma alteração nos valores de variáveis.

**3) Uninstall:** é executado toda vez que o vínculo entre Edge Services e Edge Node é desfeito, ou seja, sempre que o serviço for apagado dos Edge Nodes nos quais está provisionado.

## Vínculo ao Edge Node

Todos os serviços cadastrados podem ser orquestrados e executados em um ou mais Edge Nodes existentes na sua rede privada.

Apenas os serviços ativos estarão disponíveis para orquestração no Edge Node; após o seu vínculo, você pode alterar o valor das variáveis existentes, apagar ou adicionar novos serviços ao dispositivo.

---
