O blog da AWS

Implantação incremental de máquinas de estado com versões e aliases no AWS Step Functions

Esta publicação foi escrita por Peter Smith, engenheiro principal do AWS Step Functions

Este blog explica o recurso de novas versões e aliases no AWS Step Functions, permitindo que você execute revisões específicas da máquina de estado (workflow) em vez de sempre usar as mais recentes. Isso permite implantações mais confiáveis que ajudam a controlar os riscos e fornecem visibilidade de exatamente qual versão está sendo executada. Este blog descreve como usar o recurso, com padrões de implantação incremental, como implantações em azul/verde, canário e linear, fornecendo maior garantia de que as atualizações da sua máquina de estado foram suficientemente testadas.

O Step Functions é um serviço de fluxo de trabalho visual de low code (pouco código) para criar aplicativos distribuídos. Os desenvolvedores usam o serviço para automatizar processos comerciais e de TI e orquestrar serviços da AWS com o mínimo de código. Ele usa a Amazon States Language (ASL) para descrever máquinas de estado e você pode modificar sua definição ao longo do tempo. Até agora, quando uma máquina de estado era executada, ela usava a definição de ASL da atualização mais recente. Se a última alteração contivesse defeitos, poderiam ocorrer interrupções. A resolução exigia outra atualização do ASL para corrigir o problema ou uma ação explícita para reverter a máquina de estado para uma definição anterior.

Usando versões e aliases

Cada atualização na definição de ASL de uma máquina de estado agora pode ser versionada, seja por meio do console do Step Functions, do AWS SDK, do AWS CLI, do AWS CloudFormation ou de uma ferramenta similar. Você deve optar por publicar uma nova versão explicitamente, geralmente ao mesmo tempo em que sua definição de ASL é atualizada. Os números de versão são atribuídos automaticamente, começando com a versão 1.

Para controlar qual versão de uma máquina de estado é executada, agora você pode acrescentar um número de versão ao ARN da máquina de estado:

aws stepfunctions start-execution –-state-machine-arn \ 
    arn:aws:states:us-east-1:123456789012:stateMachine:demo:5
Bash

Este exemplo inicia a versão 5 da máquina de estado de demonstração. Mesmo que a máquina de estado já tenha sido atualizada, a qualificação do ARN da máquina de estado garante que a definição da versão 5 seja usada. Agora você pode testar versões mais recentes (como a versão 6) com a certeza de que as execuções da versão 5 continuarão sem interrupção.

Para facilitar o gerenciamento de versões, aliases simbólicos podem ser atribuídos a uma versão específica, mas depois atualizados a qualquer momento para se referir a uma versão diferente. Também é possível que um alias divida as solicitações de execução entre duas versões diferentes. Por exemplo, 90% das execuções usam a versão 5 e 10% usam a versão 6.

Para iniciar a execução de uma máquina de estado usando um alias, agora você pode acrescentar o nome do alias (como prod) ao ARN da máquina de estado:

aws stepfunctions start-execution –-state-machine-arn \ 
    arn:aws:states:us-east-1:123456789012:stateMachine:demo:prod
Bash

Este exemplo executa a versão da máquina de estado à qual o alias prod se refere atualmente. Se o prod dividir as execuções entre duas versões, uma delas será selecionada com base nos pesos atribuídos. Por exemplo, a versão 5 é escolhida 90% das vezes e a versão 6 é escolhida 10% das vezes.

Casos de uso de implantação incremental

O uso de padrões de implantação comuns ajuda a evitar as armadilhas das atualizações tradicionais do tipo “big bang”, como todas as execuções falharem quando um novo software é implantado. Ao usar um alias para fazer a transição gradual das execuções da máquina de estado para a versão recém-publicada (por exemplo, 10% por vez), os bugs recém-introduzidos têm um impacto limitado. Quando houver confiança na nova versão, ela poderá ser usada para toda a carga de trabalho de produção.

Implantações azul/verde

Nessa abordagem, a versão da máquina de estado existente (atualmente usada na produção) é a versão “azul”, enquanto uma máquina de estado recém-implantada é a versão “verde”. Como regra geral, você deve implantar a versão azul na produção e testar a versão verde mais recente em um ambiente separado. Depois que a versão verde for validada, use-a na produção (ela se torna a nova versão azul).

