发布于 2026-01-06 1 阅读
0

让你的 lambda 函数轻量级

让你的 lambda 函数轻量级

我看到很多文章教你如何用简单的步骤创建 Lambda 函数,总是展示“Hello World”示例。但是,每次你在 Lambda 函数中使用依赖项时,它的性能就会开始下降。

因此,本文将向您展示如何使您的 Lambda 函数更轻量级,只包含我们需要执行的函数。

在开始编写代码之前,您需要满足以下条件:

1) 已安装 AWS CLI; 2) 使用.
工具在本地配置 AWS 凭证; 3) 已安装 Node.js(我们将使用 Node.js v12); 4) 已安装 Serverless。aws configure

npm install -g serverless

都配置好了吗?好的!开始写代码吧!🙂

首先,我想向你展示一下这个问题。

创建一个文件夹或一个仓库并克隆它。我这里选择创建了一个仓库并克隆它。

创建仓库

我将使用 npm 安装依赖项,你也可以使用 yarn。

> npm init -y
Enter fullscreen mode Exit fullscreen mode

npmInit
这将创建一个 package.json 文件。

现在我们将用以下方式创建我们的 lambda 函数:

> sls init aws-node-rest-api
Enter fullscreen mode Exit fullscreen mode

slsInit

我们将对项目进行一些修改。

aws-node-rest-api会将其更改为并我们的根文件夹src复制serveless.ymlsrc

> mv aws-node-rest-api src
> mv src/serveless.yml ./serverless.yml
Enter fullscreen mode Exit fullscreen mode

移动文件

最后要改变的是 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
Enter fullscreen mode Exit fullscreen mode


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
Enter fullscreen mode Exit fullscreen mode

我高亮显示了 lambda 函数的已更改路径。

就这样,我们开始部署函数吧!

> serverless deploy
Enter fullscreen mode Exit fullscreen mode

过一段时间后,你会看到以下图片。

已部署

如果你登录 AWS,就能看到你的新 Lambda 函数了!!耶!!!干得漂亮!!!

AWS 函数

如果我们查看 Lambda 函数中部署的内容,就可以看到代码。

AWS 函数代码

现在我们已经精通了 Serverless 和 Lambda 函数,我们想添加一些软件包。

我们的 Lambda 函数不是很简单吗?大多数时候,我们使用软件包来对数据库进行一些调用,调用 AWS 功能,调用 API,操作图像等等。

现在,我们来安装一些软件包。假设我们要处理一些图片,这里我们将使用jimp(这只是个例子。我需要一个比较大型的 npm 包)。

所以,让我们在控制台中输入以下命令

> npm install --save jimp
Enter fullscreen mode Exit fullscreen mode

现在我们再次部署一下,看看情况如何。

> severless deploy
Enter fullscreen mode Exit fullscreen mode

AWS函数无代码

等等!什么?看不到代码?出什么事了?

嗯,通过简单的配置,我们将 node_modules 文件夹上传到我们的 lambda 函数中,而我们刚刚安装的包使得 lambda 函数太大,无法显示代码。

如何避免这种情况并再次看到我的代码?Lambda 层来帮忙!

没错!无服务器架构能够创建 Lambda 层。Lambda 层是一个包含库或其他依赖项的 ZIP 压缩包。有了它,我们就能进一步缩小 Lambda 函数的体积。

我们该如何实现这一点呢?我们将把 node_modules 文件夹放在 Lambda 层中。

为此,我们将对代码进行一些修改。

首先,我们将安装这个软件包。

> npm i --save-dev serverless-hooks-plugin
Enter fullscreen mode Exit fullscreen mode

之后,我们将创建一个部署文件夹,并创建一个脚本,其中包含创建该层所需的所有内容。

> mkdir deployment
> touch deployment/prepare.sh
Enter fullscreen mode Exit fullscreen mode

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 ******'
Enter fullscreen mode Exit fullscreen mode

基本上,我们在 .serveless-layers/node-layers 目录下创建了一个 nodejs 文件夹,从根目录复制 package.json 文件,并安装所有依赖项。

然后,我们在 package.json 文件中添加了一个新的脚本。

"deploy:prepare": "sh deployment/prepare.sh"
Enter fullscreen mode Exit fullscreen mode

我们的 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"
  }
}
Enter fullscreen mode Exit fullscreen mode

最后,我们需要在 serveless.yml 文件中进行这些步骤。

添加以下内容:

1)使用该软件包serverless-hooks-plugin提供的自定义钩子

plugins:
  - serverless-hooks-plugin

custom:
  hooks:
    before:package:createDeploymentArtifacts:
      - npm run deploy:prepare
Enter fullscreen mode Exit fullscreen mode

2)创建图层

layers:
  nodeModules:
    path: ./.serverless-layers/node-layers
    name: My-App-Node-Dependencies
    description: Node Modules for My App
    compatibleRuntimes:
      - nodejs12.x
    package:
      include:
        - ./**
Enter fullscreen mode Exit fullscreen mode

3)将我们的函数单独打包,并排除所有内容。

package:
  individually: true
  exclude:
    - ./**
Enter fullscreen mode Exit fullscreen mode

4) 仅在 lambda 函数中包含我们的 handler.js 文件,并使用 lambda 层。

functions:
  hello:
    handler: src/handler.hello
    layers:
      - { Ref: NodeModulesLambdaLayer }
    package:
      include:
        - src/handler.js        
    events:
      - http:
          path: /
          method: get
Enter fullscreen mode Exit fullscreen mode

最终生成的 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
Enter fullscreen mode Exit fullscreen mode

我们再部署一次,看看会发生什么。

> serverless deploy
Enter fullscreen mode Exit fullscreen mode

AwsFunctionCodeAgain

哇!我们又能看到我们的代码了!

我们的 lambda 层在哪里?

AWS Lambda层

我们可以看到,lambda 函数依赖于我们新的 lambda 层。

如果我们查看 lambda 层,就可以看到它在那里。

AwsLayer

通过这种配置,我们可以随时查看我们的代码。

希望你也觉得它有用,就像我一样。

仓库:https ://github.com/cesmunoz/serverless-aws-node-layer-example

下次见!

C.

文章来源:https://dev.to/cemdev/make-your-lambda-functions-lightweight-o8h