让你的 lambda 函数轻量级
我看到很多文章教你如何用简单的步骤创建 Lambda 函数,总是展示“Hello World”示例。但是,每次你在 Lambda 函数中使用依赖项时,它的性能就会开始下降。
因此,本文将向您展示如何使您的 Lambda 函数更轻量级,只包含我们需要执行的函数。
在开始编写代码之前,您需要满足以下条件:
1) 已安装 AWS CLI; 2) 使用.
工具在本地配置 AWS 凭证; 3) 已安装 Node.js(我们将使用 Node.js v12); 4) 已安装 Serverless。aws configurenpm install -g serverless
都配置好了吗?好的!开始写代码吧!🙂
首先,我想向你展示一下这个问题。
创建一个文件夹或一个仓库并克隆它。我这里选择创建了一个仓库并克隆它。
我将使用 npm 安装依赖项,你也可以使用 yarn。
> npm init -y
现在我们将用以下方式创建我们的 lambda 函数:
> sls init aws-node-rest-api
我们将对项目进行一些修改。
它aws-node-rest-api会将其更改为并从我们的根文件夹src复制serveless.ymlsrc
> mv aws-node-rest-api src
> mv src/serveless.yml ./serverless.yml
最后要改变的是 lambda 函数所在的路径。
前
app: aws-node-rest-api
service: aws-node-rest-api
provider:
name: aws
runtime: nodejs12.x
functions:
hello:
handler: handler.hello
events:
- http:
path: /
method: get
后
app: aws-node-rest-api
service: aws-node-rest-api
provider:
name: aws
runtime: nodejs12.x
functions:
hello:
**handler: src/handler.hello**
events:
- http:
path: /
method: get
我高亮显示了 lambda 函数的已更改路径。
就这样,我们开始部署函数吧!
> serverless deploy
过一段时间后,你会看到以下图片。
如果你登录 AWS,就能看到你的新 Lambda 函数了!!耶!!!干得漂亮!!!
如果我们查看 Lambda 函数中部署的内容,就可以看到代码。
现在我们已经精通了 Serverless 和 Lambda 函数,我们想添加一些软件包。
我们的 Lambda 函数不是很简单吗?大多数时候,我们使用软件包来对数据库进行一些调用,调用 AWS 功能,调用 API,操作图像等等。
现在,我们来安装一些软件包。假设我们要处理一些图片,这里我们将使用jimp(这只是个例子。我需要一个比较大型的 npm 包)。
所以,让我们在控制台中输入以下命令
> npm install --save jimp
现在我们再次部署一下,看看情况如何。
> severless deploy
等等!什么?看不到代码?出什么事了?
嗯,通过简单的配置,我们将 node_modules 文件夹上传到我们的 lambda 函数中,而我们刚刚安装的包使得 lambda 函数太大,无法显示代码。
如何避免这种情况并再次看到我的代码?Lambda 层来帮忙!
没错!无服务器架构能够创建 Lambda 层。Lambda 层是一个包含库或其他依赖项的 ZIP 压缩包。有了它,我们就能进一步缩小 Lambda 函数的体积。
我们该如何实现这一点呢?我们将把 node_modules 文件夹放在 Lambda 层中。
为此,我们将对代码进行一些修改。
首先,我们将安装这个软件包。
> npm i --save-dev serverless-hooks-plugin
之后,我们将创建一个部署文件夹,并创建一个脚本,其中包含创建该层所需的所有内容。
> mkdir deployment
> touch deployment/prepare.sh
在prepare.sh文件中,我们将复制以下代码。
echo '****** Starting Pre Deploy Script ******'
echo '1- Creating folder for layers and copy package.json'
rm -rf ./.dist
rm -rf ./.serverless-layers
mkdir -p .serverless-layers/node-layers/nodejs
cp package.json .serverless-layers/node-layers/nodejs/
echo 'DONE!'
echo '2 - Change path to serverless-layer, adding LIB dependency, remove npm and yarn files'
cd .serverless-layers/node-layers/nodejs
npm i --production
rm package.json
rm package-lock.json
cd ../../..
echo 'DONE!'
echo '****** Finished Pre Deploy Script ******'
基本上,我们在 .serveless-layers/node-layers 目录下创建了一个 nodejs 文件夹,从根目录复制 package.json 文件,并安装所有依赖项。
然后,我们在 package.json 文件中添加了一个新的脚本。
"deploy:prepare": "sh deployment/prepare.sh"
我们的 package.json 文件内容大致如下。
{
"name": "serverless-aws-node-layer-example",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"deploy:prepare": "sh deployment/prepare.sh",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/cesmunoz/serverless-aws-node-layer-example.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/cesmunoz/serverless-aws-node-layer-example/issues"
},
"homepage": "https://github.com/cesmunoz/serverless-aws-node-layer-example#readme",
"dependencies": {
"jimp": "^0.16.1"
},
"devDependencies": {
"serverless-hooks-plugin": "^1.1.0"
}
}
最后,我们需要在 serveless.yml 文件中进行这些步骤。
添加以下内容:
1)使用该软件包serverless-hooks-plugin提供的自定义钩子
plugins:
- serverless-hooks-plugin
custom:
hooks:
before:package:createDeploymentArtifacts:
- npm run deploy:prepare
2)创建图层
layers:
nodeModules:
path: ./.serverless-layers/node-layers
name: My-App-Node-Dependencies
description: Node Modules for My App
compatibleRuntimes:
- nodejs12.x
package:
include:
- ./**
3)将我们的函数单独打包,并排除所有内容。
package:
individually: true
exclude:
- ./**
4) 仅在 lambda 函数中包含我们的 handler.js 文件,并使用 lambda 层。
functions:
hello:
handler: src/handler.hello
layers:
- { Ref: NodeModulesLambdaLayer }
package:
include:
- src/handler.js
events:
- http:
path: /
method: get
最终生成的 serveless.yml 文件内容大致如下:
app: aws-node-rest-api
service: aws-node-rest-api
provider:
name: aws
runtime: nodejs12.x
plugins:
- serverless-hooks-plugin
custom:
hooks:
before:package:createDeploymentArtifacts:
- npm run deploy:prepare
layers:
nodeModules:
path: ./.serverless-layers/node-layers
name: My-App-Node-Dependencies
description: Node Modules for My App
compatibleRuntimes:
- nodejs12.x
package:
include:
- ./**
package:
individually: true
exclude:
- ./**
functions:
hello:
handler: src/handler.hello
layers:
- { Ref: NodeModulesLambdaLayer }
package:
include:
- src/handler.js
events:
- http:
path: /
method: get
我们再部署一次,看看会发生什么。
> serverless deploy
哇!我们又能看到我们的代码了!
我们的 lambda 层在哪里?
我们可以看到,lambda 函数依赖于我们新的 lambda 层。
如果我们查看 lambda 层,就可以看到它在那里。
通过这种配置,我们可以随时查看我们的代码。
希望你也觉得它有用,就像我一样。
仓库:https ://github.com/cesmunoz/serverless-aws-node-layer-example
下次见!
C.
文章来源:https://dev.to/cemdev/make-your-lambda-functions-lightweight-o8h










