Funções do AEM Edge aem-edge-functions

IMPORTANT
O AEM Edge Functions é um recurso do beta público e você pode experimentá-lo por autoatendimento sem entrar em contato com a Adobe para habilitá-lo. A Adobe incentiva você a enviar um email para aemcs-edgecompute-feedback@adobe.com para descrever seu caso de uso, para que a Adobe possa garantir que ele seja suportado e fornecer qualquer orientação. É especialmente importante entrar em contato com a Adobe antes de implantar o recurso para o tráfego de produção.
Ao usar o Beta de funções do AEM Edge, você reconhece que ele ainda está em desenvolvimento e que não deve depender do funcionamento correto da tecnologia ou da disponibilidade dos dados. Esse recurso é fornecido como está, pode ser alterado sem aviso prévio e não é coberto pela produção.

O AEM Edge Functions permite executar o JavaScript na camada de CDN, aproximando o processamento de dados do usuário final. Isso reduz a latência e permite experiências responsivas e dinâmicas sem uma viagem de ida e volta à sua origem.

Casos de uso comuns incluem:

  • Personalização de conteúdo com base em informações como geolocalização, tipo de dispositivo ou atributos do usuário
  • Atuar como middleware entre a CDN e sua origem
  • Reformatação ou agregação de respostas de APIs de terceiros antes que elas cheguem ao navegador
  • Compondo e disponibilizando HTML renderizado pelo servidor na borda usando conteúdo compilado de vários back-ends

O AEM Edge Functions é compatível com o Edge Delivery Services e o AEM as a Cloud Service Java-stack, para clientes do AEM Sites.

Siga este tutorial para obter uma apresentação concreta das variações de pilha de Java do Edge Delivery Services e do AEM as a Cloud Service.

Principais benefícios key-benefits

Benefício
Descrição
Desempenho
TTFB rápido por meio do SSR de borda que retorna o HTML totalmente renderizado. Chamadas de API de baixa latência por meio de buscas paralelas e saltos de rede otimizados.
SEO / GEO
Os rastreadores de IA podem indexar o conteúdo que é compilado no lado do servidor.
Segurança
Manter as credenciais de API no lado do servidor ocultas do JavaScript cliente. Autentique com um provedor de identidade e restrinja o acesso ao conteúdo.
Personalização
Personalize o conteúdo antes que a página seja carregada com base nos sinais de localização geográfica e do dispositivo. Execute pesquisas de público-alvo na borda para entrega direcionada.

Pré-requisitos prerequisites

  • Um Programa Cloud Manager, que contém ambientes Java-stack do AEM ou sites do Edge Delivery Services. Saiba como integrar sites EDS ao Cloud Manager.
  • Um pipeline de Configuração do Cloud Manager (chamado de pipeline do Edge Delivery Services para EDS Sites).
  • O Perfil de Produto de Administrador do AEM na instância de autor do seu ambiente do Cloud Service, ou a função de Gerente de Implantação do Cloud Manager no Admin Console para sites do Edge Delivery Services
  • Node.js e npm

Configurar setup

Instalar a CLI do Adobe install-adobe-cli

Instale a CLI do Adobe Developer (aio):

npm install -g @adobe/aio-cli

Instale o plug-in AEM Edge Functions:

aio plugins install @adobe/aio-cli-plugin-aem-edge-functions

Autentique e configure o plug-in para o seu ambiente:

aio login
aio aem edge-functions setup

O comando de configuração solicita que você faça logon e selecione o ambiente do AEM no qual deseja usar as funções do AEM Edge.

Clonar a chapa boilerplate

Copie o aem-edge-functions-boilerplate no seu próprio repositório e instale as dependências:

npm install

Registrar sua função do AEM Edge register-your-function

As Funções do AEM Edge são declaradas em um arquivo de configuração YAML e implantadas por meio do pipeline de configuração do Cloud Manager.

​1. Definir um pipeline de configuração configuration-pipeline

Antes de criar uma função de borda, verifique se no Cloud Manager existe um pipeline de configuração para o seu ambiente (se estiver usando a pilha de Java da AEM) ou um pipeline da Edge Delivery Services se o seu projeto estiver implementado com o Edge Delivery Services. Consulte Usar Pipelines de Configuração para obter informações sobre como configurar os pipelines.

NOTE
Se você estiver usando um Ambiente de Desenvolvimento Rápido (RDE), é possível implantar a configuração diretamente com o aio aem rde:install -t env-config ./config, em vez de passar por um pipeline de configuração.

​2. Declare sua função do Edge declare-functions

