Monitorar eventos do Experience Platform no Slack
Saiba como receber notificações do Experience Platform no Slack integrando com um proxy de webhook do Adobe App Builder. Engenheiros de dados e administradores podem querer receber notificações proativas no Slack da Adobe Experience Platform para monitorar a integridade de suas implementações da plataforma. Este tutorial descreve as etapas de arquitetura e implementação para conectar o Adobe I/O Events ao Slack usando o Adobe App Builder.
Por que um proxy de webhook?
Não é possível conectar diretamente o Adobe I/O Events a um Webhook de entrada do Slack devido a uma incompatibilidade de protocolo no processo de verificação.
-
O desafio: ao registrar um webhook no Adobe I/O Events, o Adobe envia uma solicitação de "Desafio" (um
GETouPOST) para o seu ponto de extremidade. Seu endpoint deve processar com êxito esse desafio e retornar o valor específico para confirmar a propriedade. -
Limitação: os webhooks de entrada do Slack foram criados apenas para assimilar cargas JSON para mensagens. Eles não têm lógica para reconhecer ou responder ao handshake de desafio de verificação da Adobe.
-
A Solução: implantar um proxy de webhook intermediário usando o Adobe App Builder. Esse proxy fica entre o Adobe e o Slack para:
- Intercepte a solicitação do Adobe e responda ao desafio de verificação.
- Formate o conteúdo em uma mensagem compatível com o Slack e encaminhe-a para o Slack.
-
Método de entrega: Ações de Tempo de Execução. As ações de tempo de execução vêm empacotadas com o Adobe App Builder. Ao usar uma Ação em tempo de execução (ação que não seja da Web) como o manipulador de eventos, o Adobe I/O Events lida automaticamente com a verificação de assinatura e respostas de desafio. As ações em tempo de execução são a abordagem recomendada, pois exigem menos código e fornecem segurança integrada.
Visão geral da arquitetura
O que é o Adobe Developer Console?
O Adobe Developer Console é o portal central para gerenciar projetos, APIs e credenciais da Adobe. É onde você cria seu projeto, configura a autenticação e registra seus webhooks.
O que é o App Builder?
O Adobe App Builder é uma estrutura completa que permite que desenvolvedores corporativos criem aplicativos nativos em nuvem.
-
Provisionamento: o App Builder não está habilitado por padrão; ele deve ser provisionado para sua organização como um recurso. Verifique se sua organização tem o direito App Builder.
-
Modelo de Projeto: os projetos do App Builder são criados especificamente usando o modelo App Builder no Developer Console (Projeto do Modelo > App Builder). O modelo configura automaticamente os espaços de trabalho e ambientes de tempo de execução necessários.
-
Guia de Introdução do App Builder: consulte a documentação para provisionar e criar seu primeiro projeto a partir do modelo.
O que é o Adobe I/O Runtime?
O Adobe I/O Runtime é a plataforma sem servidor que capacita o App Builder. Ele permite que os desenvolvedores implantem o código (Funções como um serviço) executado em resposta a solicitações HTTP sem gerenciar a infraestrutura do servidor.
Nesta implementação, usamos uma Ação. Uma ação é uma função sem estado (escrita em Node.js) executada no Adobe I/O Runtime. Nossa Ação serve como o endpoint HTTP público com o qual o Adobe I/O Events se comunica.
Para obter mais informações, consulte a documentação do Adobe I/O Runtime.
Guia de implementação
Pré-requisitos
Antes de iniciar, verifique se você tem o seguinte:
-
Acesso ao Adobe Developer Console: você deve ter acesso a um Administrador do Sistema ou à função de Desenvolvedor em uma organização que tenha o App Builder habilitado.
note tip TIP Para verificar o provisionamento do App Builder, faça logon no Adobe Developer Console, verifique se você está na organização desejada, selecione Criar projeto a partir do modelo e verifique se o modelo do App Builder está disponível. Se não estiver, consulte a seção de perguntas frequentes sobre o App Builder "Como obter o App Builder" -
Node.js & npm: este projeto requer Node.js, que inclui NPM (Gerenciador de Pacotes de Nós). O NPM é usado para instalar a CLI do Adobe e gerenciar dependências de projetos.
- Baixar Node.js (versão LTS recomendada)
- Guia de Introdução - Um guia sobre como verificar sua instalação.
-
aio CLI: Instalado via terminal:npm install -g @adobe/aio-cli -
Configuração do Aplicativo Slack: você precisa de um aplicativo Slack configurado em seu espaço de trabalho com um Webhook de entrada ativado.
- Criar um aplicativo Slack
- Guia de Webhooks de Entrada do Slack - Siga este guia para criar seu aplicativo e gerar a URL do Webhook (começa com
https://hooks.slack.com/…).
Etapa 1: criar um projeto no Adobe Developer Console
Primeiro, crie um projeto com o modelo App Builder no Adobe Developer Console:
- Fazer logon no Adobe Developer Console
- Selecione Criar projeto a partir do modelo
- Selecione o modelo do App Builder
- Insira um Título de Projeto, por exemplo
Slack webhook integration - Selecione Salvar
Inicializar o ambiente de tempo de execução
Execute os seguintes comandos no terminal para criar a estrutura do projeto:
Fazer logon em aio
aio login
Etapa 2: inicializar um novo projeto do App Builder
aio app init slack-webhook-proxy
-
Selecione sua organização e pressione Enter
-
Selecione o Projeto criado na etapa anterior (por exemplo,
Slack webhook integration) e pressione Enter -
Selecione a opção Somente Modelos com Suporte em Minha Organização
-
Ignorar a seção de exemplo pressionando Enter
-
Quando solicitado, verifique se os seguintes componentes estão selecionados (o círculo deve ser preenchido) e pressione Enter:
- Ações: implantar ações de Tempo de Execução
- Eventos: Publicar no Adobe I/O Events
- Web Assets: implantar em ativos estáticos hospedados
-
Com as setas para cima e para baixo, navegue pela lista de entrada e escolha Adobe Experience Platform: Perfil do Cliente em Tempo Real e pressione Enter
-
As ações genéricas são geradas automaticamente
-
Escolha o Pure HTML/JS para a interface e pressione Enter
-
Mantenha genérico como a ação de exemplo para mostrar como acessar um nome de API externa e pressione Enter
-
Mantenha o publish-events como o nome de ação de exemplo para criar mensagens no formato de eventos na nuvem e pressione Enter
A inicialização do aplicativo deve ser concluída.
Navegue até o diretório do projeto
cd slack-webhook-proxy
Adicionar a ação da Web
aio app add action
- Escolha Somente Modelos Com Suporte em Minha Organização e pressione Enter
- Veja a ação publish-events na tabela apresentada; pressione Espaço para selecionar a ação. Se o círculo ao lado do nome for preenchido conforme mostrado no tutorial em vídeo, pressione Enter
- Nomear a ação
webhook-proxy
Etapa 3: atualizar o código de ação de proxy
Em um editor de texto ou IDE, crie/modifique o arquivo actions/webhook-proxy/index.js com o seguinte código. Essa implementação encaminha eventos para o Slack. A verificação de assinatura e o tratamento de desafio são automáticos ao usar o registro de Ação em tempo de execução.
const fetch = require("node-fetch");
const { Core } = require("@adobe/aio-sdk");
/**
* Adobe I/O Events to Slack Runtime Proxy
*
* Receives events from Adobe I/O Events and forwards them to Slack.
* Signature verification and challenge handling are automatic when
* using Runtime Action registration (non-web action).
*/
async function main(params) {
const logger = Core.Logger("webhook-proxy", { level: params.LOG_LEVEL || "info" });
try {
logger.info(`Event received: ${JSON.stringify(params)}`);
// Forward to Slack
return forwardToSlack(params, params.SLACK_WEBHOOK_URL, logger);
} catch (error) {
logger.error(`Error: ${error.message}`);
return { statusCode: 500, body: { error: "Internal server error" } };
}
}
/**
* Forwards the event payload to Slack
*/
async function forwardToSlack(payload, webhookUrl, logger) {
if (!webhookUrl) {
logger.error("SLACK_WEBHOOK_URL not configured");
return { statusCode: 500, body: { error: "Server configuration error" } };
}
// Extract Adobe headers passed to runtime action
const headers = {
"x-adobe-event-code": payload["x-adobe-event-code"],
"x-adobe-event-id": payload["x-adobe-event-id"],
"x-adobe-provider": payload["x-adobe-provider"]
};
const slackMessage = buildSlackMessage(payload, headers);
const response = await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(slackMessage)
});
if (!response.ok) {
const errorText = await response.text();
logger.error(`Slack API error: ${response.status} - ${errorText}`);
return { statusCode: response.status, body: { error: errorText } };
}
logger.info("Event forwarded to Slack");
return { statusCode: 200, body: { success: true } };
}
/**
* Builds a Slack Block Kit message from the event payload
*/
function buildSlackMessage(payload, headers) {
// Adobe passes event code as x-adobe-event-code header (available in params for runtime actions)
const eventType = headers["x-adobe-event-code"] ||
payload["x-adobe-event-code"] ||
payload.event_code ||
payload.type ||
payload.event_type ||
"Adobe Event";
const eventId = headers["x-adobe-event-id"] || payload["x-adobe-event-id"] || payload.event_id || payload.id || "N/A";
const eventData = payload.data || payload.event || payload;
return {
blocks: [
{
type: "header",
text: { type: "plain_text", text: `Event: ${eventType}`, emoji: true }
},
{
type: "section",
fields: formatDataFields(eventData)
},
{ type: "divider" },
{
type: "context",
elements: [{
type: "mrkdwn",
text: `*Event ID:* ${eventId} | *Time:* ${new Date().toISOString()}`
}]
}
]
};
}
/**
* Formats event data as Slack mrkdwn fields
*/
function formatDataFields(data, maxFields = 10) {
if (typeof data !== "object" || data === null) {
return [{ type: "mrkdwn", text: `*Payload:*\n${String(data)}` }];
}
const entries = Object.entries(data);
if (entries.length === 0) {
return [{ type: "mrkdwn", text: "_No data provided_" }];
}
return entries.slice(0, maxFields).map(([key, value]) => ({
type: "mrkdwn",
text: `*${key}:*\n${typeof value === "object" ? `\`\`\`${JSON.stringify(value)}\`\`\`` : value}`
}));
}
exports.main = main;
Etapa 4: configurar a ação
A configuração da ação em app.config.yaml é crítica. Usar web: não para criar uma ação que não seja da Web que possa ser registrada como uma Ação em tempo de execução no Developer Console.
application:
runtimeManifest:
packages:
slack-webhook-proxy:
license: Apache-2.0
actions:
webhook-proxy:
function: actions/webhook-proxy/index.js
web: no
runtime: nodejs:22
inputs:
LOG_LEVEL: info
SLACK_WEBHOOK_URL: $SLACK_WEBHOOK_URL
annotations:
require-adobe-auth: false
final: true
Por que web: no?
Ao usar uma ação que não seja da Web e registrá-la por meio da opção "Ação em tempo de execução" no Developer Console, o Adobe I/O Events automaticamente:
- Lida com verificação de desafio (tanto
GETquantoPOST) - Verifica assinaturas digitais antes de invocar sua ação
- Encadeia uma ação de validador de assinatura na frente da sua ação
Isso significa que seu código só precisa lidar com a lógica de negócios (encaminhamento para o Slack).
Etapa 4: atualizar as variáveis de ambiente
Para gerenciar credenciais com segurança, usamos variáveis de ambiente. Crie/modifique o arquivo .env na raiz do seu projeto para adicionar a URL do webhook do Slack. Certifique-se de mostrar os arquivos ocultos no sistema se você não visualizar o arquivo .env:
# ... other .env file content ...
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL
Etapa 5: implantar a ação
Depois que as variáveis de ambiente forem definidas, implante a ação. Certifique-se de estar na raiz do seu projeto, ou seja, slack-webhook-proxy, ao executar este comando no terminal.
aio app deploy
Sua ação é implantada no Adobe I/O Runtime e está disponível na Developer Console para registro.
Etapa 6: registrar a ação no Adobe Developer Console
Agora que sua ação foi implantada, registre-a como destino para Eventos da Adobe.
-
Navegue até o Adobe Developer Console e abra o projeto do App Builder.
-
Escolha seu Workspace
-
Selecione Adicionar Serviço e Evento.
-
Selecione Adobe Experience Platform como o produto.
-
Selecione Notificações da plataforma como o tipo de evento.
-
Selecione os eventos específicos (ou todos) que você deseja ser notificado no Slack e selecione Próximo.
-
Selecione ou crie sua credencial do OAuth.
-
Configurar detalhes do registro de eventos:
- Nome do Registro: dê um nome descritivo a seu registro.
- Descrição do registro: verifique se isso é explícito para que outros colaboradores possam saber o que ele faz.
- Selecionar Próximo
- Método de Entrega: Selecionar Ação em Tempo de Execução (não "Webhook").
- Ação em tempo de execução: escolha
webhook-proxyna lista suspensa (atualize a página caso não a veja).
-
Selecione Salvar Eventos Configurados.
Etapa 7: validar com um evento de amostra
Você pode testar todo o fluxo de ponta a ponta clicando no ícone 'Enviar evento de amostra' ao lado de qualquer evento configurado.
O evento de amostra é enviado no canal que você configurou ao criar seu aplicativo Slack e o webhook; Você deve ver algo semelhante ao seguinte:
Parabéns, você integrou o Slack com êxito aos eventos do Experience Platform!
Problemas comuns
Estes são alguns problemas que você pode ter ao configurar o proxy e algumas maneiras potenciais de resolvê-los.
- Não é possível ver organizações IMS: se você não vir sua lista de organizações IMS ao executar
aio app init, tente o seguinte. Execute oaio logoutno Terminal, faça logoff do Experience Cloud no navegador da Web padrão e execute oaio loginnovamente. - Ação não exibida na lista suspensa: verifique se
web: noestá definido emapp.config.yaml. Somente ações que não sejam da Web aparecem na lista suspensa Ação em tempo de execução. Atualize a página do Developer Console após a implantação. - Falha na verificação da assinatura: se você vir isso nos logs de ativação, significa que o validador interno do Adobe rejeitou a solicitação. Isso não deve acontecer com eventos legítimos do Adobe. Verifique se o registro de evento está configurado corretamente.
- O Slack não está recebendo mensagens: verifique se
SLACK_WEBHOOK_URLestá definido corretamente no arquivo.enve se o Webhook de Entrada está habilitado no aplicativo Slack. - Tempo limite da ação: as ações de tempo de execução têm um tempo limite de 60 segundos. Se a ação demorar mais, considere usar a abordagem de registro em diário.