Вариант использования: я хотел бы сопоставить массив SKU в полученном JSON, выполнить запрос GET
с SKU, получить product_id
из этого запроса и заново создать массив, заменив SKU (по порядку) их соответствующими product_id
.
Шаг Функция Шаги:
GET
Запрос -> ??product_id
Пример кода ввода:
{
"data": {
"product": {
"configurable_product_links": [
"SKU1",
"SKU2",
"SKU3",
"SKU4"
]
}
}
}
Пример выходного кода:
{
"data": {
"product": {
"configurable_product_links": [
"product_id_1",
"product_id_2",
"product_id_3",
"product_id_4"
]
}
}
}
Я буду использовать шаблон возврата обратного вызова с пошаговой функцией для постановки запросов в очередь в API, из которого я получаю product_id
s.
Часть, с которой я концептуально борюсь, - это понимание того, как вернуть новый массив обратно в JSON.
Если вы посмотрите на фрагмент "Validate All"
: с помощью ResultPath
.
При отображении через массив в Step Functions он не позволяет получить доступ к информации о предыдущей задаче за пределами карты.
При выполнении запроса GET
требуются учетные данные, и их жесткое кодирование является плохой практикой. Для AWS можно использовать секретный менеджер.
Таким образом, решение этой проблемы было решено с помощью Итерации цикла с использованием Lambda.
Мы посчитаем количество элементов в массиве и пройдем до конца. Это снимает ограничения задачи карты, но при этом выполняет требования.
Зачем вам нужен «доступ к информации о предыдущей задаче»? Состояние Map
будет рассеивать ваши запросы. Он выводит массив результатов, который сохраняет исходный порядок ввода.
Мне нужно получить секреты от Secrets Manager и сделать запрос HTTP
POST
для каждого сопоставленного элемента. Мне нужно было сделать это один раз вверху перед циклом (чтобы быть более эффективным).
Состояние карты может обрабатывать этот вариант использования. В поле ItemProcessor будет указана задача Lambda для выполнения поиска. На выходе будет массив результатов. Массив результатов сохраняет порядок входного массива ItemsPath
.
Хотя итерации Map по умолчанию получают одно входное значение, вы можете передавать произвольные входные данные для каждой итерации. Состояния карты имеют свойство ItemSelector , которое «переопределяет значения элементов входного массива перед их передачей в каждую итерацию состояния карты». У вас есть доступ к $$
объекту контекста и объекту ввода $
.
"ItemSelector": {
"Index.$": "$$.Map.Item.Index",
"Value.$": "$$.Map.Item.Value",
"Secret.$": "$.previousTask.secret",
},
Пробовали ли вы примеры из docs.aws.amazon.com/step-functions/latest/dg/…?