为了改善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');
答案 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目录。由相同的后续调用 您的函数实例可以重用这些资源。这样可以节省 执行时间和成本。