AWS Lambda执行环境中预安装了哪些NPM模块?

时间:2018-11-30 23:55:16

标签: javascript node.js npm aws-lambda aws-sdk

最近,我发现aws-sdk NPM模块已预先安装在AWS Lambda nodejs8.10中。而且我在互联网上找不到任何有关它的信息。

AWS Lambda中还预安装了哪些其他node.js模块?

3 个答案:

答案 0 :(得分:3)

仅预安装了aws-sdk软件包。

其余所有内容都从“ node_modules”目录中加载。

您可以在此处找到有关它的信息:

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html

答案 1 :(得分:1)

我使用了“ https”和“ url”软件包,因此至少已预先安装了这些软件包。有很多标准的node.js模块需要一个本机层。

很明显,AWS模块在其中,用于与AWS服务进行通信。例如,我使用过SQS。

还没有尝试过“ fs”,但是由于它需要一个本机层,因此您可能想要做一些事情(例如,将内容持久保存到/ tmp)。

应该有一个清单。但是我找不到。猜猜您只需要尝试,如果 requires 失败,则需要在node_modules中放置一个模块,然后查看它是否需要依赖项。

答案 2 :(得分:-1)

我找不到正式名单,所以写了一个脚本来创建名单。 当前这些(不包括内置的nodejs模块,当然也可用):

'awslambda',
'aws-sdk',
'base64-js',
'dynamodb-doc',
'ieee754',
'imagemagick',
'isarray',
'jmespath',
'lodash',
'sax',
'uuid',
'xml2js',
'xmlbuilder'

生成此列表的代码:

function flatten(arrayOfArrays) {
    return Array.prototype.concat.apply([], arrayOfArrays)
}

function onlyUnique(value, index, self) {
    return self.indexOf(value) === index;
}

function extPackageNames(node) {
    if (!node.children) return [];
    const arrayOfArrays = node.children.map(c => [c.name].concat(extPackageNames(c)))
    const result = flatten(arrayOfArrays)
    return result
}

exports.handler = async (event) => {
    const rpt = require("read-package-tree")
    const module = require("module")

    const pathArg = process.env.NODE_PATH
    const allPaths = pathArg.split(":")

    // '/var/task' is this package on lambda
    const externalPaths = allPaths.filter(p => p !== "/var/task")

    // read all package data
    const ps = externalPaths.map((path) => rpt(path).catch(err => err))
    const rpts = await Promise.all(ps).catch(err => err)

    // extract the information we need
    const packagesPerPath = rpts.map(extPackageNames)
    const countPerPath = packagesPerPath.map(arr => arr.length)
    const packages = flatten(packagesPerPath)

    // remove duplicates
    const uniquePackages = packages.filter(onlyUnique)

    // remove node.js built-in modules
    const uniqueCustomPackages = uniquePackages.filter(p => !module.builtinModules.includes(p))

    const result = {
        node_path: pathArg,
        paths: externalPaths.map((e, i) => [e, countPerPath[i]]),
        uniqueCustomPackages
    }

    console.log(result)

    const response = {
        statusCode: 200,
        body: JSON.stringify(result)
    };
    return response;
};

要在lambda上运行此文件,您需要将其与包含node_modules的{​​{1}}文件夹一起压缩。