为什么不能使用Lambda函数将文件上传到s3?

时间:2019-01-23 01:18:39

标签: node.js amazon-web-services amazon-s3 aws-lambda amazon-cloudwatch

我正在创建与API网关绑定的lambda函数,并且我的代码似乎未触发s3.putObject事件。

我可以毫无问题地console.log 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.log('complete:PUT Object',data);
    })
  .catch(err => {
    console.log('failure:PUT Object', err);
  });

 return JSON.stringify(event);

    };

我希望能够进入我的s3存储桶并查看上传的文件。相反,它为空

2 个答案:

答案 0 :(得分:1)

因为您在代码中使用了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.log('complete:', res);
} catch(err) {
  console.log('error:', err);
}

这是一种现代的回调方法,它是一致的(没有混合使用回调和异步函数)。

答案 1 :(得分:0)

在告诉lambda返回结果之前,您不必等待承诺的返回。如果您有大量的链接,则很有希望,但是在这种简单的情况下,回调就足够了。

此外,如果您使用异步,则需要确保运行时为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.log(JSON.stringify(event));

// The below doesn't seem to run or log out
s3.upload(params, options, function(err, data) {
  console.log(err, data);
  if(!err) { 
    callback(null, "All Good");
   }
  else {
    callback(err);
  }
 });
};

更多有关上下文对象的内容。 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html