2017-02-25 147 views
0

尝试访问DynamoDB问题时,我正面临其中一个AWS Lambda node.js超时,但症状显示不同,并且我找到的解决方案无法解决此问题。AWS Lambda node.js尝试访问DynamoDB时发生超时

超时设置为5分钟,内存设置为128MB,但不超过30MB的使用量。
的角色IAM策略:

  • AWSLambdaFullAccess
  • AmazonDynamoDBFullAccess
  • AWSLambdaVPCAccessExecutionRole

默认VPC有7个安全组,包括默认安全组:

  • Inbo UND:所有流量,所有协议,所有端口范围,
  • 出站:所有流量,所有协议,所有端口范围,0.0.0.0/0

这里是代码

var aws = require('aws-sdk'); 

exports.handler = function(event, context) { 
    var dynamo = new aws.DynamoDB(); 

    dynamo.listTables(function(err, data) { 
    if (err) { 
     context.fail('Failed miserably:' + err.stack); 
    } else { 
     context.succeed('Function Finished! Data :' + data.TableNames); 
    } 
    }); 
}; 

而且结果:

START RequestId: 5d2a0294-fb6d-11e6-989a-edaa5cb75cba Version: $LATEST 
END RequestId: 5d2a0294-fb6d-11e6-989a-edaa5cb75cba 
REPORT RequestId: 5d2a0294-fb6d-11e6-989a-edaa5cb75cba Duration: 300000.91 ms Billed Duration: 300000 ms Memory Size: 128 MB Max Memory Used: 21 MB 
2017-02-25T15:21:21.778Z 5d2a0294-fb6d-11e6-989a-edaa5cb75cba Task timed out after 300.00 seconds 

解决相关node.js版本问题here不适用于我,并返回"ReferenceError: https is not defined at exports.handler (/var/task/index.js:6:16)"。此外,AWS已弃用0.10版本。
这里是代码与HTTPS参考:

var aws = require('aws-sdk'); 

exports.handler = function(event, context) { 
    var dynamo = new aws.DynamoDB({ 
    httpOptions: { 
    agent: new https.Agent({ 
     rejectUnauthorized: true, 
     secureProtocol: "TLSv1_method", 
     ciphers: "ALL" 
    }) 
    } 
}); 

    dynamo.listTables(function(err, data) { 
    if (err) { 
     context.fail('Failed miserably:' + err.stack); 
    } else { 
     context.succeed('Function Finished! Data :' + data.TableNames); 
    } 
    }); 
}; 

结果

START RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb Version: $LATEST 
2017-02-24T22:27:31.010Z 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb ReferenceError: https is not defined 
    at exports.handler (/var/task/index.js:6:16) 
END RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb 
REPORT RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb Duration: 81.00 ms Billed Duration: 100 ms  Memory Size: 128 MB Max Memory Used: 26 MB 
RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb Process exited before completing request 

设置为5分钟,我不能相信,AWS将不能超时在分配的时间范围内返回表的列表,并且权限问题通常出现在日志中。

感谢您关注此事。

+0

更新:使用“No VPC”允许正确完成,因此它肯定是VPC问题:START RequestId:11930536-fb72-11e6-a386-25115dc82eee版本:$最新的 END RequestId:11930536-fb72-11e6-a386- 25115dc82eee 报告请求ID:11930536-fb72-11e6-a386-25115dc82eee \t时间:978.54毫秒\t标榜时间:1000毫秒\t内存大小:128 MB \t最大内存使用:28 MB \t我怎样才能解决的VPC错误配置? – prg281

+0

很明显,VPC是你真正的问题,但是对于'https没有定义'的问题,你只需要在文件的顶部添加'var https = require('https')'。 – idbehold

+1

您运行此Lambda函数的VPC是否具有NAT网关?您选择的VPC和子网中只有私有IP的实例能否实际路由到互联网? – jarmod

回答

1

我想你的Lambda是在一个私人子网。在这种情况下,默认情况下,您的Lambda将不具有出站Internet访问权限。您需要创建一个NAT网关或NAT实例,以使VPC受保护的资源可以访问外部Internet。从VPC的角度来看,DynamoDB API在Internet之外。

相关问题