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

Vas*_*iak 7 javascript node.js npm aws-sdk aws-lambda

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

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

And*_*ndy 10

不幸的是,文档似乎对此不太具体,但您可以自己获取它们的 docker 映像并进行 bash 来检查它们:

\n
docker run --rm -it --entrypoint /bin/bash amazon/aws-lambda-nodejs:14\n
Run Code Online (Sandbox Code Playgroud)\n

Dockerfile具有,通过检查该文件ENTRYPOINT ["/lambda-entrypoint.sh"]我能够确定它通过/var/runtime/bootstrap.

\n

/var/runtime/bootstrapNODE_PATH添加可以加载模块的各种目录:

\n
if [ -z "$NODE_PATH" ];\nthen\n  nodejs_mods="/opt/nodejs/node_modules"\n  nodejs14_mods="/opt/nodejs/node14/node_modules"\n  runtime_mods="/var/runtime/node_modules"\n  task="/var/runtime:/var/task"\n  export NODE_PATH="$nodejs14_mods:$nodejs_mods:$runtime_mods:$task"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

/opt/nodejs图像中不存在,而是/var/taskLambda 放置自定义代码的位置。

\n

/var/runtime/node_modules是我们需要检查的唯一目录:

\n
bash-4.2# cd /var/runtime\nbash-4.2# npm ls\n/var/runtime\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\xac aws-sdk@2.1001.0\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 buffer@4.9.2 extraneous\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 events@1.1.1 extraneous\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ieee754@1.1.13 extraneous\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jmespath@0.15.0 extraneous\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 querystring@0.2.0 extraneous\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sax@1.2.1 extraneous\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 url@0.10.3 extraneous\n  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 uuid@3.3.2 extraneous\n  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 xml2js@0.4.19 extraneous\n
Run Code Online (Sandbox Code Playgroud)\n

如您所见,仅aws-sdk是预安装的。但您可以使用此过程来确定他们是否在 Node.js 运行时的未来版本中添加更多预安装的 deps。

\n


Maz*_*516 5

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

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

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

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


spm*_*mdc 5

我找不到官方列表,所以我编写了一个脚本来创建列表。

我在 Lambda 中安装了许多其他库,这些库是(不包括当然也可用的内置 Nodejs 模块):

'aws-sdk',      <-- preinstalled by AWS
'awslambda',
'base64-js',
'dynamodb-doc',
'ieee754',
'imagemagick',
'isarray',
'jmespath',
'lodash',
'sax',
'uuid',
'xml2js',
'xmlbuilder'
Run Code Online (Sandbox Code Playgroud)

生成此列表的代码:

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;
};
Run Code Online (Sandbox Code Playgroud)

要在 lambda 上运行它,您需要将其与node_modules包含read-package-tree.

  • 您已经列出了“aws-sdk”的子依赖项。https://github.com/aws/aws-sdk-js/blob/92bed994acbf1f4a0e1f362227d431354f43a5f8/package.json#L41 依赖或要求这些是危​​险的,因为它们是 `aws-sdk` 库的内部。另外,您列表中的“imagemagick”看起来很可疑,它是一个相当大的库。它可能来自您的 Lambda 层 - https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html,这超出了这个问题的范围。 (3认同)
  • 没有为我预安装“imagemagick”。我使用 Node.js 12.x 创建了一个“从头开始”的 Lambda 函数。运行。添加 `im = require('imagemagick');` 导致函数失败并显示“错误:找不到模块 'imagemagick'”。 (2认同)