我已经使用基于web的编辑器创建了几个Lambda函数。到目前为止一切顺利。现在我想开始用模块扩展这些模块(比如Q表示承诺)。我不知道如何将模块转换为Lambda,以便它们可以被我的函数使用。

我已经读完了这篇文章,但它似乎涉及到设置一个EC2并从那里运行Lambda函数。在创建函数时,有一种机制可以上传压缩文件,但这似乎涉及到发送本地开发的函数。因为我在基于网络的编辑器中工作,这似乎是一个奇怪的工作流程。

我如何简单地部署一些模块在我的Lambda函数中使用?


你不能在不上传.zip文件的情况下加载NPM模块,但实际上你可以将这个过程简化为两个快速命令行。

方法如下:

Put your Lambda function file(s) in a separate directory. This is because you install npm packages locally for Lambda and you want to be able to isolate and test what you will upload to Lambda. Install your NPM packages locally with npm install packageName while you're in your separate Lambda directory you created in step #1. Make sure your function works when running locally: node lambdaFunc.js (you can simply comment out the two export.handler lines in your code to adapt your code to run with Node locally). Go to the Lambda's directory and compress the contents, make sure not to include the directory itself. zip -r lambdaFunc.zip . If you have the aws-cli installed, which I suggest having if you want to make your life easier, you can now enter this command: aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip (no quotes around the lambdaFunc part above in case you wonder as I did) Now you can click test in the Lambda console. I suggest adding a short alias for both of the above commands. Here's what I have in mine for the much longer Lambda update command: alias up="aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip"


为了在Lambda中包含npm模块,需要一个.zip文件。你真的不应该在很多事情上使用Lambda web编辑器——就像任何生产代码一样,你应该在本地开发,提交到git等等。

我的流量:

1)我的Lambda函数通常是大型项目的辅助工具,所以我在其中创建了一个/aws/lambdas目录来容纳它们。

2)每个单独的lambda目录包含一个index.js文件,其中包含函数代码,一个包。Json文件定义依赖项,以及/node_modules子目录。(包。json文件不会被Lambda使用,这只是为了让我们可以在本地运行npm install命令。)

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3)我.gitignore所有node_modules目录和.zip文件,这样从npm安装和压缩生成的文件就不会混乱我们的repo。

. gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4)我在目录中运行npm install来安装模块,并在本地开发/测试功能。

5)我压缩lambda目录,并通过控制台上传它。

(重要:不要使用Mac的“压缩”工具从Finder压缩文件!你必须从命令行中运行zip从根目录-见这里)

zip -r ../yourfilename.zip * 

注意:

如果在Mac上本地安装节点模块,可能会遇到问题,因为一些特定于平台的模块在部署到Lambda基于linux的环境时可能会失败。(参见https://stackoverflow.com/a/29994851/165673)

解决方案是在从AMI启动的EC2实例上编译模块,该AMI与您正在使用的Lambda Node.js运行时相对应(请参阅Lambda运行时列表及其各自的AMI)。


请参见Node.js - AWS Lambda中的AWS Lambda部署包


希望这对你有所帮助,使用无服务器框架你可以做这样的事情:

在无服务器中添加这些东西。yml文件:

    plugins:
      - serverless-webpack
    custom:
      webpackIncludeModules:
        forceInclude:
          - <your package name> (for example: node-fetch)

然后创建你的Lambda函数,通过无服务器部署来部署它,即无服务器中包含的包。Yml会在你身边。

有关无服务器的更多信息:https://serverless.com/framework/docs/providers/aws/guide/quick-start/


现在您可以使用Lambda Layers来处理这些问题。只需添加一个包含您需要的包的层,它就会完美地运行。

关注这篇文章: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e


npm模块必须捆绑在你的nodejs包中,并以zip的形式上传到AWS Lambda Layers,然后你需要如下所示引用你的模块/js,并使用其中的可用方法。 const mymodule = require('/opt/nodejs/MyLogger');


现在在许多ide中,例如:VSC,你可以为AWS安装一个扩展,只需从那里点击上传,而不需要输入所有这些命令+区域。

这里有一个例子:


这是一个古老的问题,但它帮助我找到了一个非常简单的方法,将新的Lambda依赖项添加到Alexa技能中。

就像JohnAllen的回答一样,你需要在你的本地机器上创建一个文件夹,给它起任何你想要的名字(这是任意的):

mkdir lambdaFunc
cd lambdaFunc

进入文件夹后,使用npm安装必要的包。对我来说,我需要解析ISO8601持续时间(我的命令是npm install ISO8601 -duration):

npm install <your-package-here>

安装完成后,从该目录中退出,并压缩它。在Alexa技能开发控制台打开你的Alexa技能,然后选择“Import Code”选项。从这里,你将上传你的.zip文件,并选择所有的代码:

就是这样!然后你可以导入代码,就像我做的那样:

const DateConverter = require('iso8601-duration');

在摆弄了几个小时的包之后,我发现它似乎对在浏览器中运行做了一些假设(即使我告诉它使用engine: node)。

而不是:


esbuild

esbuild更简单,也更快!

只需运行npm add——save-dev esbuild,并将这些脚本添加到你的package.json:

{
  ...
  "scripts": {
    "build": "esbuild --bundle --minify --platform=node --target=node12 --outdir=build main.js",
    "export": "cd build && zip main.js.zip main.js"
  },
  ...
  "devDependencies": {
    "esbuild": "^0.11.19",
    ...
  }
}

这允许我在使用aws-sdk的同时仍然进行树摇和缩小,同时仍然能够安装其他依赖项,如jest和eslint,而不必打包整个node_modules文件夹。

要在CI中构建一个包,只需: NPM ci && NPM运行构建&& NPM运行导出

build/main.js.zip文件将包含您需要的所有内容!


如果需要管理多个AWS资源,使用AWS CDK部署lambda函数可能是一个不错的选择。这是一个部署AWS资源并使用CloudFormation的IaC工具。要设置CDK,请参见开始。

一旦您设置了CDK,您就可以创建一个Function构造,并使用它的lambda.Code.fromAsset来轻松地捆绑源代码,包括node_modules,并将其用作函数的代码。

import * as lambda from "aws-cdk-lib/aws-lambda";
import * as path from "path";

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {

    const lambdaFunc = new lambda.Function(this, "lambdaFunc", {
      code: lambda.Code.fromAsset(path.join(__dirname, "..", "..", "project-containing-node-modules")),
      ...
    });

  }
}

然后使用cdk deploy将其部署到您的AWS帐户。

如果您在多个Lambdas中使用相同的node_modules,并且不想上传重复的依赖项,CDK也支持Lambda层。