

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Usar uma função do Lambda para prosseguir com uma nova execução no Step Functions
<a name="tutorial-use-lambda-cont-exec"></a>

**dica**  
A abordagem a seguir usa uma função do Lambda para iniciar uma nova execução do fluxo de trabalho. **Recomendamos** usar o estado de tarefa do Step Functions para iniciar novas execuções do fluxo de trabalho. Veja como no seguinte tutorial: ** [Prosseguir com fluxos de trabalho de longa duração usando a API do Step Functions (recomendado)](tutorial-continue-new.md) **.

Você pode criar uma máquina de estado que usa uma função do Lambda para iniciar uma nova execução antes que a execução atual termine. Com essa abordagem para prosseguir com o trabalho em andamento em uma nova execução, é possível dividir trabalhos maiores em fluxos de trabalho menores, ou executar um fluxo de trabalho indefinidamente.

Este tutorial se baseia no conceito de usar uma função do Lambda externa para modificar seu fluxo de trabalho, que foi demonstrado no tutorial [Iterar um loop com uma função do Lambda no Step Functions](tutorial-create-iterate-pattern-section.md). Você usa a mesma função do Lambda (`Iterator`) para iterar um loop por um número de vezes específico. Além disso, você cria outra função do Lambda para iniciar uma nova execução do seu fluxo de trabalho e para diminuir uma contagem cada vez que iniciar uma nova execução. Ao definir o número de execuções na entrada, essa máquina de estado encerra e reinicia uma execução um número de vezes específico.

A máquina de estado que você criará implementa os seguintes estados.


| Estado | Finalidade | 
| --- | --- | 
| `ConfigureCount` |  Um estado `Pass` que configura os valores `count`, `index` e `step` que são usados pela função do Lambda do `Iterator` para percorrer iterações de trabalho.  | 
|  `Iterator`  |  Um estado `Task` que faz referência à função do Lambda do `Iterator`.  | 
| `IsCountReached` | Um estado Choice que usa um valor booliano da função Iterator para decidir se a máquina de estado deve continuar o trabalho de exemplo, ou mover para o estado ShouldRestart. | 
| `ExampleWork` | Um estado Pass que representa o estado Task que deve executar trabalhos em uma implementação real. | 
| `ShouldRestart` | Um estado Choice que usa o valor executionCount para decidir se deve terminar uma execução e iniciar outra, ou simplesmente finaliza.  | 
| `Restart` | Um estado Task que usa uma função do Lambda para iniciar uma nova execução de sua máquina de estado. Como a função Iterator, essa função também diminui uma contagem. O estado Restart passa o valor diminuído da contagem para a entrada da nova execução.  | 

## Pré-requisitos
<a name="tutorial-continue-new-prereq"></a>

Antes de começar, leia o tutorial do [Como criar uma máquina de estado Step Functions que usa Lambda](tutorial-creating-lambda-state-machine.md) 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
<a name="tutorial-continue-new-step-1"></a>

**nota**  
Se tiver concluído o tutorial do [Iterar um loop com uma função do Lambda no Step Functions](tutorial-create-iterate-pattern-section.md), você poderá ignorar esta etapa e usar essa função do Lambda.

Esta seção e o tutorial do [Iterar um loop com uma função do Lambda no Step Functions](tutorial-create-iterate-pattern-section.md) mostra como usar uma função do Lambda para rastrear uma contagem, por exemplo, o número de iterações de um loop em 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 booliano chamado `continue`. A função do Lambda definirá `continue` como `true` se `index` for menor que `count`.

Sua máquina de estado implementa um estado de `Choice` que executa certa lógica de aplicação se `continue` for `true`, ou move-se para `ShouldRestart` se `continue` for `false`.

### Criar a função do Lambda Iterar
<a name="tutorial-continue-new-create-lambda-function"></a>

