O blog da AWS
Desenvolvimento de um aplicativo Slack serverless usando o AWS Step Functions e o AWS Lambda
Por exemplo, um membro da sua equipe de análise de dados precisa acionar um fluxo de trabalho do AWS Step Functions para reprocessar um trabalho de dados em lote. Em vez de conceder ao usuário acesso direto ao fluxo de trabalho do Step Functions no AWS Management Console ou na AWS CLI, você pode fornecer acesso para invocar o fluxo de trabalho de dentro de um canal designado do Slack.
Este blog aborda como a arquitetura serverless permite que os usuários do Slack invoquem recursos da AWS, como funções do AWS Lambda e Step Functions, por meio da interface de usuário do Slack para desktop e da interface do usuário móvel usando o Slack. A arquitetura serverless é ideal para o Slack devido à sua capacidade de escalabilidade. Ele pode processar milhares de solicitações simultâneas para usuários do Slack sem o ônus de gerenciar a sobrecarga operacional.
Este exemplo oferece suporte à integração com outros recursos da AWS por meio do Step Functions. Visite a documentação para obter mais informações sobre integrações com outros recursos da AWS.
Este post detalha a arquitetura de referência serverless e explica como implantar o exemplo em sua conta da AWS. Ele demonstra um exemplo e discute as restrições descobertas durante o desenvolvimento.
Visão geral
O código incluído nesta postagem cria um aplicativo Slack criado com uma variedade de serviços serverless da AWS:
- O Amazon API Gateway recebe todas as solicitações recebidas do Slack. O Step Functions coordena as atividades de solicitação, como validação do usuário, recuperação de configuração, roteamento de solicitações e formatação de respostas.
- Uma função Lambda invoca a funcionalidade de autenticação específica do Slack e envia respostas para a interface do usuário do Slack.
- O Amazon EventBridge serve como uma integração pub-sub entre uma solicitação e o processador de solicitações.
- O Amazon DynamoDB armazena permissões para cada usuário do Slack para garantir que eles tenham acesso somente aos recursos que você designar.
- O AWS Systems Manager armazena o canal específico do Slack em que você usa o aplicativo Slack.
- O AWS Secrets Manager armazena o segredo de assinatura do aplicativo Slack e o token do bot usados para autenticação.
O AWS Cloud Development Kit (AWS CDK) faz o deploy dos recursos da AWS. Este exemplo pode ser conectado a qualquer plataforma de CI/CD existente de sua escolha.
- O usuário do Slack para desktop ou celular inicia as solicitações usando o comando de barra /my-slack-bot ou interagindo com um elemento da interface do usuário do Slack Block Kit.
- O API Gateway envia a solicitação por proxy e transforma a carga (payload) em um formato que o workflow do validador de solicitações Step Functions pode aceitar.
- O validador de solicitações aciona a função Lambda de autenticação do Slack para verificar se a solicitação vem da organização configurada do Slack. Essa função Lambda usa a biblioteca Slack Bolt para TypeScript para realizar a autenticação da solicitação e extrair os detalhes da solicitação em uma carga consistente. Além disso, o Secrets Manager armazena um segredo de assinatura, que a API Slack Bolt usa durante a autenticação.
- O validador da solicitação consulta a tabela de usuários autorizados do DynamoDB com o nome de usuário extraído da carga útil (payload) da solicitação. Se o usuário não existir, a solicitação termina com uma resposta não autorizada.
- O validador da solicitação recupera o ID do canal permitido e o compara com o ID do canal encontrado na solicitação. Se os dois IDs de canal não coincidirem, a solicitação termina com uma resposta não autorizada.
- O validador de solicitação envia a solicitação para o barramento de eventos de Command no EventBridge.
- O barramento de eventos Command usa a propriedade action da solicitação para rotear a solicitação para um fluxo de trabalho (workflow) Step Functions do processador de solicitações.
- Cada fluxo de trabalho (workflow) do Step Functions pode criar elementos de interface do usuário via Slack Block Kit, enviar atualizações para elementos de interface de usuário existentes ou invocar funções Lambda e fluxos de trabalho (workflow) do Step Functions existentes.
- O aplicativo Slack para desktop ou móvel exibe novos elementos da interface do usuário ou apresenta atualizações em uma solicitação existente à medida que ela é processada. Os usuários podem interagir com novos elementos da interface do usuário para promover uma solicitação ou recomeçar com uma solicitação adicional.
Essa arquitetura de aplicativo é escalável para cargas de produção, fornecendo capacidade para processar milhares de usuários simultâneos do Slack (por meio da própria plataforma Slack), ignorando a necessidade de acesso direto ao AWS Management Console. Essa arquitetura facilita a extensibilidade do aplicativo de bate-papo para oferecer suporte a novos comandos conforme as necessidades do consumidor surgirem
Por fim, a arquitetura e a implementação do aplicativo seguem a orientação do AWS Well-Architected para excelência operacional, segurança, confiabilidade e eficiência de desempenho.
- O CDK gerencia a infraestrutura de aplicativos para o Pilar de Excelência Operacional.
- O Secrets Manager e o DynamoDB criptografam dados em repouso para o pilar de segurança.
- Essa arquitetura é dimensionada horizontalmente com as funções Lambda e as funções Step para o pilar de confiabilidade.
- A arquitetura serverless elimina a necessidade de manter servidores físicos para o pilar de eficiência de desempenho.
O Step Functions é adequado para este exemplo porque o serviço oferece suporte a integrações com muitos outros serviços da AWS. O Step Functions permite que esse exemplo orquestre interações com funções do Lambda, tabelas do DynamoDB e barramentos de eventos do EventBridge com o mínimo de código.
Este exemplo aproveita os fluxos de trabalho do Step Functions Express para dar suporte às ações de alto volume e orientadas por eventos geradas pelo aplicativo Slack. O resultado do uso do Express Workflows é um processador de solicitações responsivo e escalável capaz de lidar com dezenas de milhares de solicitações por segundo. Para saber mais, analise as diferenças entre fluxos de trabalho padrão e expressos
O exemplo apresentado usa o AWS Secrets Manager para armazenar e recuperar credenciais de aplicativos com segurança. O AWS Secrets Manager oferece os seguintes benefícios:
- Armazenamento central e seguro de segredos por meio de criptografia em repouso.
- Facilidade de gerenciamento de acesso por meio das políticas de permissões do AWS Identity and Access Management (IAM).
- Suporte de integração pronto para uso com todos os serviços da AWS que compõem a arquitetura
Além disso, este exemplo usa o serviço AWS Systems Manager Parameter Store para manter os dados de configuração do nosso aplicativo para o ID do canal Slack. Entre os benefícios oferecidos pelo AWS System Manager, este exemplo aproveita o armazenamento de dados de configuração criptografados com suporte a versionamento.
Este exemplo apresenta uma variedade de interações para o aplicativo Slack Mobile ou Desktop, incluindo a exibição de uma tela de boas-vindas, a inserção de informações do formulário e a emissão de relatórios sobre o status do processo. O EventBridge permite que esse exemplo roteie solicitações da função de etapa do validador de solicitações usando o barramento de eventos serverless e separe cada ação uma da outra. Configuramos regras para associar um evento a uma função Step do processador de solicitações.
Passo a passo
Como pré-requisitos, você precisa do seguinte:
- AWS CDK versão 2.19.0 ou posterior.
- Node versão 16+.
- Docker-CLI.
- Git.
- Uma conta pessoal ou corporativa do Slack com permissões para criar aplicativos.
- O ID do canal do Slack de um canal em seu espaço de trabalho para integração com o aplicativo Slack.
Para obter o ID do canal, abra o menu de contexto no canal do Slack e selecione Exibir detalhes do canal. O modal exibe seu ID de canal na parte inferior:
Para saber mais, acesse a página de introdução ao Bolt para JavaScript do Slack.
O documento README do repositório do GitHub, intitulado Amazon Interactive Slack App Starter Kit, contém um passo a passo abrangente, incluindo etapas detalhadas para:
- Configuração da API Slack
- Implantação de aplicativos por meio do AWS Cloud Development Kit (CDK)
- Atualizações necessárias para parâmetros e segredos do AWS Systems Manager
Demonstração do aplicativo Slack
- Inicie o aplicativo Slack invocando o comando de barra /my-slack-bot.
- No menu de ação do My Slack Bot, escolhaSample Lambda.
- Insira a entrada do comando, escolha Enviar e observe a resposta (esse valor de entrada se aplica à função Lambda de amostra).
- Inicie o aplicativo Slack invocando o comando de barra /my-slack-bot e selecione Sample State Machine:
- Insira a entrada do comando, escolha Enviar e observe a resposta (esse valor de entrada se aplica à máquina de estado descendente)
Restrições neste exemplo
O Slack tem restrições para enviar e receber solicitações, mas os modelos de mapeamento do API Gateway fornecem mecanismos de integração com uma variedade de restrições de solicitação.
O Slack usa application/x-www-form-urlencoded para enviar solicitações para um URL personalizado. Criamos um modelo de solicitação para formatar a entrada do Slack em um formato consistente para a função de etapa do validador de solicitações.
Cabeçalhos como X-Slack-Signature e X-Slack-Request-Timestamp precisavam ser repassados para garantir que a solicitação do Slack fosse autêntica.
Aqui está o modelo de mapeamento de solicitações necessário para a integração
O Slack envia a carga da mensagem em dois formatos diferentes: codificado em URL e JSON. Felizmente, a biblioteca Slack Bolt para JavaScript pode mesclar os dois formatos de solicitação em uma única carga JSON e lidar com a verificação.
O Slack exige uma resposta de status 204 junto com um corpo vazio para reconhecer que uma solicitação foi bem-sucedida. Um modelo de resposta de integração substitui a resposta da Step Function em um formato que o Slack aceita.
Aqui está o modelo de mapeamento de respostas necessário para a integração:
Conclusão
Neste blog post, você aprendeu como permitir que os usuários do Slack da sua empresa invocem seus recursos existentes da AWS sem acesso ao AWS Management Console ou à AWS CLI. Esse exemplo serverless permite que você crie seus próprios fluxos de trabalho personalizados para atender às necessidades da sua organização.
Para saber mais sobre os conceitos discutidos neste blog, visite:
- Biblioteca Node.js do AWS Lambda
- Usando o TypeScript — Slack Bolt para JavaScript
- Biblioteca de construção do AWS Secrets Manager
- Usando o AWS Step Functions com outros serviços
Para obter mais recursos de aprendizado serverless, visite Serverless Land
Este artigo foi traduzido do Blog da AWS em Inglês.
Sobre o autor
Sam Wilson
Daniel Abib é Enterprise Solution Architect na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.