首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在lambda上,无服务器函数总是超时

在lambda上,无服务器函数总是超时
EN

Stack Overflow用户
提问于 2017-04-21 09:19:34
回答 2查看 3.3K关注 0票数 3

我已经编写了一个简单的查询调用,我的hello处理程序是这样的

代码语言:javascript
复制
'use strict';

const pg = require('pg');
const conn = 'pg://postgres:user:pass@rds_host:5432/database_name';

module.exports.hello = (event, context, callback) => {
  const client = new pg.Client(conn);
  client.connect();

  client.query('SELECT column_a FROM table_b', function(err, result) {
    client.end();
    if (err) {
      callback(null, {error: err});
    } else {
      const response = {
        statusCode: 200,
        body: JSON.stringify({
          data: result.rows
        }),
      };

      callback(null, response);
    }
  });

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};

我已经通过手动调用在本地执行了这个脚本

代码语言:javascript
复制
const handler = require('../server/handler');

handler.hello({}, {}, function(err, response) {
  console.log(err, response);
});

和工作,当我调用

代码语言:javascript
复制
$ serverless invoke local -f hello -l

也是有效的,但是调用lambda总是失败,

代码语言:javascript
复制
$ SLS_DEBUG=* serverless invoke -f hello -l 


{
    "errorMessage": "2017-04-21T01:11:19.580Z 697e69bc-262f-11e7-8fee-0331cc761e9a Task timed out after 6.00 seconds"
}
--------------------------------------------------------------------
START RequestId: 697e69bc-262f-11e7-8fee-0331cc761e9a Version: $LATEST
END RequestId: 697e69bc-262f-11e7-8fee-0331cc761e9a
REPORT RequestId: 697e69bc-262f-11e7-8fee-0331cc761e9a  Duration: 6000.71 ms    Billed Duration: 6000 ms        Memory Size: 1024 MB    Max Memory Used: 20 MB  
2017-04-21T01:11:19.580Z 697e69bc-262f-11e7-8fee-0331cc761e9a Task timed out after 6.00 seconds



  Error --------------------------------------------------

     Invoked function failed

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Stack Trace --------------------------------------------

Error: Invoked function failed
    at AwsInvoke.log (/home/rkmax/my-project/node_modules/serverless/lib/plugins/aws/invoke/index.js:122:31)
From previous event:
    at Object.invoke:invoke [as fn] (/home/rkmax/my-project/node_modules/serverless/lib/plugins/aws/invoke/index.js:22:10)
    at BbPromise.reduce (/home/rkmax/my-project/node_modules/serverless/lib/classes/PluginManager.js:210:55)
    at runCallback (timers.js:672:20)
    at tryOnImmediate (timers.js:645:5)
    at processImmediate [as _immediateCallback] (timers.js:617:5)
From previous event:
    at PluginManager.invoke (/home/rkmax/my-project/node_modules/serverless/lib/classes/PluginManager.js:210:22)
    at PluginManager.run (/home/rkmax/my-project/node_modules/serverless/lib/classes/PluginManager.js:225:17)
    at Serverless.run (/home/rkmax/my-project/node_modules/serverless/lib/Serverless.js:97:31)
    at serverless.init.then (/home/rkmax/my-project/node_modules/serverless/bin/serverless:23:50)

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Forums:        forum.serverless.com
     Chat:          gitter.im/serverless/serverless

  Your Environment Information -----------------------------
     OS:                 linux
     Node Version:       7.9.0
     Serverless Version: 1.11.0
EN

回答 2

Stack Overflow用户

发布于 2017-04-21 11:45:30

您的lambda是否与Postgres数据库在同一个VPC和子网中?如果您创建了lambda,并且没有明确声明它属于哪个子网,那么它实际上是“公共的”,这意味着它可以访问互联网资源、DynamoDB、SNS、S3等,但不能与私有RDS实例通信。要将您的lambda添加到数据库所在的VPC,请转到选项卡Configuration->Advanced Settings,并使用显示VPC内已启用流量的规则设置类似以下内容...Advanced Settings with VPC & Subnets & Security Groups configured

票数 2
EN

Stack Overflow用户

发布于 2017-04-21 11:59:03

在lambda的开头添加以下代码行。

代码语言:javascript
复制
exports.handler = function ( event, context, callback ) {
    //Instruct the lambda to exit immediately
    //and not wait for node event loop to be empty.
    context.callbackWaitsForEmptyEventLoop = false;
    /* Your code here */
};

由于某些原因,查询数据库会导致lambda挂起,直到超时。这个设置告诉lambda在你调用回调时停止。

当我们向MySQL查询时,我们遇到了这个问题,在我们得到答案之前,我们不得不升级到亚马逊支持部门。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43532359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档