1. Abra o [console do Lambda](https://console.aws.amazon.com/lambda/home) e escolha **Create function (Criar função)**.

1. Na página **Create function**, selecione **Author from scratch**.

1. Na seção **Informações básicas**, configure a função do Lambda da seguinte maneira:

   1. Em **Function name** (Nome da função), insira `Iterator`.

   1. Em **Runtime**, selecione **Node.js 16.x**.

   1. Mantenha todas as seleções padrão na página e escolha **Criar função**.

      Quando a função do Lambda for criada, anote o respectivo Nome do recurso da Amazon (ARN) que aparece no canto superior direito da página, por exemplo:

      ```
      arn:aws:lambda:region:123456789012:function:Iterator
      ```

1. Copie o código a seguir para a função Lambda na seção **Fonte de código** da ***Iterator***página no console Lambda.

   ```
   exports.handler = function iterator (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`, `index` e `step`. Ele incrementa o `index` pelo valor de `step` e retorna esses valores e o booliano de `continue`. O valor de `continue` é `true` se `index` for inferior a `count`.

1. Escolha **Implantar** para implantar o código.

### Testar a função do Lambda Iterar
<a name="tutorial-continue-new-step-1-test"></a>

Para visualizar a função `Iterate` funcionando, execute-a com valores numéricos. Você pode fornecer valores de entrada para a função do Lambda que imitam uma iteração para verificar o resultado obtido com valores de entrada específicos. 

#### Para testar a função do Lambda
<a name="tutorial-continue-new-test-lambda-function"></a>

1. Na caixa de diálogo **Configure test event**, escolha **Create new test event** e digite `TestIterator` para **Event name**.

1. 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 incrementa o índice e retorna `continue` como `true`. Quando o índice não é menor que `count`, ele retorna `continue` como `false`. Para este teste, o índice já foi incrementado para `5`. Os resultados devem incrementar o `index` para `6` e definir `continue` como `true`.

1. Escolha **Criar**.

1. **Na ***Iterator*** página do console Lambda, verifique se **TestIterator**está listado e escolha Testar.**

   Os resultados do teste são exibidos na parte superior da página. Escolha **Details** e verifique o resultado.

   ```
   {
     "index": 6,
     "step": 1,
     "count": 10,
     "continue": true
   }
   ```
**nota**  
Se você definir `index` como `9` para este teste, o `index` será incrementado para `10` e `continue` será `false`. 

## Etapa 2: Criar uma função do Lambda Reiniciar para iniciar uma nova execução do Step Functions
<a name="tutorial-continue-new-step-3"></a>

1. Abra o [console do Lambda](https://console.aws.amazon.com/lambda/home) e escolha **Create function (Criar função)**.

1. Na página **Create function**, selecione **Author from scratch**.

1. Na seção **Informações básicas**, configure a função do Lambda da seguinte maneira:

   1. Em **Function name** (Nome da função), insira `Restart`.

   1. Em **Runtime**, selecione **Node.js 16.x**.

1. Mantenha todas as seleções padrão na página e escolha **Criar função**.

   Quando a função do Lambda for criada, anote o respectivo Nome do recurso da Amazon (ARN) que aparece no canto superior direito da página, por exemplo:

   ```
   arn:aws:lambda:region:123456789012:function:Iterator
   ```

1. Copie o código a seguir para a função Lambda na seção **Fonte de código** da ***Restart***página no console Lambda.

   O código a seguir diminui uma contagem do número de execuções e inicia uma nova execução de sua máquina de estado, incluindo o valor diminuído.

   ```
   var aws = require('aws-sdk');
   var sfn = new aws.StepFunctions();
   
   exports.restart = function(event, context, callback) {
   
     let StateMachineArn = event.restart.StateMachineArn;
     event.restart.executionCount -= 1;
     event = JSON.stringify(event);
   
     let params = {
         input: event,
         stateMachineArn: StateMachineArn
     };
   
     sfn.startExecution(params, function(err, data) {
         if (err) callback(err);
         else callback(null,event);
     });
   
   }
   ```

1. Escolha **Implantar** para implantar o código.

## Etapa 3: Criar uma máquina de estado
<a name="tutorial-continue-new-step-4"></a>

Agora que você criou suas duas funções do Lambda, crie uma máquina de estado. Nesta máquina de estado, os estados `ShouldRestart` e `Restart` são como você divide seu trabalho em várias execuções.

**Example ShouldRestart Estado de escolha**  
O trecho a seguir mostra o estado `ShouldRestart``Choice`. Esse estado determina se você deve ou não reiniciar a execução.  

```
"ShouldRestart": {
"Type": "Choice",
"Choices": [
  {
    "Variable": "$.restart.executionCount",
    "NumericGreaterThan": 1,
    "Next": "Restart"
  }
],
```

O valor `$.restart.executionCount` é incluído na entrada da execução inicial. Ele é reduzido cada vez que a função `Restart` é chamada e colocado na entrada para cada execução subsequente.

**Example Estado Task de Restart**  
O trecho a seguir mostra o estado `Restart``Task`. Esse estado usa a função do Lambda que você criou anteriormente para reiniciar a execução e para diminuir a contagem para rastrear o número de execuções restantes para iniciar.  

```
"Restart": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:region:123456789012:function:Restart",
  "Next": "Done"
},
```

**Para criar a máquina de estado**

1. Abra o [console do Step Functions](https://console.aws.amazon.com/states/home). No menu, selecione **Máquinas de estado** e, em seguida, selecione **Criar máquina de estado**.
**Importante**  
[Certifique-se de que sua máquina de estado esteja na mesma AWS conta e região das funções Lambda que você criou anteriormente na [Etapa 1 e na Etapa 2](#tutorial-continue-new-step-1).](#tutorial-continue-new-step-3)

1. Selecione **Criar do zero**.

1. Nomeie sua máquina de estado e clique em **Continuar** para editá-la no Workflow Studio.

1. Neste tutorial, você escreverá a definição da [Amazon States Language](concepts-amazon-states-language.md) (ASL) da máquina de estado no [Editor de código](workflow-studio.md#wfs-interface-code-editor). Para isso, clique em **Código**.

1. Remova o código clichê existente e cole o código a seguir. Lembre-se de substituir a ARNs neste código pela ARNs das funções Lambda que você criou.

   ```
   {
       "Comment": "Continue-as-new State Machine Example",
       "StartAt": "ConfigureCount",
       "States": {
           "ConfigureCount": {
               "Type": "Pass",
               "Result": {
                   "count": 100,
                   "index": -1,
                   "step": 1
               },
               "ResultPath": "$.iterator",
               "Next": "Iterator"
           },
           "Iterator": {
               "Type": "Task",
               "Resource": "arn:aws:lambda:region:123456789012:function:Iterator",
               "ResultPath": "$.iterator",
               "Next": "IsCountReached"
           },
           "IsCountReached": {
               "Type": "Choice",
               "Choices": [
                   {
                       "Variable": "$.iterator.continue",
                       "BooleanEquals": true,
                       "Next": "ExampleWork"
                   }
               ],
               "Default": "ShouldRestart"
           },
           "ExampleWork": {
               "Comment": "Your application logic, to run a specific number of times",
               "Type": "Pass",
               "Result": {
                 "success": true
               },
               "ResultPath": "$.result",
               "Next": "Iterator"
           },
           "ShouldRestart": {
             "Type": "Choice",
             "Choices": [
               {
                 "Variable": "$.restart.executionCount",
                 "NumericGreaterThan": 0,
                 "Next": "Restart"
               }
             ],
             "Default": "Done"
           },
           "Restart": {
             "Type": "Task",
             "Resource": "arn:aws:lambda:region:123456789012:function:Restart",
             "Next": "Done"
           },
           "Done": {
               "Type": "Pass",
               "End": true 
           }
       }
   }
   ```

1. Especifique um nome para a máquina de estado. Para fazer isso, escolha o ícone de edição ao lado do nome padrão da máquina de estado de **MyStateMachine**. Em seguida, em **Configuração da máquina de estado**, insira um nome na caixa **Nome da máquina de estado**.

   Para este tutorial, insira o nome **ContinueAsNew**.

1. (Opcional) Em **Configuração da máquina de estado**, especifique outras configurações do fluxo de trabalho, como o tipo de máquina de estado e a função de execução.

   Para este tutorial, mantenha todas as seleções padrão nas **Configurações da máquina de estado**.

   Se você [já criou um perfil do IAM](procedure-create-iam-role.md) com as permissões corretas para a máquina de estado e deseja usá-lo, em **Permissões**, clique em **Escolher um perfil existente** e selecione uma função na lista. Ou selecione **Inserir um ARN de função** e forneça o ARN para esse perfil do IAM.

1. Na caixa de diálogo **Confirmar criação do perfil**, selecione **Confirmar** para continuar.

   Você também pode escolher **Exibir configurações do perfil** para voltar às **Configurações da máquina de estado**.
**nota**  
Se você excluir o perfil do IAM criado pelo Step Functions, não será possível recriá-lo posteriormente. Da mesma forma, se você modificar a função (por exemplo, removendo o Step Functions das entidades principais na política do IAM), o Step Functions não poderá restaurar as configurações originais dela posteriormente. 

1. Salve o Nome do recurso da Amazon (ARN) dessa máquina de estado em um arquivo de texto. Você precisará fornecer o ARN e, ao mesmo tempo, permissão à função do Lambda para iniciar uma nova execução do Step Functions.

## Etapa 4: Atualizar a política do IAM
<a name="tutorial-continue-new-step-2"></a>

Para garantir que a função do Lambda tenha permissões para iniciar uma nova execução do Step Functions, anexe uma política em linha para o perfil do IAM que você usa para sua função do Lambda `Restart`. Para mais informações, consulte [Incorporar políticas em linha](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#embed-inline-policy-console) no *Guia do usuário do IAM*.

**nota**  
Você pode atualizar a linha `Resource` no exemplo anterior para referenciar o ARN de sua máquina de estado `ContinueAsNew`. Isso restringe a política para que ela só possa iniciar uma execução dessa máquina de estado específico.

****  

```
{
 "Version":"2012-10-17",		 	 	 
 "Statement": [
     {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": [
             "states:StartExecution"
         ],
         "Resource": "arn:aws:states:us-east-2:123456789012:stateMachine:ContinueAsNew"
     }
 ]
}
```

## Etapa 5: Executar a máquina de estado
<a name="tutorial-continue-new-step-5"></a>

Para iniciar uma execução, forneça a mesma entrada que inclui o ARN da máquina de estado e um `executionCount` para quantas vezes ela deve iniciar uma nova execução.

1.  Na **ContinueAsNew**página, escolha **Iniciar execução**.

   A caixa de diálogo **Iniciar execução** é exibida.

1. Na caixa de diálogo **Iniciar execução**, faça o seguinte:

   1. (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 impedirão que a Amazon CloudWatch registre dados, recomendamos usar somente caracteres ASCII para que você possa acompanhar as métricas do Step Functions.

   1. Na caixa **Entrada**, insira a seguinte entrada JSON para executar seu fluxo de trabalho.

      ```
      {
        "restart": {
          "StateMachineArn": "arn:aws:states:region:account-id:stateMachine:ContinueAsNew",
          "executionCount": 4
        }
      }
      ```

   1. Atualize o campo `StateMachineArn` com o ARN para sua máquina de estado `ContinueAsNew`.

   1. Selecione **Iniciar execução**.

   1. O console do Step Functions direciona você para uma página em que o título é o ID da execução. Essa página é conhecida como página de *Detalhes da execução*. Nesta página, você pode revisar os resultados da execução à medida que a execução avança ou após a conclusão.

      Para revisar os resultados da execução, escolha estados individuais na **Exibição em gráfico** e, em seguida, escolha as guias individuais no painel [Detalhes da etapa](concepts-view-execution-details.md#exec-details-intf-step-details) para visualizar os detalhes de cada estado, incluindo entrada, saída e definição, respectivamente. Para obter detalhes sobre as informações de execução que você pode visualizar na página *Detalhes da execução*, consulte [Visão geral dos detalhes da execução](concepts-view-execution-details.md#exec-details-interface-overview).

      A **Exibição em gráfico** exibe a primeira das quatro execuções. Antes de concluir, ele passará pelo estado `Restart` e iniciará uma nova execução.  
![\[Diagrama de execução mostrando a primeira execução de quatro.\]](http://docs.aws.amazon.com/pt_br/step-functions/latest/dg/images/execution-test1.png)

      Conforme essa execução é concluída, você poderá ver a próxima execução que estiver em andamento. Selecione o **ContinueAsNew**link na parte superior para ver a lista de execuções. Você deve ver a execução recém-fechada e uma execução contínua que a função do Lambda `Restart` iniciou.

      Quando todas as execuções forem concluídas, você verá quatro execuções bem-sucedidas na lista. A primeira execução iniciada exibe o nome que você escolheu, e as execuções subsequentes têm um nome gerado.  
![\[Captura de tela ilustrativa mostrando que todas as execuções foram concluídas.\]](http://docs.aws.amazon.com/pt_br/step-functions/latest/dg/images/execution-test1-complete.png)