Как передать машинный ввод и вывод лямбда-функции в состояния карты

#aws-lambda #aws-step-functions #aws-state-machine

Вопрос:

Текущая Настройка:

В настоящее время у меня есть машина состояний пошаговых функций, которая запускает состояние задачи (которое вызывает лямбда-функцию), а затем состояние карты (которое отправляет задание в пакет), определенное следующим образом

Определение государственной машины

(примечание: регион и идентификатор учетной записи были опущены и заменены фиктивной переменной ACCOUNT_INFO )

 {
  "StartAt": "Populate EFS",
  "States": {
    "Populate EFS": {
      "Next": "MapState",
      "Type": "Task",
      "InputPath": "$",
      "ResultPath": "$.populate_efs_result",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:{ACCOUNT_INFO}:function:PopulateEFSLambda",
        "Payload.$": "$"
      }
    },
    "MapState": {
      "Type": "Map",
      "End": true,
      "ResultPath": "$.metadata.run_info",
      "InputPath": "$",
      "Iterator": {
        "StartAt": "TaskState",
        "States": {
          "TaskState": {
            "Type": "Task",
            "End": true,
            "InputPath": "$",
            "ResultPath": null,
            "Resource": "arn:aws:states:::batch:submitJob.sync",
            "Parameters": {
              "JobDefinition": "arn:aws:batch:{ACCOUNT_INFO}:job-definition/BatchJobDefCfn:1",
              "JobName": "test",
              "JobQueue": "arn:aws:batch:{ACCOUNT_INFO}:job-queue/BatchQueue123",
              "ContainerOverrides": {
                "Command": [
                  "sh",
                  "-c",
                  "entrypoint.pl -i /NGS/${sequencer}/${run_id}/ -s ${sample_name}"
                ],
                "Environment": [
                  {
                    "Name": "run_id",
                    "Value.$": "$.run_id"
                  },
                  {
                    "Name": "sample_name",
                    "Value.$": "$.sample_name"
                  },
                  {
                    "Name": "sequencer",
                    "Value.$": "$.sequencer"
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}
 

Ввод конечного автомата

 {
  "metadata": {
    "run_info": [
      {
        "sample_name": "SAMPLE_X",
        "sequencer": "Nextseq"
      },
      {
        "sample_name": "SAMPLE_Y",
        "sequencer": "Nextseq"
      },
      {
        "sample_name": "SAMPLE_Z",
        "sequencer": "Nextseq"
      }
    ]
  }
}
 

Лямбда-выход (сокращен для простоты)

 {"populate_efs_result": {
    "ExecutedVersion": "$LATEST",
    "Payload": "RUN_1"}
 

Ожидаемые Результаты:

Второму шагу ( MapState ) требуется информация с машинного ввода ( sample_name и sequencer ), а также то, что возвращает лямбда-функция в populate_efs_result.Payload ( run_id ), поэтому оба они должны быть включены в объект события для ввода состояния карты. Однако в моих попытках до сих пор входными данными для состояния карты были либо машинный ввод, либо лямбда-вывод, а не оба.

Я попытался изменить параметры InputPath и ItemsPath в определении состояния карты, а также попытался включить следующее в определение состояния карты, но ни один из этих методов не работает: Parameters: {"new_run_id.$": "$.populate_efs_result.Payload"} .

Ответ №1:

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

Другой подход состоял бы в том, чтобы передать входные данные выполнения в эту лямбду, а затем расширить лямбду, чтобы изменить run_info массив для включения необходимых данных. Затем передайте этот измененный массив в состояние карты как InputPath