将dynamodb表从另一个帐户跨帐户迁移到我们自己的AWS帐户后,我需要使用nodejs lambda来读取和处理包含json的文本文件。通过创建EMR集群来运行导入作业的源AWS Datapipeline在对象帐户中使用格式为dynamodbtablename/manifest
和的源密钥在源帐户(不是我们的帐户)的S3存储桶中删除了5 MB文件dynamodbtablename/2c561e6c-62ba-4eab-bf21-7f685c7c3129
。清单文件包含以下示例数据:
{"name":"DynamoDB-export","version":3,
"entries": [
{"url":"s3://bucket/dynamodbtablename/2c561e6c-62ba-4eab-bf21-7f685c7c3129","mandatory":true}
]}
我一直在努力阅读清单文件,这是今天的大部分时间。尽管在lambda中没有访问问题,但最初我还是不得不处理在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 / Java的新手
谢谢大家的帮助。
我发现问题是我在异步lambda处理程序中调用的异步函数由于无法访问封闭的异步lambda处理程序的范围的范围问题而无法执行。这是在使用数组映射和forEach函数时发生的。
我求助于使用传统的for循环。
for (let i = 0; i < Records.length; i++) {
const tableName = Records[i].Sns.Message;
console.log(`DAZN tableName: ${tableName}`);
const tableIndex = daznTables.findIndex(t => tableName.includes(t));
const massiveTableItem = massiveTables[tableIndex];
console.log(`massiveTableItem: ${massiveTableItem}`);
const dataBucket = process.env.DATA_BUCKET;
}
由于实际上不需要从.map函数返回任何内容,因此我摆脱了
await Promise.all(completelyProcessedSNSPromises)
.then(console.log)
.catch(console.error);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句