В основном вам нужно преодолеть 2 препятствия: 1) локальное хранилище на Lambda составляет всего 512 МБ и 2) Lambda имеет ограничение времени выполнения 15 минут (которое вы должны явно настроить в своей функции)
Для решить проблему 1, вы можете использовать S3 Select . Он позволяет выполнять SQL запросов к объектам (файлам CSV и JSON файлам) в S3. Выполните запрос выбора S3 для вашего CSV-файла, и для каждой получаемой вами записи вы можете вставить ее в очередь, а другие работники вставят ее в базу данных. Вы также можете вставить напрямую в свой RDS, но это может быть медленнее.
Вот пример кода:
const AWS = require('aws-sdk');
var fs = require('fs');
const S3 = new AWS.S3();
exports.handler = async (event, context) => {
try {
const query = "SELECT * FROM s3object s WHERE s.id > '0'";
const bucket = 'my-bucket';
const key = 'data.csv';
const params = {
Bucket: bucket,
Key: key,
ExpressionType: 'SQL',
Expression: query,
InputSerialization: { CSV: { FileHeaderInfo: 'USE' } },
OutputSerialization: { CSV: {} }
}
const data = await getDataUsingS3Select(params);
context.succeed(data);
} catch (error) {
context.fail(error);
}
};
const getDataUsingS3Select = async (params) => {
return new Promise((resolve, reject) => {
S3.selectObjectContent(params, (err, data) => {
if (err) { reject(err); }
// This is a stream of events
data.Payload.on('data', (event) => {
// event, there is data inside it
if (event.Records) {
// do what you want with payload: send to a queue or direct to db
console.log('Row:', event.Records.Payload.toString('utf8'));
}
}).on('end', () => {
// we arrive here after processing everything
resolve();
});
});
})
}
Если вы продолжаете превышать 15-минутный лимит, это проблема 2. Сначала добавьте предложение limit
в SQL. Затем вы можете создать файл "контрольной точки" в каталоге /tmp
Lambda. Вы можете сохранить id
последней обработанной вами записи, чтобы при повторном запуске функции Lambda он мог прочитать этот файл, выбрать id
и использовать его в предложении where
вашего запроса, например:
select * from s3object s where s.id > '99' limit 50000