Usar configurações e segredos com as funções do Edge

IMPORTANT
O AEM Edge Functions está atualmente na versão beta. Os recursos e a documentação podem mudar. Para receber comentários, contate aemcs-edgecompute-feedback@adobe.com.
NOTE
Os armazenamentos de configuração, segredo e KV não estão disponíveis em programas de sandbox. Use um ambiente que não seja de sandbox ou um RDE para testar configurações e segredos.

Saiba como transmitir configurações e segredos não confidenciais para uma Função Edge do AEM por meio de edgeFunctions.yaml e como lê-los em seu código.

Configurações versus segredos

configs e secrets são pares de chave-valor expostos na função Edge do AEM.

A diferença é onde o valor está e quão sensível ele é.

configs
secrets
Usar para
Valores não confidenciais (URLs de API, TTLs de cache, sinalizadores de recursos etc.)
Valores confidenciais (tokens de API, chaves, credenciais etc.)
O valor vive em
edgeFunctions.yaml, enviado para o Git
Um segredo do Cloud Manager, referenciado de edgeFunctions.yaml
Nome do armazenamento
config_default
secret_default
Ler no código com
ConfigStore.get() (síncrono)
SecretStoreManager.getSecret() (assíncrono)
Visível no Git
Sim
Não, somente a referência ${{SECRET_NAME}} é confirmada em edgeFunctions.yaml
IMPORTANT
Nunca coloque um valor confidencial em configs. O arquivo edgeFunctions.yaml está confirmado no Git, portanto, seus valores de configuração ficam visíveis para qualquer pessoa com acesso ao repositório. Use secrets para tokens, chaves e credenciais.

Onde você declara configurações e segredos

Declarar ambos em data em edgeFunctions.yaml, como irmãos de functions. Eles não estão aninhados em uma função individual.

# config/edgeFunctions.yaml
kind: "EdgeFunctions"
version: "1"
data:
  functions:
    - name: my-edge-function
  configs:
    - key: TRIPS_API_BASE_URL
      value: "https://api.example.com/trips"
    - key: ADVENTURE_CACHE_TTL_SECONDS
      value: "300"
  secrets:
    - key: TRIPS_API_TOKEN
      value: ${{WKND_TRIPS_API_TOKEN}}

Os nomes de chave fazem distinção entre maiúsculas e minúsculas. O key declarado aqui tem o mesmo nome que o código lê no tempo de execução.

Para todas as propriedades suportadas, consulte Declarar funções.

Usar configurações

As configurações mantêm valores não confidenciais que variam de acordo com o ambiente. Os valores de configuração são sempre cadeias de caracteres, portanto, converta-os quando precisar de um número ou booleano.

Ler configurações no código

Abra o repositório config_default e chame get() com a chave declarada. A chamada é síncrona.

// src/index.js or handler file
import { ConfigStore } from "fastly:config-store";

const config = new ConfigStore("config_default");

// read a config value (always a string)
const apiBaseUrl = config.get("TRIPS_API_BASE_URL");

// cast to a number, with a fallback if the key is missing
const ttlSeconds = Number(config.get("ADVENTURE_CACHE_TTL_SECONDS") || "300");

Usar segredos

Os segredos contêm valores confidenciais, como um token de API. O valor permanece em um segredo do Cloud Manager. Seu edgeFunctions.yaml faz referência a ele com a sintaxe ${{SECRET_NAME}}, de modo que o valor nunca aparece no Git.

Dois nomes estão envolvidos, e eles são diferentes de propósito.

Nome
Onde ele mora
Propósito
TRIPS_API_TOKEN (o key)
edgeFunctions.yaml e seu código
O nome que seu código passa para getSecret()
WKND_TRIPS_API_TOKEN (dentro de ${{ }})
Cloud Manager secret
O segredo do Cloud Manager que contém o valor real

Este exemplo usa uma chave e um segredo, o padrão para o AEM as a Cloud Service. No Edge Delivery Services, você repete o padrão uma vez por site, já que um pipeline de configuração serve todos os três sites.

Adicionar o segredo no AEM as a Cloud Service

Defina o segredo do Cloud Manager e execute o pipeline de configuração antes de usá-lo na função Edge do AEM. Cada ambiente (RDE, Dev, Stage, Prod) tem sua própria guia Configuração, portanto, um segredo que você adiciona ao Dev não existe no Stage ou no Prod até que você o adicione também.

  1. No Cloud Manager, navegue até a guia Programa > Ambiente > Configuração.
    Guia Configuração do Cloud Manager
  2. Selecione +Adicionar configuração. No modal Configuração do ambiente, digite o nome e o valor, escolha o serviço ao qual ele será aplicado e defina o tipo como Segredo.
    modal de Configuração de Ambiente Cloud Manager
  3. Selecione +Adicionar, depois Salvar.

