Funções do AEM Edge aem-edge-functions
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
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.
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:
functionsname. Para compatibilidade com versões anteriores, services também é aceito, mas functions é a chave preferida. Não é permitido usar ambos no mesmo arquivo.configssecretskvsConsulte 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/weatherexample.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
Varycabeç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" });
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';
- 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');
- 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));
- 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
}));