【问题标题】:AWS Lambda Timeout (NodeJS - when calling Google Calendar API)AWS Lambda 超时(NodeJS - 调用 Google Calendar API 时)
【发布时间】:2017-12-01 22:52:43
【问题描述】:

我从这里获取代码:https://developers.google.com/google-apps/calendar/quickstart/nodejs 并让它在本地工作并返回日历事件的 JSON 对象。

我把它变成了一个名为 GoogleCalendarAPI.js 的模块,并且仍然让它在本地工作。

我尝试了这个 StackOverflow 答案中的方法:How to oAuth Google API from Lambda AWS?。无论我是否使用令牌,我都会得到相同的结果,按照那里的描述进行检索;或者我是否使用 client_secret.json 文件。

exports.getCalendarJSONEvents = 
  function getCalendarJSONEvents(callback) {
    console.log("started getCalendarJSONEvents");
    listEvents(TOKEN, function(jsonResult) {
         console.log("Json Callback Events="); 
         console.log(jsonResult); 
         callback(jsonResult); 
    });
}
 function listEvents(auth, callback) {... etc... 

调用 Lambda 的 index.js 会这样做:

console.log("log: WhenIntent");
var GoogleCalendarAPI = require('./GoogleCalendarAPI.js');
GoogleCalendarAPI.getCalendarJSONEvents(
    function callback(calEvents){
        console.log("WRAPPER: calendarResults=" + 
                     JSON.stringify(calEvents));
        // chunk misc code here 
        this.emit(':tell', speechText); 
 });

我在日志中看到的最后一件事是“日志:WhenIntent”。这是一个 Alexa 应用程序,我正在使用我的用户帐户访问一个公共日历。我不知道之后它在做什么,也不知道如何进一步调试它。我不确定为什么在超时之前我没有看到“started getCalendarJSONEvents”(默认 3 秒,也尝试了 5 秒)。

更新 1:

好的,CloudWatch 日志确实显示“API 返回错误:错误:错误请求”,我认为这是 Lambda 错误,但它来自 listEvents。我添加了下面提到的行,至少现在逻辑回流了,稍后我将解释“错误请求”的原因。

function listEvents(auth, callback) {
  console.log("log: start listEvents"); 
  var calendar = google.calendar('v3');
  console.log("log: listEvents got calendar var"); 
  var jsonOut = "{"; 
  calendar.events.list({
    auth: auth,
    calendarId: 'somename@group.calendar.google.com',
    timeMin: (new Date()).toISOString(),
    maxResults: 10,
    singleEvents: true,
    orderBy: 'startTime'
  }, function(err, response) {
    if (err) {
      // made this error more clear! 
      console.log('The Google Calendar API returned an error: ' + err);
      callback(err);  // added this line 
      return;
    }
    var events = response.items;
    if (events.length == 0) {
      console.log('No upcoming events found.');
    } else {
      console.log('Upcoming 10 events:');
      var jsonLine = ""; 
      for (var i = 0; i < events.length; i++) {
        var event = events[i];
        var start = event.start.dateTime || event.start.date;
        console.log('%s - %s', start, event.summary);
        jsonLine = 
            [{ 'date': event.start.date,
              'summary': event.summary
            }]; 
        console.log("jsonline=")
        jsonOut = jsonOut + JSON.stringify(jsonLine) + ","; 

      }
      jsonOut = jsonOut + "}"; 
    }
    console.log("End of listEvents: jsonOut = " + 
                JSON.stringify(jsonOut)); 
    callback(jsonOut); 
  });

【问题讨论】:

  • 您是否收到类似“在封闭管道上读/写”之类的错误?
  • require('./GoogleCalendarAPI.js') 可能找不到文件并抛出异常。你可以在需要后添加console.log 并尝试吗?您可以在此处添加 AWS Lambda 的日志输出吗?
  • 谢谢,看看我的更新,我想我明白了。当我使用 TOKEN 时,我收到了错误的请求。我必须切换回“client_secret.json”来看看那个会发生什么。
  • 超时现在似乎消失了,即使是另一种方式;仍然无法读取日历,但这是 OAUTH 问题。
  • @nilobarp 与这个问题无关,但是是什么导致了关闭管道错误的读/写?我从似乎正确返回的函数中遇到了这个问题(至少 sam local 显示了 requestID 的报告)

标签: node.js aws-lambda google-calendar-api


【解决方案1】:

如果您的超时错误是 ETIMEDOUT 并且您的 lambda 属于 VPC,请检查 VPC 是否可以连接到互联网。

如果没有

在相关 VPC 中创建子网 创建一个附加子网的 NAT 网关

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 2021-03-02
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多