#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