Se a versão 6 causar problemas na produção, reverta o alias “azul” para o valor anterior para que as execuções sejam revertidas para a versão 5.

Essa abordagem fornece um maior grau de garantia de qualidade para máquinas de estado. No entanto, a menos que sua suíte de testes forneça uma representação precisa de sua carga de trabalho de produção, você também deve considerar implantações canárias ou lineares (ou contínuas) para validar com dados reais.

Implantações canárias e lineares

Com implantações canárias, configure o alias prod para dividir o tráfego entre a versão anterior (por exemplo, 95% das solicitações) e a nova versão (5% das solicitações). Se não houver aumento resultante nas falhas, você pode ajustar o alias para direcionar 100% das solicitações para a nova versão. Em caso de falha, reverta o alias para enviar 100% das solicitações para a versão anterior.

Uma implantação linear adota uma abordagem semelhante, mas ajusta incrementalmente os pesos ao longo do tempo até que a nova versão receba 100% das solicitações. Por exemplo, comece com 10%/90%, depois 20%/80%, continuando em intervalos regulares até atingir 100%/0%. Se um número elevado de falhas for detectado, reverta imediatamente para a versão anterior.

Implantação de um aplicativo completo

Outro cenário é quando as máquinas de estado são implantadas como parte de um aplicativo maior, com o código do aplicativo e a máquina de estado sendo atualizados em sincronia. O exemplo a seguir mostra uma implantação azul/verde em que a versão 56 do aplicativo usa a versão 5 da máquina de estado e a versão 64 usa a versão 6.

O aplicativo deve usar a versão correta do ARN ao invocar a máquina de estado. Isso evita mudanças inesperadas de comportamento na versão azul quando a versão verde (ainda a ser testada) é implantada pela primeira vez. Se você usar acidentalmente o ARN não qualificado (sem o número da versão), o aplicativo desatualizado (versão 56) usará incorretamente a definição de máquina de estado mais recente (versão 6) em vez da versão 5 implantada anteriormente.

Casos de uso de observabilidade e auditoria

Um benefício significativo do uso de ARNs de versão é visto ao examinar o histórico de execução, especialmente com execuções de longa duração. As máquinas de estado podem funcionar por até um ano, acessando outros recursos da AWS (como funções do AWS Lambda) durante todo esse período. Para fins de auditoria dos recursos, é importante conhecer a versão de cada máquina de estado em execução. Depois que todas as execuções forem concluídas, você poderá remover os recursos dos quais elas dependem (no exemplo a seguir, a função ProcessInventory Lambda).

Dependendo do seu caso de uso, você pode ter outras necessidades de auditoria ou conformidade em que é importante saber exatamente qual versão da máquina de estado você está executando.

Passo a passo do recurso

Para criar uma nova versão da máquina de estado no console do Step Functions, escolha Publicar versão imediatamente após salvar a definição da máquina de estado. Você será solicitado a inserir uma descrição opcional, como “Implementação inicial”.

Você também pode escolher Publicar versão depois de atualizar uma máquina de estado existente, adicionando uma descrição opcional para as alterações recentes, como “Adicionar lógica de nova tentativa”.

Na página principal de detalhes da máquina de estado, há duas novas guias: Aliases e Versões. A guia Versões mostra uma lista das versões da máquina de estado, suas descrições, quando cada uma foi executada pela última vez e quais aliases se referem a essa versão. Este exemplo mostra várias novas versões.

Para começar a executar uma versão específica, selecione o botão de rádio à esquerda do número da versão e escolha Iniciar execução.

Na página de detalhes da máquina de estado, escolha a guia Execuções para ver as execuções concluídas e em andamento. Colunas adicionais indicam qual versão ou alias iniciou cada execução. Você pode filtrar a lista de execução por versão ou alias para refinar a lista.

Para criar um alias de máquina de estado, retorne à página de detalhes da máquina de estado, selecione a guia Alias e escolha Criar alias. Forneça um nome de alias, uma descrição opcional e uma configuração de roteamento. Para o caso simples, selecione uma única versão para usar (100% das execuções) sempre que uma execução for iniciada usando o alias.

Para criar um alias que direcione o tráfego para duas versões (como visto nos exemplos de implantação incremental), forneça uma configuração de roteamento com dois números de versão diferentes. Especifique a porcentagem das execuções da máquina de estado para cada uma das versões.

