После перекрестной миграции таблиц динамодаба из другой учетной записи в нашу собственную учетную запись AWS у меня есть требование использовать nodejs лямбду для чтения и обработки текстовых файлов, содержащих json. Источник AWS Datapipeline, который запустил задание импорта путем создания кластера EMR, отбросил 5 МБ файлов в корзину S3 в исходной учетной записи (не в нашей учетной записи) с ключами объектов в формате dynamodbtablename/manifest
и dynamodbtablename/2c561e6c-62ba-4eab-bf21-7f685c7c3129
. Файл манифеста содержит следующие примеры данных:
{"name":"DynamoDB-export","version":3,
"entries": [
{"url":"s3://bucket/dynamodbtablename/2c561e6c-62ba-4eab-bf21-7f685c7c3129","mandatory":true}
]}
Я боролся за чтение файла манифеста большую часть дня. Хотя проблем с доступом в лямбде не возникало, изначально мне приходилось сталкиваться с настройкой политик и разрешений между учетными записями для ресурсов в terraform. Моя проблема сейчас заключается в том, что код, который вызывает s3.getObject
, похоже, не срабатывает.
/* eslint-disable no-console, no-param-reassign */
const AWS = require('aws-sdk');
const massiveTables = [
'dynamodbtablename'
];
function getS3Objects(params) {
let s3 = new AWS.S3({
apiVersion: '2012-10-29'
});
return new Promise((resolve, reject) => {
s3.getObject(params, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
const handler = async ({ Records }) => {
const completelyProcessedSNSPromises = Records.map(async ({ Sns: { Message: tableName } }) => {
console.log(`tableName: ${tableName}`);
let massiveTableItem = tableName.trim();
console.log(`massiveTableItem: ${massiveTableItem}`);
//#1: Validate the the right table names are coming through
if (massiveTables.includes(massiveTableItem)) {
//#2: Use the table name to fetch the right keys from the S3 bucket
let params = {
Bucket: process.env.DATA_BUCKET,
Key: `${massiveTableItem}/manifest`,
ResponseContentType: 'application/json'
};
getS3Objects(params)
.then(result => {
console.log(`result: ${result}`);
})
.catch(error => {
console.log(`error: ${error}`);
});
}
});
await Promise.all(completelyProcessedSNSPromises)
.then(console.log)
.catch(console.error);
};
module.exports.handler = handler;
Это то, что я получаю в журналах Cloudwatch
16:13:25
2020-03-11T16:13:25.271Z 8bd74c44-c9b1-4cd9-a360-251ad4253eae INFO tableName: dynamodbtablename
2020-03-11T16:13:25.271Z 8bd74c44-c9b1-4cd9-a360-251ad4253eae INFO tableName: dynamodbtablename
16:13:25
2020-03-11T16:13:25.271Z 8bd74c44-c9b1-4cd9-a360-251ad4253eae INFO massiveTableItem: dynamodbtablename
2020-03-11T16:13:25.271Z 8bd74c44-c9b1-4cd9-a360-251ad4253eae INFO massiveTableItem: dynamodbtablename
16:13:25
2020-03-11T16:13:25.338Z 8bd74c44-c9b1-4cd9-a360-251ad4253eae INFO [ undefined ]
2020-03-11T16:13:25.338Z 8bd74c44-c9b1-4cd9-a360-251ad4253eae INFO [ undefined ]
Пожалуйста, помогите Я знаю, что я делаю неправильно.
Большое спасибо заранее. PS: я новичок в Nodejs / Javascript