O blog da AWS

Desenvolvimento de um aplicativo Slack serverless usando o AWS Step Functions e o AWS Lambda

Este blog foi escrito por Sam Wilson, arquiteto de software em nuvem e John Lopez, arquiteto de software em nuvem e adaptado por Daniel ABIB, arquiteto de soluções sênior para Entreprise.
  O Slack, como um serviço corporativo de colaboração e comunicação, oferece oportunidades para os criadores melhorarem a eficiência por meio da implementação de aplicativos (apps) do Slack personalizados. Uma dessas oportunidades é expor os recursos existentes da AWS à sua organização sem que seus funcionários precisem do acesso ao AWS Management Console ou à AWS CLI.

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.

Architectural overview

Visão geral da arquitetura

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. O validador de solicitação envia a solicitação para o barramento de eventos de Command no EventBridge.
  7. 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.
  8. 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.
  9. 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 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.

Slack channel details

Detalhes do canal 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:

Slack bot channel details

Detalhes do canal Slack bot

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

  1. Inicie o aplicativo Slack invocando o comando de barra /my-slack-bot.

    Slack invocation

    Inicie um exemplo de invocação do Lambda

  2. No menu de ação do My Slack Bot, escolhaSample Lambda.

    Choosing sample Lambda

    Escolhendo um exemplo Lambda

  3. Insira a entrada do comando, escolha Enviar e observe a resposta (esse valor de entrada se aplica à função Lambda de amostra).

    Sample Lambda submit

    Exemplo de envio do Lambda

    Sample Lambda results

    Exemplo de resultados do Lambda

  4. Inicie o aplicativo Slack invocando o comando de barra /my-slack-bot e selecione Sample State Machine:

    Start sample state machine invocation

    Iniciar a invocação da máquina de estado de exemplo

    Select Sample State Machine

    Selecione a máquina de estado de exemplo

  5. Insira a entrada do comando, escolha Enviar e observe a resposta (esse valor de entrada se aplica à máquina de estado descendente)

    Sample state machine submit

    Envio da máquina de estado de exemplo

    Sample state machine results

    Exemplo de resultados da máquina de estado

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

{:
  "stateMachineArn": "arn:aws:states:us-east-1:827819197510:stateMachine:RequestValidatorB6FDBF18-FACc7f2PzNAv",
  "input": "{\"body\": \"$input.path('$')\", \"headers\": {\"X-Slack-Signature\": \"$input.params().header.get('X-Slack-Signature')\", \"X-Slack-Request-Timestamp\": \"$input.params().header.get('X-Slack-Request-Timestamp')\", \"Content-Type\": \"application/x-www-form-urlencoded\"}}"
}

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:

#set($context.responseOverride.status = 204)
{}

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:

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.

https://www.linkedin.com/in/danielabib/