Implementação de implantações de CI/CD com o AWS CloudFormation

Para oferecer suporte a implantações incrementais, os novos recursos do AWS CloudFormation são capazes de publicar versões de máquinas de estado, definir aliases e implantar incrementalmente atualizações de máquinas de estado usando uma abordagem azul/verde, canária ou linear.

O exemplo a seguir mostra os recursos AWS: :StepFunctions: :StateMachine, AWS: :StepFunctions: :StateMachineVersion e AWS: :StepFunctions: :StateMachineAlias usados para definir uma máquina de estado, publicar uma única versão e implantar usando o alias prod linearmente.

Description: "Example of Linear Deployment of a State Machine"

Parameters:
  StateMachineBucket:
    Type: "String"
  StateMachineKey:
    Type: "String"
  StateMachineRole:
    Type: "String"

Resources:
  DemoStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      StateMachineName: DemoStateMachine
      DefinitionS3Location:
        Bucket: !Ref StateMachineBucket
        Key: !Ref StateMachineKey
      RoleArn: !Ref StateMachineRole

  DemoStateMachineVersion:
    Type: "AWS::StepFunctions::StateMachineVersion"
    Properties:
      StateMachineArn: !Ref DemoStateMachine
      StateMachineRevisionId: !GetAtt DemoStateMachine.StateMachineRevisionId

  DemoAlias:
    Type: "AWS::StepFunctions::StateMachineAlias"
    Properties:
      Name: prod
      DeploymentPreference:
        StateMachineVersionArn: !Ref DemoStateMachineVersion
        Type: LINEAR
        Interval: 2
        Percentage: 20
        Alarms:
          - !Ref DemoCloudWatchAlarm
YAML

Sempre que você modificar a máquina de estado, atualize o parâmetro stateMachineKey com um novo arquivo com carimbo de data, como state_machine-202305251336.asl.json e reimplante o template do CloudFormation. As execuções dessa máquina de estado fazem a transição linear da versão anterior para a nova versão em um período de dez minutos, usando cinco intervalos iguais de dois minutos cada. Se o alarme especificado do Amazon CloudWatch for acionado, o alias será automaticamente revertido para a versão anterior da máquina de estado.

Além disso, para usuários de ferramentas comuns de CI/CD de terceiros, como Jenkins ou Spinnaker, ou até mesmo seus sistemas personalizados, uma implementação de referência demonstra como implementar implantações incrementais usando o AWS SDK ou o AWS CLI, com reversão automática se um alarme do CloudWatch for acionado.

Preços e disponibilidade

Os clientes podem usar versões e aliases do Step Functions em todas as regiões em que o Step Functions está disponível. As versões e aliases do Step Functions estão incluídos nos preços do Step Functions sem nenhuma taxa adicional.

Conclusão

O novo recurso de versões e aliases do Step Functions permite que você execute revisões específicas da máquina de estado, em vez de sempre usar as mais recentes. Isso permite implantações mais confiáveis que ajudam a controlar os riscos de implantação e também fornecem visibilidade sobre exatamente qual versão foi executada. Depois de atualizar sua definição de máquina de estado, você pode opcionalmente publicar uma versão dessa máquina de estado e, em seguida, executar a versão usando um ARN de máquina de estado versionado.

Da mesma forma, um alias (como test ou prod) pode referenciar versões de máquinas de estado que mudam com o tempo. Por exemplo, iniciar uma execução usando o alias prod garante que você use somente revisões bem testadas da máquina de estado, mesmo que novas revisões não prontas para produção estejam presentes.

Os aliases podem dividir as execuções entre duas versões diferentes, usando pesos percentuais para escolher entre elas. Esse recurso oferece suporte a padrões de implantação incremental, como implantações em azul/verde, canário e linear, cada um fornecendo maior garantia de que as atualizações de sua máquina de estado sejam implantadas com êxito.

Para obter mais recursos de aprendizado sem servidor, visite Serverless Land.

Este blog é uma tradução do blog original em inglês (link aqui).

Biografia do autor

Peter Smith, engenheiro principal do AWS Step Functions


Biografia do tradutor

Daniel Abib é arquiteto de soluções sênior 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/