Я пишу приложение NodeJS на AWS, которое выполняет следующие действия:
- читает XML с удаленного URL
- анализирует данные и сохраняет их в формате JSON на DynamoDB
- загружает 8 изображений в корзину s3
Код работает нормально на моем экземпляре локального узла. Весь процесс обычно занимает менее 3 секунд. Я могу подтвердить это, проверив ведро AWS s3 и DynamoDB.
Однако, когда я упаковал его для запуска Lambda, операция истекла, даже если для тайм-аута было задано 5 минут, и объем памяти был исчерпан. При проверке журнала я заметил, что обещание от axios никогда не возвращалось при работе на Lambda. Может ли кто-нибудь заметить какие-либо проблемы с моим кодом? Спасибо.
К вашему сведению, я новичок в разработке Lambda. Я внедряю свой код в Lambda, добавляя в свой локальный код включающий метод export.handler и упаковывая его с помощью модулей и package.json. Я, конечно, могу использовать некоторые рекомендации по оптимизации этого процесса. Я упоминаю об этом, потому что я не уверен, что это как-то связано с проблемой.
Спасибо.
exports.handler = function(event, context, callback) {
async function main() {
await getData();
updateDB();
updateAssets();
}
let dataStore = {};
let s3Assets = [
'photo1',
'photo2',
'photo3',
'photo4',
'photo5',
'logoLarge',
'logoSmall',
'logoCompany'
];
let s3Status = {};
s3Assets.map( (i) => {
// Initialize the status of all assets with 0 (false)
s3Status[i] = 0;
})
let s3Ready = () => {
let count = 0;
s3Assets.map( (i) => {
count += s3Status[i];
})
console.log(s3Status);
console.log(`Upload Count: ${count}`);
if (count === s3Assets.length) {
console.log(`[SUCCESS] All assets are updated`);
console.log('< END: updateAssets');
}
}
let getData = () => {
... // code omitted
}
let handleAsset = (asset) => {
let src = dataStore[asset];
let destination = dataStore.prefix + asset + '.jpg';
axios({
method:'get',
url: src,
responseType:'stream'
}).then( (response) => {
let body = response.data.pipe(zlib.createGzip());
let fileType = 'multipart/form-data';
let s3Promise = s3.upload({
Bucket: 'someBucket',
Key: destination,
Body: body,
ContentType: fileType,
ContentEncoding: 'gzip'
}).promise();
s3Promise.then( (data) => {
s3Status[asset] = 1;
console.log('\n');
console.log(`[SUCCESS] s3 Upload: ${data.Location}`);
}).then( () => {
s3Ready();
}).catch( (error) => {
console.log(`[ERROR] s3 Upload: ${error}`);
});
}).catch( (error) => {
console.log(`[ERROR] axios: ${error}`);
});
}
let updateAssets = () => {
console.log('> START: updateAssets');
s3Assets.map( (i) => {
handleAsset(i)
});
}
let updateDB = () => {
... // code omitted
}
main();
}