Orquestrando processos com AWS Step Functions

Olá, pessoal! Tudo bem?

No dia 22 de outubro de 2019, ministrei uma palestra na 15ª edição do AWS Meetup – Porto Alegre (do qual sou coorganizador), que aconteceu na sede da Warren Brasil, onde trabalho. Foi um evento excelente, contando com muito mais pessoas do que havíamos planejado, muita troca de conhecimento e networking.

15º AWS Meetup – Porto Alegre

O assunto que escolhi para falar na palestra foi o AWS Step Functions, e resolvi trazê-lo para o blog, pois gosto muito da ferramenta.

O que é o AWS Step Functions?

Para quem não conhece, o Step Functions é uma ferramenta serverless, lançada no re:invent de 2016, que gerencia workflows através de uma máquina de estados. Ele permite integrar diversos serviços da AWS, bem como executar operações customizadas (veremos depois, com activities), atendendo praticamente qualquer cenário.

Um exemplo

Em sistemas distribuídos, é muito comum precisarmos orquestrar processos complexos que envolvem diversos serviços (síncronos e assíncronos) para atender determinada transação de negócio, ou ainda executar procedimentos na infraestrutura.

Pensando em um cenário, podemos imaginar um processo onde é necessário disponibilizar um banco de dados (RDS) para um ambiente de testes, a partir de um snapshot de um ambiente de produção, parecido com a imagem abaixo.

Cenário – Restore de um banco de dados

Conforme o workflow aumenta, se ele já não nasceu consideravelmente grande, algumas dificuldades começam a ser apresentadas, como:

  • Gerenciamento: Com diversas partes móveis, se torna complexo gerenciar o workflow sem um elemento central que execute esta tarefa;
  • Rastreabilidade: Pelos mesmos motivos do item acima, torna-se difícil rastrear a execução do workflow;
  • Acoplamento: Os elementos possuem certo nível de acoplamento, visto que precisam saber, no mínimo, qual é o próximo passo;
  • Reutilização: Devido ao acoplamento, a reutilização de componentes em outros workflows ou soluções é comprometida.

O propósito do Step Functions é justamente endereçar estes problemas, além de muitos outros. Como uma máquina de estados, ele desacopla a interação entre os serviços, tornando-os totalmente agnósticos ao fluxo. Ao entrar em um estado (como o State 1, abaixo), a ferramenta se responsabiliza por invocar o serviço, tratando entradas e saídas (que serão enviadas ao próximo estado).

Funcionamento do AWS Step Functions

Um cenário similar ao descrito acima, sobre o restore de um banco de dados, poderia ser construído no Step Functions conforme a imagem que segue.

Workflow Visual

Cada retângulo na imagem, representa um estado na máquina de estados. Como podemos ver, além dos estados que executam alguma operação, temos alguns que fornecem estruturas de controle, para que possamos construir o workflow de forma bastante flexível.

Configuração

A configuração de um workflow é bem simples, sendo construída através da linguagem Amazon States Language (ASL), que nada mais é do que uma extensão do formato JSON. Exemplo:

{
  "Comment": "Um exemplo simples",
  "StartAt": "Execute Task",
  "States": {
    "Execute Task": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:<REGION>:<ACCOUNT_ID>:function:<FUNCTION>",
      "Next": "Wait for something"
    },
    "Wait for something": {
      "Type": "Wait",
      "Seconds": 10,
      "Next": "Notify"
    },
    "Notify": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sns:publish",
      "Parameters": {
        "Message": "Sucesso!!!",
        "TopicArn": "arn:aws:sns:<REGION>:<ACCOUNT_ID>:<TOPIC>"
      },
      "End": true
    }
  }
}

No primeiro nível de configuração, temos dois atributos obrigatórios. Um deles é a coleção de estados (States), e o outro é a indicação de qual será o estado inicial da máquina de estados (StartAt).

Sobre os estados (States), alguns pontos merecem ser mencionados:

  • O nome do State deve ser único, e será usado para identificá-lo;
  • Cada estado deverá indicar o próximo estado (Next), ou informar que é o último (End);
  • O Type indica o tipo do estado, e a partir daí as configurações internas dele serão diferentes para cada um. Os tipos disponíveis são:

A configuração acima, gera o fluxo abaixo. O processo será executado na seguinte ordem:

  1. Executa a lambda;
  2. Para a execução do fluxo por 10 segundos;
  3. Envia uma notificação para o SNS.
Workflow visual

Sobre activities

Activity é um tipo especial de Task. Para utilizá-la, primeiramente devemos criá-la no Step Functions, e em seguida instalar o Worker em algum dispositivo, que pode ser basicamente qualquer coisa, desde uma EC2, até um dispositivo móvel.

Criação de uma activity

Abaixo um diagrama para mostrar o funcionamento interno, de forma visual. Quem quiser saber mais sobre activities, a AWS fornece uma excelente documentação sobre o assunto, que pode ser acessada clicando aqui.

Funcionamento da Activity

Contexto

Um ponto importante é podermos manipular o contexto durante a execução do workflow, para que possamos manter e compartilhar informações em diversos momentos. No Step Functions, o contexto é mantido através da manipulação de entradas e saídas em cada estado. Para isso, a ASL fornece alguns argumentos específicos:

Fluxo de transferência de informações

Vale salientar que o input de cada estado pode ser obtido utilizando um valor estático (informando diretamente na ASL) ou através do output do estado anterior.

Pricing

O AWS Step Functions possui uma camada gratuita, onde podemos executar até 4000 transições de estado por mês, sem expirar no primeiro ano, ou seja, é perpetuo. Depois disso, será cobrado U$0,025 para cada 1000 transições.

Isso nos dá uma boa margem para testes, e trabalharmos fluxos executados eventualmente, de forma totalmente gratuita.

Conclusão

Como falei anteriormente, o AWS Step Functions facilita muito a criação e o gerenciamento de processos complexos. Inclusive, a AWS vem adicionando novas features constantemente. Só para termos uma ideia do que aconteceu em 2019:

Announcements 2019

Considerando que, em muitos casos, podemos usar sem custo algum, acredito que, para quem tenha um caso para ser validado, vale a pena avaliar a ferramenta.

Um abraço e até a próxima!

Postado em AWS

2 comentários sobre “Orquestrando processos com AWS Step Functions

Deixe uma resposta