AWS Шаг Функции: объединить ввод задачи с * частичным * выводом задачи - PullRequest
1 голос
/ 25 февраля 2020

Я работаю над AWS Шаговыми функциями. Я прочитал документацию по InputPath, OutputPath и ResultPath . Моя проблема заключается в том, что я хочу объединить значения из input в лямбда-задачу с частичным выводом из задачи.

Вход в задачу аналогичен ниже. Я хочу продолжить передачу этих значений в последующие задачи.

{
    "previous_task_result": 100,
    "next_task_input": "asdf"
}

Мне бы хотелось, чтобы выходные данные моей лямбда-задачи выглядели так:

{
    "previous_task_result": 100,
    "next_task_input": "asdf",
    "current_task_result": {
        "val1": "ghjk",
        "val2": [0,2,13,100]
    }
}

Спецификация c проблема в том, что необработанный вывод лямбда-задачи выглядит следующим образом. Я забочусь только о Payload узле. Остальные выходные данные являются шаблонными. Я бы предпочел не проходить через пошаговую функцию.

{
  "resourceType": "lambda",
  "resource": "invoke",
  "output": {
    "ExecutedVersion": "$LATEST",
    "Payload": {
        "val1": "ghjk",
        "val2": [0,2,13,100]
    },
    "SdkHttpMetadata": {
      "HttpHeaders": {
        "Connection": "keep-alive",
        "Content-Length": "42",
        "Content-Type": "application/json",
        "Date": "Tue, 25 Feb 2020 14:36:29 GMT",
        "X-Amz-Executed-Version": "$LATEST",
        "x-amzn-Remapped-Content-Length": "0"
      },
      "HttpStatusCode": 200
    },
    "SdkResponseMetadata": {
      "RequestId": "redacted"
    },
    "StatusCode": 200
  }
}

Я понимаю, как использовать ResultPath и OutputPath для объединения входа с выходом или назначения выхода к указанному c узлу, но я не могу найти способ объединения только узла Payload из результата с существующим вводом.

1 Ответ

3 голосов
/ 03 марта 2020

При работе с Lambda Task State существует 3 способа структурирования состояния вашей задачи:

1. Запрос ответа:

Этот метод возвращает полный ответ API, включая поле SdkHttpMetadata. Я подозреваю, что причина возврата полного HTTP-ответа заключается в том, что это единственный способ, которым вы можете вызывать лямбда-функцию асинхронно из пошаговой функции (асинхронные лямбда-вызовы возвращают только код состояния). Пример:

"CallLambda": {
    "Type": "Task",
    "Resource": "arn:aws:states:::lambda:invoke",
    "Parameters": {
        "FunctionName": "MyFunction",
        "InvocationType": "Event|RequestResponse|DryRun"
    },
    "End": true
}

2. Лямбда ARN как ресурс:

Я считаю, что это то, что вы ищете. При указании ARN лямбда-функции в качестве ресурса, пошаговые функции будут синхронно вызывать вашу лямбда-функцию и возвращать только результат из вашей лямбда-функции без метаданных ответа API. В этом случае ваш входной сигнал состояния будет передан в качестве полезной нагрузки для вашей лямбда-функции, или вы можете использовать InputPath / Parameters для фильтрации / изменения данных, отправляемых в качестве полезной нагрузки.

"CallLambda": {
    "Type": "Task",
    "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "ResultPath": "$.current_task_result",
    "End": true
}

Использование ввода, как в вашем примере Вышеуказанная задача выдаст вам следующий вывод:

{
    "previous_task_result": 100,
    "next_task_input": "asdf",
    "current_task_result": {
        <Your Lambda Functions Result>
    }
}

3. .WaitForTaskToken:

Передает токен вашей функции, приостанавливает выполнение до тех пор, пока не будет получен вызов SendTaskSuccess или SendTaskFailed (этот метод возвращает результат / ошибку из SendTaskSuccess или SendTaskFailed без дополнительных HTTP-метаданные).

"CallLambda": {
    "Type": "Task",
    "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken",
    "Parameters": {
        "FunctionName": "MyFunction",
        "Payload":{  
           "token.$":"$$.Task.Token"
        }
    },
    "End": true
}
...