Я создаю лямбда-функцию, которую я привязал к шлюзу API, и мой код, похоже, не запускает событие s3.putObject.
Я могу console.info переменные AWS, s3, params без проблем, но при попытке использовать функцию putObject ничего не срабатывает... кажется, что остальная часть моего кода просто работает.
Кто-нибудь знает, что мне может понадобиться сделать?
Я установил регион на своем экземпляре s3, версию API Вышел из моих переменных Проверены журналы CloudWatch на наличие изменений.
exports.handler = async (event) => {
const AWS = require('aws-sdk');
const s3 = new AWS.S3({region: "us-east-1", apiVersion: '2006-03-01'});
const params = {
Bucket: bucketName,
Key: 'file.txt',
ContentType: 'text/plain',
Body: JSON.stringify(event)};
// The below doesn't seem to run or log out
s3.putObject(params).promise().then(data => {
console.info('complete:PUT Object',data);
})
.catch(err => {
console.info('failure:PUT Object', err);
});
return JSON.stringify(event);
};
Я ожидаю, что смогу зайти в свою корзину s3 и увидеть загруженный файл. Вместо этого он пустой
return JSON.stringify(event);? Если вы собираетесь использовать функцию асинхронного обработчика, разве вам не нужно возвращать обещание? Ваш вызов Lambda завершается до того, как putObject действительно запустится.





Вы не ждете возврата обещания, прежде чем сказать лямбде вернуть результат. Промисы хороши, если у вас куча цепочек, но в этом простом случае обратного звонка должно быть достаточно.
Кроме того, если вы используете асинхронный режим, вам необходимо убедиться, что среда выполнения 8.10 или выше.
exports.handler = async (event, context, callback) => {
const AWS = require('aws-sdk');
const s3 = new AWS.S3({region: "us-east-1", apiVersion: '2006-03-01'});
const params = {
Bucket: bucketName,
Key: 'file.txt',
ContentType: 'text/plain',
Body: JSON.stringify(event)};
console.info(JSON.stringify(event));
// The below doesn't seem to run or log out
s3.upload(params, options, function(err, data) {
console.info(err, data);
if (!err) {
callback(null, "All Good");
}
else {
callback(err);
}
});
};
Еще немного информации об объекте контекста. https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
Поскольку вы используете exports.handler = async (event) в своем коде, вы используете async/await (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function).
Внутри асинхронной функции вы можете использовать синтаксис await, чтобы дать обещание синхронному вызову:
try {
const res = await s3.upload(params, options).promise();
console.info('complete:', res);
} catch(err) {
console.info('error:', err);
}
Это современный подход к обратным вызовам, и он непротиворечив (нет смеси обратных вызовов и асинхронных функций).
Видите ли вы какие-либо ошибки в своих журналах? docs.aws.amazon.com/lambda/latest/dg/…