Iterar um loop com uma função do Lambda no Step Functions
Neste tutorial, você irá implementar um padrão de design que usa uma máquina de estado e uma função de AWS Lambda para iterar um loop um número específico de vezes.
Use esse padrão de design sempre que precisar para controlar o número de loops em uma máquina de estado. Essa implementação pode ajudar você a dividir grandes tarefas ou execuções de longa execução em partes menores. Ela também será útil no encerramento de uma execução após um número específico de eventos. É possível usar uma implementação semelhante para finalizar e reiniciar periodicamente uma execução de longo prazo a fim de evitar exceder as service quotas para o AWS Step Functions, o AWS Lambda ou outros serviços da AWS.
Antes de começar, leia o tutorial do Como criar uma máquina de estado Step Functions que usa Lambda para garantir que você esteja familiarizado com o uso do Lambda e do Step Functions juntos.
Etapa 1: Criar uma função do Lambda para iterar uma contagem
Ao usar uma função do Lambda, você pode controlar o número de iterações de um loop na sua máquina de estado. A função do Lambda a seguir recebe os valores de entrada para count, index e step. Ela retorna esses valores com um index atualizado e um valor booliano chamado continue. A função do Lambda definirá continue como true se index for menor que count.
A seguir, a máquina de estado implementa um estado de Choice que executa certa lógica de aplicação se continue for true, ou é encerrada se for false.
Para criar a função do Lambda
-
Faça login no console do Lambda
e escolha Criar função. -
Na página Create function, selecione Author from scratch.
-
Na seção Informações básicas, configure a função do Lambda da seguinte maneira:
-
Em Function name (Nome da função), insira
Iterator. -
Em Runtime (Tempo de execução), selecione Node.js.
-
Em Alterar a função de execução padrão, escolha Create a new role with basic Lambda permissions (Criar uma função com permissões básicas do Lambda).
-
Escolha a opção Criar função.
-
-
Copie o código a seguir da função do Lambda na Origem do código.
export const handler = function (event, context, callback) { let index = event.iterator.index let step = event.iterator.step let count = event.iterator.count index = index + step callback(null, { index, step, count, continue: index < count }) }Esse código aceita os valores de entrada
count,indexestep. Ele incrementa oindexpelo valor dastepe retorna esses valores e o boolianocontinue. O valor decontinueétrueseindexfor inferior acount. -
Escolha Implantar.
Etapa 2: Testar a função do Lambda
Execute a sua função do Lambda com valores numéricos para vê-la em operação. É possível fornecer valores de entrada para a função do Lambda que imitem uma iteração.
Para testar a função do Lambda
-
Escolha Testar.
-
Na caixa de diálogo Configurar evento de teste, insira
TestIteratorna caixa Nome do evento. -
Substitua os dados de exemplo pelo seguinte:
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }Esses valores imitam o que pode ser proveniente de sua máquina de estado durante uma iteração. A função do Lambda incrementará o índice e exibirá
trueparacontinuequando o índice for menor quecount. Para este teste, o índice já foi incrementado para5. O teste vai incrementarindexpara6e definircontinuecomotrue. -
Escolha Criar.
-
Escolha Testar para testar a função do Lambda.
Os resultados do teste são exibidos na guia Resultados da execução.
-
Escolha a guia Resultados da execução para ver a saída.
{ "index": 6, "step": 1, "count": 10, "continue": true }nota
Se você definir
indexcomo9e testar novamente, oindexserá incrementado para10econtinueseráfalse.
Etapa 3: Criar uma máquina de estado
Antes de sair do console do Lambda...
Copie o ARN da função do Lambda. Cole-o em uma nota. Você precisará dele na próxima etapa.
Depois, você criará uma máquina de estado com os seguintes estados:
-
ConfigureCount: define os valores padrão paracount,indexestep. -
Iterator: faz referência à função do Lambda que você criou anteriormente transmitindo os valores configurados emConfigureCount. -
IsCountReached: um estado de escolha que prossegue com o loop ou até o estadoDone, com base no valor exibido pela funçãoIterator. -
ExampleWork: um stub do trabalho que precisa ser feito. Neste exemplo, o fluxo de trabalho tem um estadoPass, mas, em uma solução real, você provavelmente usariaTask. -
Done: estado final do fluxo de trabalho.
Como criar a máquina de estado no console:
-
Abra o console do Step Functions
e escolha Create a state machine (Criar uma máquina de estado). Importante
A máquina de estado deve estar na mesma conta da AWS que a função do Lambda.
-
Selecione o modelo Em branco.
-
No painel Código, cole o JSON a seguir que define a máquina de estado.
Para obter mais informações sobre a Amazon States Language, consulte Estrutura da máquina de estado.
{ "Comment": "Iterator State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "Done": { "Type": "Pass", "End": true } } }region:123456789012:function:Iterate -
Substitua o campo
Iterator Resourcepelo ARN real da função do LambdaIteratorcriada anteriormente. -
Selecione Configuração e insira um nome para a máquina de estado, como
.IterateCountnota
Os nomes das máquinas de estado, execuções e tarefas de atividade não devem exceder oitenta caracteres. Esses nomes devem ser exclusivos para a conta e a região da AWS e não devem conter nenhum dos seguintes itens:
-
Espaço em branco
-
Caracteres curinga (
? *) -
Caracteres de colchete (
< > { } [ ]) -
Caracteres especiais (
" # % \ ^ | ~ ` $ & , ; : /) -
caracteres de controle (
\\u0000-\\u001fou\\u007f-\\u009f).
O Step Functions aceita nomes de máquina de estado, execuções, atividades e rótulos que contenham caracteres não ASCII. Como esses caracteres não permitem que o Amazon CloudWatch registre dados em log, recomendamos usar somente caracteres ASCII para monitorar as métricas do Step Functions.
-
-
Em Tipo, aceite o valor padrão de Padrão. Em Permissões, escolha Criar perfil.
-
Escolha Criar e confirme as criações de perfil escolhendo Confirmar.
Etapa 4: Iniciar uma nova execução
Assim que criar sua máquina de estado, poderá iniciar uma execução.
-
Na página IterateCount, escolha Iniciar execução.
-
(Opcional) Insira um nome de execução personalizado para substituir o padrão gerado.
Nomes e registro em log não ASCII
O Step Functions aceita nomes de máquina de estado, execuções, atividades e rótulos que contenham caracteres não ASCII. Como esses caracteres não permitem que o Amazon CloudWatch registre dados em log, recomendamos usar somente caracteres ASCII para monitorar as métricas do Step Functions.
-
Escolha Start Execution.
Uma nova execução de sua máquina de estado inicia-se mostrando sua execução em andamento.
A execução é incrementada em etapas, fazendo o acompanhamento da contagem com a função do Lambda. Em cada iteração, ela executa o exemplo mencionado no estado
ExampleWorkem sua máquina de estado.Quando a contagem atingir o número especificado no estado
ConfigureCountem sua máquina de estado, a execução fechará a iteração e será encerrada.