如何解决AWS Lambda Application单应用多函数体积耦合问题
你可以直接在同一个AWS Lambda Application内实现多个函数的部署包资源隔离,无需为每个函数单独创建应用。
你当前遇到的部署包体积绑定问题,是因为两个函数的CodeUri参数都配置为了项目根目录./,SAM在打包时会把整个项目目录作为两个函数的部署包,自然会出现体积互相绑定的情况。
解决步骤
- 拆分项目目录结构,将不同函数的代码、私有依赖放到独立的子目录中,参考结构如下:
项目根目录 ├── template.yml ├── common/ # 存放多函数共用的工具代码、依赖(后续可抽为Lambda Layer) ├── router/ │ ├── package.json # 仅存放router函数需要的私有依赖 │ └── router.js # router函数入口代码 └── slash-commands/ └── help/ ├── package.json # 仅存放help命令需要的私有依赖 └── help.js # help命令函数入口代码
- 修改
template.yml中每个函数的CodeUri配置,指向对应函数的独立目录,调整Handler路径适配新的目录结构,参考配置如下:
Resources: router: Type: AWS::Serverless::Function Properties: FunctionName: team-up-application-router CodeUri: ./router/ Handler: router.routerHandler Runtime: nodejs14.x MemorySize: 128 Timeout: 60 Description: 校验请求并路由到对应的斜杠命令Lambda Policies: - Statement: - Sid: LambdaAllowLambda Effect: Allow Action: - lambda:InvokeFunction - lambda:InvokeAsync Resource: 'arn:aws:lambda:us-east-2:xxxxxxxxxx:function:team-up-application-slash-command-help' - AWSLambdaBasicExecutionRole Events: HttpPost: Type: Api Properties: Path: '/interaction-endpoint-url' Method: post helpSlashCommand: Type: AWS::Serverless::Function Properties: FunctionName: team-up-application-slash-command-help CodeUri: ./slash-commands/help/ Handler: help.slashCommand Runtime: nodejs14.x MemorySize: 128 Timeout: 60 Description: 处理help斜杠命令 Policies: - AWSLambdaBasicExecutionRole
- (可选优化)如果有多个函数共用的依赖,可以将公共依赖抽为Lambda Layer,所有函数都绑定该层即可,能够进一步压缩每个函数的部署包体积。
调整完成后重新部署,SAM会为每个函数单独打包对应CodeUri目录下的内容,两个函数的部署包完全隔离,不会互相影响体积,同时还能保留在同一个应用内统一管理、部署的便利性。
内容的提问来源于stack exchange,提问作者sissonb
相关产品推荐
相关产品推荐

