Я хочу сохранять каждый запрос к моему объекту S3 в DynamoDB. Это мой конвейер.
Я развертываю функцию в Lambda@Edge с viewer-response в качестве триггера и просто чтобы убедиться, что функция работает. Я также вставляю настраиваемый заголовок с обслуживаемым изображением. Заголовок приходит, как и ожидалось, поэтому функция работает.
Когда я тестирую эту функцию через Lambda Console, она вставляет запись в DynamoDB. Проблема в том, что, хотя он возвращает настраиваемый заголовок, он не делает запись в БД, когда я go на URL-адрес CloudFront CDN.
Например, когда я перехожу к https://d******** e.cloudfront.net/test-image.png, он должен -
- Подавать соответствующее изображение (Работает правильно)
- Иметь настраиваемый заголовок (Работать правильно)
- Сохранять запись в DynamoDB (Не работает)
Вот код для ссылка. Обратите внимание, что функция сохраняет запись в БД при запуске тестового события в консоли Lambda, и я хочу, чтобы эта функция запускалась каждый раз, когда CDN обслуживает изображение.
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
const shortid = require('shortid');
module.exports.image = async (event, context, callback) => {
const response = event.Records[0].cf.response;
const headers = response.headers;
headers['mycustomheader'] = [{ key: 'My-Custom-Header', value: new Date().getTime().toString() }];
await storeClickEvent(event);
callback(null, response);
};
const storeClickEvent = async (data) => {
const params = {
TableName: 'my-dummy-table-name',
Item: {
event: data,
id: shortid.generate(),
createdAt: new Date().getTime(),
}
};
try {
await dynamoDb.put(params).promise();
} catch (err) {
console.error('Error occurred =>', err);
}
}