O blog da AWS

Desenvolvendo um aplicativo Slack Serverless usando o AWS Step Functions e o AWS Lambda

Por Sam Wilson, arquiteto de aplicativos em nuvem, e John Lopez, arquiteto de aplicativos em nuvem
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 (add-ons) personalizados do Slack. Uma dessas oportunidades é expor os recursos existentes da AWS à sua organização sem que seus funcionários precisem acessar o AWS Management Console ou o 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 no 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 que 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 móvel usando os aplicativos do Slack. A arquitetura Serverless é ideal para um aplicativo 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. Acesse a documentação para obter mais informações sobre integrações com outros recursos da AWS.

Esta postagem explica a arquitetura de exemplo Serverless e explica como implantar o exemplo em sua conta da AWS. Ele demonstra o 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 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 de bot usados para autenticação.

O AWS Cloud Development Kit (AWS CDK) implanta os recursos da AWS. Este exemplo pode ser conectado a qualquer plataforma de CI/CD existente de sua escolha.

Architectural overviewVisã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 de interface do Slack Block Kit.
  2. O API Gateway faz o proxy da solicitação e transforma a carga em um formato que o fluxo de trabalho do validador de solicitações Step Functions possa aceitar.
  3. O validador de solicitações aciona a função Lambda de autenticação do Slack para verificar se a solicitação é originária da organização configurada do Slack. Essa função do 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 útil 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 de solicitações consulta a tabela de usuários autorizados do DynamoDB com o nome de usuário extraído da carga da solicitação. Se o usuário não existir, a solicitação terminará 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 corresponderem, a solicitação terminará com uma resposta não autorizada.
  6. O validador da solicitação envia a solicitação para o barramento de eventos do Command no EventBridge.
  7. O barramento de eventos de comando usa a propriedade de ação da solicitação para rotear a solicitação para um fluxo de trabalho Step Functions do processador de solicitações.
  8. Cada fluxo de trabalho do processador Step Functions pode criar elementos de interface do Slack Block Kit, enviar atualizações para elementos de interface de usuário existentes ou invocar funções Lambda e fluxos de trabalho do Step Functions existentes.
  9. O aplicativo Slack para desktop ou celular exibe novos elementos de interface do usuário ou apresenta atualizações para 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 deste aplicativo se adapta às 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 à medida que surgem as necessidades do consumidor.

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.

  • A 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 funções Lambda e Step Functions 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 oferecer 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 as credenciais do aplicativo 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 do 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 com o aplicativo Slack para celular ou desktop, incluindo a exibição de uma tela de boas-vindas, a inserção de informações do formulário e o relatório do status do processo. O EventBridge permite que este exemplo roteie solicitações da função de etapa do validador de solicitações usando o barramento de eventos Serverless e dissocie cada ação uma da outra. Configuramos regras para associar um evento a uma função Step Function 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 Visualizar detalhes do canal. O modal exibe seu ID do canal na parte inferior:

Slack bot channel detailsDetalhes do canal do bot Slack

Para saber mais, acesse a página Getting Started with Bolt for JavaScript do Slack.

O documento README do repositório 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 os parâmetros e segredos do AWS Systems Manager

Demonstração do aplicativo Slack

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

    Slack invocation

    Iniciar amostra de invocação do Lambda

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

    Choosing sample Lambda

    Escolhendo a amostra 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

    Amostra de envio do Lambda

    Sample Lambda results

    Exemplos de resultados do Lambda

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

    Start sample state machine invocationInicie a invocação da máquina de estado de amostra

    Select Sample State Machine

    Selecione a máquina de estado da amostra

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

    Sample state machine submit

    Envio da máquina de estado da amostra

     

    Sample state machine resultsResultados da máquina de estado da amostra

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 para 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 transmitidos 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\"}}"
}
JSON

O Slack envia a carga da mensagem em dois formatos diferentes: codificado por 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 aceito pelo Slack.

Aqui está o modelo de mapeamento de respostas necessário para a integração:

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

Conclusão

Neste blog, você aprendeu como permitir que os usuários do Slack da sua organização possam invocar seus recursos atuais 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 os autores

Sam Wilson é Arquiteto de Aplicações na Nuvem
 

 

 

John Lopez é Arquiteto de Aplicações na Nuvem

 

 

 

 

Tradutor

Charleston Telles é Enterprise Solution Architect na AWS, com mais de 20 anos de experiência em projetos e arquiteturas de T.I. de setores como Aviação, Telecom, Banking, Seguradoras e Online Betting. Charleston é Mestre em Arquitetura de Software pela QUT (Queensland University of Technology – Austrália) e Especialista em arquiteturas Serverless. Ele trabalha apoiando clientes corporativos, auxiliando-os em sua jornada para a nuvem.

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