Итак, пройдя некоторые разъяснения в разделе комментариев с помощью OP, вот мой ответ (в сочетании с комментарием @ ChrisPollard):
Достижение того, что вы хотите с помощью SQS, невозможно, поскольку каждая партия может содержать толькодо 10 сообщений.Поскольку вам нужно обрабатывать 1000 сообщений одновременно, это определенно не требуется.
@ ChrisPollard предложил создавать новую запись в DynamoDB каждый раз, когда новый файл помещается на S3.Это очень хороший подход.Увеличивайте ключ разделения на 1 каждый раз и запускайте лямбду через DynamoDB Streams .В вашей функции запустите проверку ключа раздела и, если он равен 1000, выполните запрос к таблице DynamoDB, отфильтровав последние 1000 обновленных элементов (вам потребуется глобальный вторичный индекс в поле CreatedAt).Сопоставьте эти элементы (или используйте Projection ), чтобы создать очень минимальный JSON, который содержит только необходимую информацию.Примерно так:
[
{
"key": "my-amazing-key",
"bucket": "my-super-cool-bucket"
},
...
]
JSON, подобный этому, имеет длину всего 87 байтов (если вы уберете квадратные скобки из игры, потому что они не будут повторяться, у вас останется 83 байта).Если вы округлите его до 100 байт, вы все равно сможете успешно отправить его как одно событие в SQS, так как он будет содержать только около 100 КБ данных.
Затем одна Lambda-функция подпишется на вашу очередь SQS и, наконец, наконецобъединить 1 тысячу файлов.
Имейте в виду:
Убедитесь, что вы действительно создали поле createAt в DynamoDB.К тому времени, когда он достигнет одной тысячи, новые элементы могли быть вставлены, так что таким образом вы убедитесь, что читаете 1000 ожидаемых вами элементов.
В проверке Lambda просто запуститеbatchId% 1000 = 0, поэтому вам не нужно ничего удалять, сохраняя операции DynamoDB.
Следите за временем выполнения вашей лямбды.Объединение 1000 файлов за один раз может занять некоторое время, поэтому я бы запустил пару тестов и поставил на них 1 мин.То есть, если это обычно занимает 5 минут, установите время ожидания вашей функции на 6 минут.
Если у вас есть новая информация для обмена, я с удовольствием отредактирую свой ответ.