Не думаю, что сейчас можно читать напрямую с S3. Есть несколько вещей, которые вы можете попытаться сделать, чтобы обойти это ограничение. Один делает свой собственный итератор и не использует состояние карты. Другой пример:
Пусть лямбда прочитает ваш файл s3 и разделит его на части по индексу или некоторому идентификатору / ключу. Идея этого шага состоит в том, чтобы передать итератору в Map State НАМНОГО меньшую полезную нагрузку. Скажем, ваши данные имеют следующую структуру.
[ { idx: 1, ...more keys }, {idx: 2, ...more keys }, { idx: 3, ...more keys }, ... 4,997 more objects of data ]
Допустим, вы хотите, чтобы ваш итератор обрабатывал 1000 строк одновременно. Вместо этого верните следующие кортежи, представляющие индексы из вашей лямбды: [ [ 0, 999 ], [ 1000, 1999 ], [ 2000, 2999 ], [ 3000, 3999 ], [ 4000, 4999] ]
Состояние вашей карты получит эту новую структуру данных, и каждая итерация будет одним из кортежей. Итерация № 1: [0, 999], Итерация № 2: [1000, 1999] и т. Д. c
Внутри итератора вызовите лямбду, которая использует индексы кортежей для запроса в файл S3. AWS имеет язык запросов к сегментам S3, называемый Amazon S3 Select
: https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-glacier-select-sql-reference-select.html
Вот еще один замечательный ресурс о том, как использовать S3 select и переводить данные в читаемое состояние с помощью узла : https://thetrevorharmon.com/blog/how-to-use-s3-select-to-query-json-in-node-js
Итак, для итерации № 1 мы запрашиваем первые 1000 объектов в нашей структуре данных. Теперь я могу вызывать любую функцию, которая обычно была бы внутри моего итератора.
Что важно в этом подходе, так это то, что inputPath никогда не получает большую структуру данных.