Lambda записывает в DynamoDb при тестовом событии, но не при запуске с CloudFront - PullRequest
0 голосов
/ 27 мая 2020

Я хочу сохранять каждый запрос к моему объекту S3 в DynamoDB. Это мой конвейер.

Я развертываю функцию в Lambda@Edge с viewer-response в качестве триггера и просто чтобы убедиться, что функция работает. Я также вставляю настраиваемый заголовок с обслуживаемым изображением. Заголовок приходит, как и ожидалось, поэтому функция работает.

Когда я тестирую эту функцию через Lambda Console, она вставляет запись в DynamoDB. Проблема в том, что, хотя он возвращает настраиваемый заголовок, он не делает запись в БД, когда я go на URL-адрес CloudFront CDN.

Например, когда я перехожу к https://d******** e.cloudfront.net/test-image.png, он должен -

  1. Подавать соответствующее изображение (Работает правильно)
  2. Иметь настраиваемый заголовок (Работать правильно)
  3. Сохранять запись в 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);
    }
}
...