Adicionar o segredo no Edge Delivery Services

O Edge Delivery Services tem um pipeline de configuração por programa, não um por site. Ele implanta um único edgeFunctions.yaml para todo o programa, compartilhado por cada site, em vez de um arquivo separado por site.

Os sites Desenvolvimento, Preparo e Produção compartilham esse pipeline, portanto, não é possível adicionar o mesmo nome de variável três vezes com três valores diferentes e você não pode depender de um edgeFunctions.yaml específico de ramificação para escolher o correto.

Prefixe cada nome de variável com seu site para que os três sites nunca colidam, por exemplo DEV_TRIPS_API_TOKEN, STAGE_TRIPS_API_TOKEN e MAIN_TRIPS_API_TOKEN. Declare todos os três no mesmo edgeFunctions.yaml e deixe seu código escolher o correto no tempo de execução.

  1. No Cloud Manager, navegue até a seção Programa > Edge Delivery > Pipelines. Selecione as reticências (...) ao lado do pipeline e Exibir/Editar variáveis.
    Variáveis de pipeline de configuração do Cloud Manager
  2. Adicione uma variável por site, usando o prefixo do site, e defina o tipo como Segredo.
    Prefixo do segredo do Cloud Manager
  3. Declarar todos os três segredos prefixados no único edgeFunctions.yaml, já que o pipeline o implanta uma vez para cada site.
# config/edgeFunctions.yaml
secrets:
  - key: TRIPS_API_TOKEN_DEV
    value: ${{DEV_TRIPS_API_TOKEN}}
  - key: TRIPS_API_TOKEN_STAGE
    value: ${{STAGE_TRIPS_API_TOKEN}}
  - key: TRIPS_API_TOKEN_MAIN
    value: ${{MAIN_TRIPS_API_TOKEN}}

A função Edge do AEM deve decidir qual chave ler no tempo de execução, com base no site que está sendo veiculado no momento. A próxima seção mostra a pesquisa.

Ler segredos no código

Leia o segredo no tempo de execução por meio do auxiliar SecretStoreManager fornecido pela placa-mãe em src/lib/config.js. Ele lê do armazenamento secret_default. A chamada é assíncrona em ambas as plataformas, mas a chave que você procura é diferente.

No AEM as a Cloud Service, a chave é fixa, já que cada ambiente tem seu próprio segredo atrás do mesmo nome de chave:

// src/index.js or handler file
import { SecretStoreManager } from "./lib/config";

const token = await SecretStoreManager.getSecret("TRIPS_API_TOKEN");
if (!token) {
  throw new Error("TRIPS_API_TOKEN is not configured");
}

No Edge Delivery Services, compile a chave do site atual primeiro, já que um edgeFunctions.yaml compartilhado declara uma chave separada por site:

// src/index.js or handler file
import { SecretStoreManager } from "./lib/config";

const site = getCurrentSite(); // for example, "DEV", "STAGE", or "MAIN" based on the origin header
const token = await SecretStoreManager.getSecret(`TRIPS_API_TOKEN_${site}`);
if (!token) {
  throw new Error(`TRIPS_API_TOKEN_${site} is not configured`);
}

Depois de receber o token, use-o na solicitação de saída da mesma maneira em ambas as plataformas:

// use the token in an outbound request, never in a response to the client
const request = new Request("https://api.example.com/trips", {
  headers: { Authorization: `Bearer ${token}` },
});

Mantenha o segredo dentro da Função Edge do AEM. Não retorne-o ao cliente nem registre-o.

Diretrizes

  • Use o configs para qualquer item que possa ser confirmado e o secrets para qualquer item que deva permanecer em sigilo.
  • Corresponder nomes de chave exatamente. Todos os nomes de chave fazem distinção entre maiúsculas e minúsculas.
  • Converta valores de configuração antes de usar, pois cada valor de configuração é uma string.
  • Adicione o segredo do Cloud Manager antes da execução do pipeline ou a referência ${{SECRET_NAME}} não será resolvida.
  • No Edge Delivery Services, adicione prefixos a cada segredo e nome de variável com seu site (DEV_, STAGE_, MAIN_). Um pipeline de configuração serve todos os três sites, portanto, os nomes sem prefixo colidem e seu código deve escolher o prefixo correto no tempo de execução.

Recursos adicionais

recommendation-more-help
experience-manager-learn-help-cloud-service