Crie um arquivo chamado edgeFunctions.yaml no diretório de configuração:

kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
    # add advanced configuration under here

Os ambientes Java-stack têm uma função de borda e as implementações do Edge Delivery Services têm três funções de borda. As teclas opcionais de nível superior são:

Chave
Descrição
functions
Lista de funções de borda, cada uma identificada por um name. Para compatibilidade com versões anteriores, services também é aceito, mas functions é a chave preferida. Não é permitido usar ambos no mesmo arquivo.
configs
Pares de chave/valor expostos a funções de borda de um ambiente como variáveis de ambiente.
secrets
Pares de chave/valor que fazem referência aos segredos do Cloud Manager para as funções de borda de um ambiente
kvs
Alternância booleana para provisionar um armazenamento KV para dados de valor-chave de leitura/gravação em tempo de execução, compartilhados em todas as funções de borda em um ambiente.

Consulte a configuração avançada, como configs, secrets e kvs, na seção de configuração avançada abaixo.

​3. Implantar a função do Edge por meio do Cloud Manager deploy-functions-via-cm

Usando o Cloud Manager, implante o pipeline para que a função de borda seja registrada na CDN.

Criar, criar e implantar o código de função do AEM Edge build-deploy

Autor author

Escreva a lógica comercial do código de função de borda, usando a pasta src da chapa como ponto de partida.

Build build

Crie um pacote do código de função de borda para implantação:

aio aem edge-functions build

Implantar deploy

Implante o código da função de borda empacotada na função de borda nomeada. O argumento function-name deve corresponder ao valor name em edgeFunctions.yaml:

aio aem edge-functions deploy <function-name>

Teste test

Verifique se a função de borda funciona conforme esperado. Você pode testá-la em:

edgefunction-pXXXXX-eYYYYY-<function name>.adobeaemcloud.com/<path>

Por exemplo, para a pilha de Java do AEM:

edgefunction-pXXXXX-eYYYYY-my-edge-function.adobeaemcloud.com/weather

ou para Edge Delivery Services:

edgefunction-pXXXXX-dYYYYY-my-edge-function.adobeaemcloud.com/weather

Este domínio com o prefixo edgefunction é apenas para depuração, mas não deve ser referenciado para tráfego ao vivo, pois não há garantia de que seja um nome estável. Para determinar o valor de dAAAA, consulte a saída do comando deploy.

Conectar ao fluxo de entrega de conteúdo wiring

O tráfego de função do Edge deve ser enviado para o domínio do site, que normalmente é um domínio personalizado para AEM Java-stack, e deve ser um domínio personalizado para Edge Delivery Services Sites.

​1. Definir seletores de origem origin-selectors

As funções do Edge são invocadas pelo roteamento de tráfego CDN para elas por meio de regras do seletor de origem. Adicione o seguinte ao arquivo de configuração cdn.yaml (ou crie um caso ele não exista):

kind: 'CDN'
version: '1'
data:
  originSelectors:
    rules:
      - name: route-weather-to-edge-function
        when: { reqProperty: path, equals: "/weather" }
        action:
          type: selectAemOrigin
          originName: edgefunction-my-edge-function
      - name: route-hello-world-to-edge-function
        when: { reqProperty: path, equals: "/hello-world" }
        action:
          type: selectAemOrigin
          originName: edgefunction-my-edge-function

As regras do seletor de origem permitem rotear o tráfego para suas funções de borda com base em qualquer condição disponível no mecanismo de regras CDN, como um caminho, domínio ou cabeçalho de solicitação específico. Várias regras podem rotear caminhos diferentes para a mesma função de borda. Consulte Seletores de Origem para obter a sintaxe de regra completa.

​2. Implantar a configuração deploy-to-cdn

Confirme cdn.yaml no repositório Git do Cloud Manager e acione o pipeline de configuração. Depois que o pipeline for concluído com êxito, seus pontos de extremidade de função de borda estarão disponíveis em:

  • example.com/weather
  • example.com/hello-world

Para depuração, você pode referenciar a função de borda no domínio publish-pXXXXX-eYYYYY.adobeaemcloud.com (para a pilha de Java do AEM) ou publish-pXXXXX-dYYYYY.adobeaemcloud.com (para sites do Edge Delivery Services). Não use esse domínio para uso de produção, pois não há garantia de que seja um nome estável. Para determinar o valor de dAAAA, consulte a saída do comando deploy.

Desenvolvimento local local-development

Executar localmente local-run

Iniciar um servidor de desenvolvimento local em http://127.0.0.1:7676:

aio aem edge-functions serve

