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á.
Processamento de itens individuais com uma função Lambda em Step Functions
Neste tutorial, você usa o campo ItemBatcher (Mapa) do estado Mapa Distribuído (Mapa distribuído) para processar um lote inteiro de itens dentro de uma função do Lambda. O estado Mapa Distribuído (Mapa distribuído) inicia quatro execuções do fluxo de trabalho secundário. Cada um desses fluxos de trabalho secundários executa um estado Mapa inline. Para cada iteração, o estado Mapa inline invoca uma função do Lambda e passa um só item do lote para a função. A função do Lambda então processa o item e retorna o resultado.
Você vai criar uma máquina de estado que executa a multiplicação em uma matriz de números inteiros. Digamos que a matriz de números inteiros que você fornece como entrada é [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
e o fator de multiplicação é 7
. Então, a matriz resultante formada após a multiplicação desses números inteiros por um fator de sete será [7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
.
Etapa 1: Criar a máquina de estado
Nesta etapa, você cria o protótipo de fluxo de trabalho da máquina de estado que passa um só item de um lote de itens a cada invocação da função do Lambda que você vai criar na Etapa 2.
-
Use a definição a seguir para criar uma máquina de estado usando o console do Step Functions
. Para obter informações sobre como criar uma máquina de estado, consulte Etapa 1: Criar o protótipo do fluxo de trabalho no tutorial Introdução ao uso do estado Mapa Distribuído. Nessa máquina de estado, você define um estado de Mapa distribuído que aceita uma matriz de 10 números inteiros como entrada e passa esses itens de matriz para as execuções do fluxo de trabalho secundário em lotes. Cada execução de fluxo de trabalho secundário recebe um lote de três itens como entrada e executa um estado Mapa inline. Cada iteração do estado Mapa inline invoca uma função do Lambda e passa um só item do lote para a função. Essa função então multiplica o item por um fator de
7
e retorna o resultado.A saída da execução de cada fluxo de trabalho secundário é uma JSON matriz que contém o resultado da multiplicação de cada um dos itens passados.
Importante
Certifique-se de substituir o Amazon Resource Name (ARN) da função Lambda no código a seguir pelo ARN da função que você criará na Etapa 2.
{ "StartAt": "Pass", "States": { "Pass": { "Type": "Pass", "Next": "Map", "Result": { "MyMultiplicationFactor": 7, "MyItems": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } }, "Map": { "Type": "Map", "ItemProcessor": { "ProcessorConfig": { "Mode": "DISTRIBUTED", "ExecutionType": "STANDARD" }, "StartAt": "InnerMap", "States": { "InnerMap": { "Type": "Map", "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE" }, "StartAt": "Lambda Invoke", "States": { "Lambda Invoke": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:
functionName
" }, "Retry": [ { "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ], "End": true } } }, "End": true, "ItemsPath": "$.Items", "ItemSelector": { "MyMultiplicationFactor.$": "$.BatchInput.MyMultiplicationFactor", "MyItem.$": "$$.Map.Item.Value" } } } }, "End": true, "Label": "Map", "MaxConcurrency": 1000, "ItemsPath": "$.MyItems", "ItemBatcher": { "MaxItemsPerBatch": 3, "BatchInput": { "MyMultiplicationFactor.$": "$.MyMultiplicationFactor" } } } } }
Etapa 2: Criar a função do Lambda
Nesta etapa, você vai criar a função do Lambda que processa cada item passado do lote.
Importante
Certifique-se de que sua função Lambda esteja sob a mesma Região da AWS como sua máquina estatal.
Para criar a função do Lambda
-
Use o console Lambda
para criar uma função Python Lambda chamada. ProcessSingleItem
Para obter informações sobre como criar uma função do Lambda, consulte Etapa 4: Configurar a função do Lambda no tutorial Introdução ao uso do estado Mapa Distribuído. -
Copie o código a seguir para a função do Lambda e cole-o na seção Origem do código da função do Lambda.
import json def lambda_handler(event, context): multiplication_factor = event['MyMultiplicationFactor'] item = event['MyItem'] result = multiplication_factor * item return { 'statusCode': 200, 'multiplied': result }
-
Depois de criar sua função Lambda, copie a função ARN exibida no canto superior direito da página. A seguir está um exemploARN, onde
é o nome da função Lambda (nesse caso,nome da função
ProcessSingleItem
):arn:aws:lambda:us-east-1:123456789012:function:
function-name
Você precisará fornecer a função ARN na máquina de estado criada na Etapa 1.
-
Escolha Implantar para implantar essas alterações.
Etapa 3: Executar a máquina de estado
Quando você executa a máquina de estado, o estado Mapa Distribuído inicia quatro execuções secundárias do fluxo de trabalho, em que cada execução processa três itens, enquanto uma execução processa um só item.
O exemplo a seguir mostra os dados passados a uma das invocações de função ProcessSingleItem dentro de uma execução de fluxo de trabalho secundário.
{
"MyMultiplicationFactor": 7,
"MyItem": 1
}
Com essa entrada, o exemplo a seguir mostra a saída que a função do Lambda retorna.
{
"statusCode": 200,
"multiplied": 7
}
O exemplo a seguir mostra a JSON matriz de saída de uma das execuções do fluxo de trabalho secundário.
[
{
"statusCode": 200,
"multiplied": 7
},
{
"statusCode": 200,
"multiplied": 14
},
{
"statusCode": 200,
"multiplied": 21
}
]
A máquina de estado retorna a seguinte saída que contém quatro matrizes para as quatro execuções do fluxo de trabalho secundário. Essas matrizes contêm os resultados da multiplicação dos itens de entrada individuais.
Por fim, a saída da máquina de estado é uma matriz chamada multiplied
que combina todos os resultados de multiplicação retornados para as quatro execuções do fluxo de trabalho secundário.
[
[
{
"statusCode": 200,
"multiplied": 7
},
{
"statusCode": 200,
"multiplied": 14
},
{
"statusCode": 200,
"multiplied": 21
}
],
[
{
"statusCode": 200,
"multiplied": 28
},
{
"statusCode": 200,
"multiplied": 35
},
{
"statusCode": 200,
"multiplied": 42
}
],
[
{
"statusCode": 200,
"multiplied": 49
},
{
"statusCode": 200,
"multiplied": 56
},
{
"statusCode": 200,
"multiplied": 63
}
],
[
{
"statusCode": 200,
"multiplied": 70
}
]
]
Para combinar todos os resultados de multiplicação retornados pelas execuções do fluxo de trabalho secundário em uma só matriz de saída, você pode usar o campo ResultSelector. Defina esse campo dentro do estado Mapa Distribuído (Mapa Distribuído) para encontrar todos os resultados, extrair os resultados individuais e combiná-los em uma só matriz de saída chamada multiplied
.
Para usar o campo ResultSelector
, atualize a definição da máquina de estado como mostra o exemplo a seguir.
{ "StartAt": "Pass", "States": { ... ... "Map": { "Type": "Map", ... ... "ItemBatcher": { "MaxItemsPerBatch": 3, "BatchInput": { "MyMultiplicationFactor.$": "$.MyMultiplicationFactor" } }, "ItemsPath": "$.MyItems", "ResultSelector": { "multiplied.$": "$..multiplied" } } } }
A máquina de estado atualizada retorna uma matriz de saída consolidada, como mostra o exemplo a seguir.
{
"multiplied": [7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
}