lambda内的s3.getObject不返回任何内容

Mar*_*gov 5 lambda amazon-s3 amazon-web-services node.js

我在lambda函数中有以下代码,这是一个Amazon echo技能:

"AMAZON.HelpIntent": function (intent, session, response) {
  var speechOutput ="Start";

  // Try S3
  var s3 = new AWS.S3({httpOptions: { timeout: 2000 }});
  var params = {
    Bucket: 'bucket',
    Key: 'file',
  };

  s3.getObject(params, function (err, data) {
    if (err) {
      // console.log(err, err.stack);
      speechOutput += "inside error";
      speechOutput += "Did not get it!" + err + ":===:" + err.stack;
    }
    else {
      speechOutput += "inside success";
      // console.log(data);
      speechOutput += "Got it! :" + data.Body.toString('ascii');
    }
  });

  speechOutput += " End. ";

  var repromptText = "Help reprompt.";
  response.ask(speechOutput, repromptText);
},
Run Code Online (Sandbox Code Playgroud)

看起来很简单......但是,当技能执行时,响应如下:

    {
          "version": "1.0",
          "response": {
            "outputSpeech": {
              "type": "PlainText",
              "text": "Start End. "
            },
            "shouldEndSession": false,
            "reprompt": {
              "outputSpeech": {
                "type": "PlainText",
                "text": "Help reprompt."
              }
            }
          },
          "sessionAttributes": {}
   }
Run Code Online (Sandbox Code Playgroud)

换句话说,s3.getObject不会抛出任何错误,也不会运行.

lamda函数具有'lambda_basic_execution'角色,在IAM中定义为具有对S3的完全访问权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在S3内部,有一个存储桶(名为"存储桶")和文件(名为"文件").可以从CLI和Web访问文件.存储桶和文件的权限设置为"所有人".

请帮忙.

Mar*_*k B 4

您无需等待 S3 调用完成。代码中的最后 3 行在s3.getObject()调用回调之前执行。尝试通过将最后 3 行移动到回调中来更改代码,如下所示:

"AMAZON.HelpIntent": function (intent, session, response) {
  var speechOutput ="Start";

  // Try S3
  var s3 = new AWS.S3({httpOptions: { timeout: 2000 }});
  var params = {
    Bucket: 'bucket',
    Key: 'file',
  };

  s3.getObject(params, function (err, data) {
    if (err) {
      // console.log(err, err.stack);
      speechOutput += "inside error";
      speechOutput += "Did not get it!" + err + ":===:" + err.stack;
    }
    else {
      speechOutput += "inside success";
      // console.log(data);
      speechOutput += "Got it! :" + data.Body.toString('ascii');
    }


    speechOutput += " End. ";

    var repromptText = "Help reprompt.";
    response.ask(speechOutput, repromptText);
  });
},
Run Code Online (Sandbox Code Playgroud)