Consulte esta documentação do Compute JavaScript para obter detalhes sobre o que o tempo de execução local suporta.

Teste test-localdev

Execute o conjunto de testes com Mocha:

npm run test

Depuração remota remote-debugging

O Adobe Managed CDN não expõe um depurador remoto, mas expõe o fluxo de log. Siga os logs de uma função implantada para receber saída de console.log diretamente em seu terminal:

aio aem edge-functions tail-logs <function-name>

Armazenamento em cache e limpeza de cache caching

As funções do Edge podem reduzir significativamente a carga de origem e melhorar os tempos de resposta, armazenando dados em cache na borda. No entanto, o armazenamento em cache requer um design intencional, principalmente em Funções Edge, nas quais duas camadas de cache independentes estão envolvidas:

Browser → AEM CDN (CDN Cache) → AEM Edge Functions (Fetch Cache) → Backend (AEM, APIs, etc.)

Antes de configurar o armazenamento em cache, considere como seu conteúdo se comporta:

  • O conteúdo verdadeiramente exclusivo por solicitação (tokens de sessão, preços em tempo real para um usuário específico) deve ignorar o armazenamento em cache para evitar a apresentação de resultados incorretos.
  • A Personalização baseada em coorte (conteúdo ajustado por região, tipo de dispositivo ou segmento de público-alvo) geralmente pode ser armazenada em cache com TTLs mais curtos ou Vary cabeçalhos, já que muitos usuários compartilham a mesma variante.
  • O conteúdo estável e compartilhado (catálogos de produtos, páginas do CMS, respostas da API que mudam de acordo com um cronograma conhecido) se beneficia do armazenamento em cache agressivo com invalidação explícita por meio de chaves substitutas.
  • Enganar-se em qualquer direção tem consequências. O excesso de cache causa bugs de conteúdo obsoletos que são difíceis de diagnosticar em duas camadas de cache. O armazenamento em cache elimina a finalidade de desempenho e descarregamento de origem de usar as funções do Edge.

Como a CDN e o cache de busca interno da Função Edge operam independentemente, uma alteração nos dados subjacentes requer a invalidação deliberada de ambas camadas. A compreensão dessa arquitetura é essencial para o gerenciamento confiável de cache.

Para obter orientação técnica detalhada sobre como configurar o comportamento de cache, controlar a duração do cache, usar chaves substitutas e limpar o conteúdo em cache, consulte Armazenamento em cache nas funções do AEM Edge.

Limitações limitations

  • Cada invocação de função Edge é executada dentro de uma sandbox com limites de recursos impostos pela plataforma de computação subjacente.

  • O tamanho máximo do artefato do assembly da Web criado (wasm) é 100 MB

  • O consumo máximo de memória é de 1MB de pilha, heap de 128MB

  • Informações importantes sobre a execução da função de borda:

    • Uma execução é encerrada após 120s do horário de muralha
    • As execuções serão encerradas em 1s de computação (não no horário da parede)
    • O tempo médio de execução da função de borda deve estar abaixo de 100 ms.
  • Veja as limitações relacionadas às Variáveis de Configuração de Função do Edge, Variáveis Secretas de Função do Edge e Repositórios KV de Função do Edge.

Máximo de Chamadas Fetch de Saída por Chamada max-fetch-calls

As Funções do AEM Edge impõem um limite rígido de 32 solicitações de back-end por execução (ou seja, por solicitação de entrada manipulada pela sua função). Quando esse limite for atingido, qualquer outra chamada fetch() falhará com o seguinte erro:

Requested backend named '…' does not exist

Quando você vê esse erro e sua configuração de origem está correta, a causa mais provável é que a cota de solicitação de back-end por invocação tenha sido esgotada. Consulte Limites de recursos do Fastly Compute para obter a lista completa de limites de plataforma.

Configuração de função avançada do Edge advanced-function-configuration

Origens origins

Por padrão, as funções de borda podem buscar de qualquer origem. Para restringir uma função a um conjunto definido de origens, declare-as em origins em edgeFunctions.yaml:

origins:
  - name: my-origin-name
    domain: example.com

Referencie a origem nomeada em seu código de função usando a opção de busca backend:

const request = new Request("https://example.com/test");
const response = await fetch(request, { backend: "my-origin-name" });
NOTE
Configurações, segredos e kvs não estão disponíveis em programas de sandbox. As próprias funções do Edge são executadas normalmente em ambientes de sandbox — somente essas entidades não são provisionadas.

Variáveis de configuração da função do Edge function-configuration

Exponha variáveis de ambiente a suas funções usando a chave configs em edgeFunctions.yaml. Os valores são armazenados em um repositório de configuração chamado config_default:

kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
  configs:
    - key: LOG_LEVEL
      value: DEBUG

Leia os valores de configuração no seu código de função:

import { ConfigStore } from "fastly:config-store";

const config = new ConfigStore('config_default');
const logLevel = config.get('LOG_LEVEL') || 'info';
NOTE
  • O repositório de configuração é sempre nomeado como config_default.
  • Os nomes de chave fazem distinção entre maiúsculas e minúsculas.
  • O armazenamento de configuração é compartilhado em todas as funções de borda no mesmo ambiente.
  • O armazenamento de configuração é replicado pela rede global da CDN gerenciada pela Adobe
  • máximo de 500 entradas
  • tamanhos máximo de nome/valor: 255 e 8.000 caracteres

Variáveis Secretas de Função do Edge function-secrets

Segredos são referenciados, não armazenados, em edgeFunctions.yaml. O campo value deve apontar para um segredo Cloud Manager usando a sintaxe ${{SECRET_REFERENCE}}. Primeiro defina o segredo subjacente no Cloud Manager — consulte Variáveis Secretas do Cloud Manager.

kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
  secrets:
    - key: API_TOKEN
      value: ${{API_TOKEN_SECRET}}

Recupere segredos em seu código de função usando o auxiliar SecretStoreManager da chapa padrão:

import { SecretStoreManager } from "./lib/config";

const apiToken = await SecretStoreManager.getSecret('API_TOKEN');
NOTE
  • O armazenamento secreto sempre se chama secret_default.
  • Os nomes de chave fazem distinção entre maiúsculas e minúsculas.
  • Segredos são imutáveis uma vez criados.
  • O armazenamento secreto é compartilhado em todas as funções de borda no mesmo ambiente.
  • O armazenamento secreto é replicado pela rede global do CDN gerenciado pela Adobe
  • O tamanho máximo de todos os segredos é de 64 kb

Armazenamento KV da função Edge function-kv-store

As funções do Edge podem ler e gravar dados arbitrários de valores-chave no tempo de execução por meio de um armazenamento KV. Para habilitá-lo, defina kvs: true em edgeFunctions.yaml:

kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
  kvs: true

Isso provisiona um armazenamento KV vazio chamado kv_default. Preencha-o no tempo de execução a partir do código da função de borda usando a API de armazenamento KV Fastly:

import { KVStore } from "fastly:kv-store";

const kv = new KVStore('kv_default');

// Read a value
const entry = await kv.get('visit-count');
const count = entry ? Number(await entry.text()) : 0;

// Write a value
await kv.put('visit-count', String(count + 1));
NOTE
  • O armazenamento KV sempre é nomeado como kv_default.
  • O armazenamento KV está vazio no momento do provisionamento; preencha-o no tempo de execução por meio da API do Fastly KV Store. Não há suporte para entradas de chave/valor declarativo em edgeFunctions.yaml.
  • O armazenamento KV é compartilhado em todas as funções de borda no mesmo ambiente.
  • O armazenamento KV é replicado pela rede global do CDN gerenciado pela Adobe
  • As lojas KV fornecem consistência eventual, o que significa que ler uma chave imediatamente após gravá-la pode não retornar o valor atualizado.
  • Os nomes das chaves KV são arquivos UTF-8 com no máximo 1024 bytes
  • O tamanho máximo da entrada KV é 25M
  • Os itens do Armazenamento KV têm um limite de taxa de 1 gravação por segundo por item.
  • As solicitações em lote de itens do Armazenamento KV têm um limite de 100.000 itens por solicitação.

Logs logging

O AEM Edge Functions é integrado ao recurso Encaminhamento de logs do AEM. Crie um arquivo logForwarding.yaml junto com seu edgeFunctions.yaml:

kind: "LogForwarding"
version: "1"
metadata:
  envTypes: ["rde", "dev", "stage", "prod"]
data:
  splunk:
    default:
      enabled: true
      host: "splunk-host.example.com"
      token: "${{SPLUNK_TOKEN}}"
      index: "AEMaaCS"

Use o agente de log no código da função para gravar entradas de log estruturadas:

import { Logger } from "fastly:logger";

const logger = new Logger("customerSplunk");
logger.log(JSON.stringify({
  method: event.request.method,
  url: event.request.url
}));
NOTE
Os logs CDN — que incluem entradas de log de função do AEM Edge — podem ser baixados do Cloud Manager para ambientes Java-stack, mas não para sites do Edge Delivery.
recommendation-more-help
experience-manager-cloud-service-help-main-toc