首页 > 解决方案 > Lambda 的无服务器包中是否需要有 ${WORKSPACE} 目录?

问题描述

我已经开始在 AWS 中使用无服务器框架。我的源代码在 Typescript 中,它会在部署之前构建到 JavaScript。这会上传到 S3,然后创建 lambda 函数。我注意到我的 lambda 函数超过 70MB,尽管我只有几行代码,其中包含仅使用 aws-sdk 的操作,例如查询 DynamoDB 或 SecretsManager。

为了调查这一点,我下载了通过无服务器框架上传到 S3 的压缩文件,并解压缩了它的内容。它有一个名为${WORKSPACE}的文件夹,占包内存的 70%,它似乎没有任何与 lambda 函数相关的内容。

我的package.json看起来像这样

{
"name": "my-api",
"version": "0.0.1",
"description": "API to retrieve secrets from Secrets Manager",    
"license": "UNLICENSED",
"engines": {
    "node": ">= 14.0.0"
},
"scripts": {
    "build": "tsc -p .",
    "deploy": "sls deploy"
},
"dependencies": {
    "@aws-sdk/client-secrets-manager": "^3.33.0"
},
"devDependencies": {
    "serverless": "^2.59.0",
    "typescript": "^4.4.3"
}
    }

serverless.yml 的相关部分看起来像这样

service: sls-my-api

useDotenv: true

variablesResolutionMode: 20210326

frameworkVersion: '2'

package:
 patterns:
  # Includes
  - 'dist/**.js'
  # Excludes
  - '!./**.md'
  - '!./**.env*'
  - '!.github/**'
  - '!.npm/**'
  - '!coverage/**'
  - '!docker/**'
  - '!docs/**'
  - '!dist/tsconfig.build.tsbuildinfo'
  - '!dist/**.d.ts'
  - '!src/**'
  - '!test/**'
  - '!.eslintrc.js'
  - '!.npmrc'
  - '!.prettier*'
  - '!./tsconfig*.json'
  - '!Jenkinsfile'
  - '!jest.json'
  - '!nest-cli.json'
  - '!run-sonar.sh'
  - '!sonar-project.properties'
  - '!tslint.json'
  - '!.gitattributes'
  - '!.npmignore'
  - '!.s2iignore'
  - '!database/**'

在 Jenkins 阶段,运行以下

npm run build 
npm run deploy 

同样由于大小限制,lambda 控制台上不提供内联编辑,这对我来说通常是一个非常有用的操作,尤其是在无需等待重新部署的情况下快速测试和调试时。

目录${WORKSPACE}对这个部署有什么意义吗?如果没有,我如何将它从部署包中排除并让我的 lambda 精简?

标签: amazon-web-servicesjenkinsaws-lambdaserverless-framework

解决方案


虚惊!

${WORKSPACE} 目录是因为 Jenkins 运行而不是因为无服务器框架而生成的。框架虽然在打包和部署应用程序时捡起它,从而使 lambda 函数变得庞大。

如下排除它就可以了。

package:
  patterns:
    # Includes
    - 'dist/**.js'
    # Excludes
    - '!${WORKSPACE}'

对于在 Jenkins 上使用无服务器 cli 的人来说,这可能是件好事。


推荐阅读