Lambda 函数 errorMessage": "无法读取未定义的 属性 'bucket'
Lambda function errorMessage": "Cannot read property 'bucket' of undefined
我有一个 lambda 函数,只要有东西保存在我的 s3 存储桶中就会触发,
目的是读取 JSON 文件的元数据并在 dynamoDB 中插入行 table;
例如
培训期从 6 月 1 日开始到 6 月 8 日结束
培训日为周一、周三和周五
因此 lambda 应该插入 4 行(6 月 1 日、3 日、5 日、8 日)
到目前为止只插入了一行然后就出现错误崩溃了
功能触发良好,但有时会出现此错误信息。
{
"errorType": "TypeError",
"errorMessage": "Cannot read property 'bucket' of undefined",
"stack": [
"TypeError: Cannot read property 'bucket' of undefined",
" at Runtime.exports.handler (/var/task/index.js:26:44)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}
这是我的函数
let AWS = require('aws-sdk');
let s3 = new AWS.S3();
let moment = require('moment');
let uuid = require('node-uuid');
let apiSportmTrainingTableName = process.env.API_SPORTM_TRAININGTABLE_NAME
let dynamodb = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event, context) => {
//eslint-disable-line
const Bucket = await event.Records[0].s3.bucket.name;
const Key = await event.Records[0].s3.object.key;
const objectHead = await s3.headObject({Bucket, Key}).promise();
let start = moment(new Date(objectHead.Metadata.trainingstart), "YYYY-MM-DD");
let end = moment(new Date(objectHead.Metadata.trainingend), "YYYY-MM-DD");
let days = JSON.parse("[" + objectHead.Metadata.trainingdays + "]");
try {
for (let m = moment(start); m.diff(end, 'days') <= 0; m.add(1, 'days')) {
for (const e of days) {
if (moment(m).day() === e) {
let params = {
TableName: apiSportmTrainingTableName,
Item: {
"id": uuid.v1(),
"trainingDate": moment(m).format('YYYY-MM-DD'),
"statut": true,
"athleteCategory": objectHead.Metadata.trainingmembercategory,
"trainingTime": objectHead.Metadata.trainingtime
}
};
return await dynamodb.put(params).promise();
}
}
}
} catch (err) {
console.error('Error', err);
return;
}
context.done(null, 'Successfully processed DynamoDB record'); // SUCCESS with message
};
事件记录时看起来像这样
Records: [
{
eventVersion: '2.1',
eventSource: 'aws:s3',
awsRegion: 'us-east-1',
eventTime: '2020-05-29T18:34:53.250Z',
eventName: 'ObjectCreated:Put',
userIdentity: [Object],
requestParameters: [Object],
responseElements: [Object],
s3: [Object]
}
]
}
```
that a part of logs it fails and then works and then it keeps trying and fail
[logs][1]
[1]: https://i.stack.imgur.com/Sj5C7.png
您在将数据插入 DynamoDB 后使用 return
:
return await dynamodb.put(params).promise();
这 returns DynamoDB 操作的结果是 Lambda 函数的结果,它终止了执行。这就解释了为什么只有一条记录被插入到 DynamoDB 中。我会尝试删除 return
并查看是否也消除了错误(我的最佳猜测:返回值以某种方式导致另一次执行,但这次错过了 S3 事件,因此 event.Records[0].s3
将是未定义的)。
我有一个 lambda 函数,只要有东西保存在我的 s3 存储桶中就会触发,
目的是读取 JSON 文件的元数据并在 dynamoDB 中插入行 table;
例如 培训期从 6 月 1 日开始到 6 月 8 日结束 培训日为周一、周三和周五 因此 lambda 应该插入 4 行(6 月 1 日、3 日、5 日、8 日)
到目前为止只插入了一行然后就出现错误崩溃了
功能触发良好,但有时会出现此错误信息。
{
"errorType": "TypeError",
"errorMessage": "Cannot read property 'bucket' of undefined",
"stack": [
"TypeError: Cannot read property 'bucket' of undefined",
" at Runtime.exports.handler (/var/task/index.js:26:44)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}
这是我的函数
let AWS = require('aws-sdk');
let s3 = new AWS.S3();
let moment = require('moment');
let uuid = require('node-uuid');
let apiSportmTrainingTableName = process.env.API_SPORTM_TRAININGTABLE_NAME
let dynamodb = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event, context) => {
//eslint-disable-line
const Bucket = await event.Records[0].s3.bucket.name;
const Key = await event.Records[0].s3.object.key;
const objectHead = await s3.headObject({Bucket, Key}).promise();
let start = moment(new Date(objectHead.Metadata.trainingstart), "YYYY-MM-DD");
let end = moment(new Date(objectHead.Metadata.trainingend), "YYYY-MM-DD");
let days = JSON.parse("[" + objectHead.Metadata.trainingdays + "]");
try {
for (let m = moment(start); m.diff(end, 'days') <= 0; m.add(1, 'days')) {
for (const e of days) {
if (moment(m).day() === e) {
let params = {
TableName: apiSportmTrainingTableName,
Item: {
"id": uuid.v1(),
"trainingDate": moment(m).format('YYYY-MM-DD'),
"statut": true,
"athleteCategory": objectHead.Metadata.trainingmembercategory,
"trainingTime": objectHead.Metadata.trainingtime
}
};
return await dynamodb.put(params).promise();
}
}
}
} catch (err) {
console.error('Error', err);
return;
}
context.done(null, 'Successfully processed DynamoDB record'); // SUCCESS with message
};
事件记录时看起来像这样
Records: [
{
eventVersion: '2.1',
eventSource: 'aws:s3',
awsRegion: 'us-east-1',
eventTime: '2020-05-29T18:34:53.250Z',
eventName: 'ObjectCreated:Put',
userIdentity: [Object],
requestParameters: [Object],
responseElements: [Object],
s3: [Object]
}
]
}
```
that a part of logs it fails and then works and then it keeps trying and fail
[logs][1]
[1]: https://i.stack.imgur.com/Sj5C7.png
您在将数据插入 DynamoDB 后使用 return
:
return await dynamodb.put(params).promise();
这 returns DynamoDB 操作的结果是 Lambda 函数的结果,它终止了执行。这就解释了为什么只有一条记录被插入到 DynamoDB 中。我会尝试删除 return
并查看是否也消除了错误(我的最佳猜测:返回值以某种方式导致另一次执行,但这次错过了 S3 事件,因此 event.Records[0].s3
将是未定义的)。