如何在Lambda中只包含一个来自aws-sdk的类

时间:2016-05-16 21:13:03

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

为了改善AWS Lambda中的冷启动延迟,我试图只为每个Lambda函数包含必要的类。而不是包括整个SDK,我如何只包括SDK的DynamoDB部分?

// Current method:
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB();

// Desired method:
var AWSdynamodb = require('aws-dynamodb-sdk');

3 个答案:

答案 0 :(得分:6)

简短的回答是:你不需要这样做。

AWS SDK for JavaScript使用动态需求来加载服务。换句话说,这些类是定义的,但the API data is only loaded when you instantiate a service object,所以整个包都没有CPU开销。

唯一可能的成本来自磁盘空间使用(和下载时间),但请注意Lambda已经将aws-sdk软件包捆绑在一起,因此没有下载时间,而且实际上您使用的更少使用Lambda提供的SDK包而不是使用自定义的东西。

答案 1 :(得分:3)

我不认为这是可能的。 npm注册表只有aws-sdk。 https://www.npmjs.com/package/aws-sdk

可能有其他npm软件包可用于dynamodb,但我建议只使用aws团队提供的sdk。

答案 2 :(得分:1)

请确保在处理程序外部实例化SDK。

这个例子很好,将导致大约1秒的冷启动时间

const AWS = require("aws-sdk");
const SNS = new AWS.SNS({apiVersion: '2010-03-31'});

exports.handler = function(event, context) {
   //do stuff
};

这个例子很糟糕,会导致大约5s的冷启动时间

exports.handler = function(event, context) {
   const AWS = require("aws-sdk");
   const SNS = new AWS.SNS({apiVersion: '2010-03-31'});
   //do stuff
};

https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html

利用执行上下文重用来提高性能 功能。初始化SDK客户端和数据库连接 在函数处理程序之外,并在其中本地缓存静态资产 / tmp目录。由相同的后续调用 您的函数实例可以重用这些资源。这样可以节省 执行时间和成本。