【问题标题】:How to include only one class from aws-sdk in Lambda如何在 Lambda 中仅包含 aws-sdk 中的一个类
【发布时间】:2020-01-15 19:52:41
【问题描述】:

为了改善 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');

【问题讨论】:

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


    【解决方案1】:

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

    适用于 JavaScript 的 AWS 开发工具包使用动态要求来加载服务。换句话说,类是定义的,但是the API data is only loaded when you instantiate a service object,所以在拥有整个包时没有CPU开销。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        这个例子不错,会导致1s左右的冷启动时间

        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 目录。由相同处理的后续调用 您的函数实例可以重用这些资源。这节省了 执行时间和成本。

        【讨论】:

          猜你喜欢
          • 2022-01-15
          • 2020-03-01
          • 2017-05-15
          • 2016-03-12
          • 2017-05-05
          • 2017-01-16
          • 1970-01-01
          • 2017-01-04
          • 2018-03-11
          相关资源
          最近更新 更多