如何在AWS CloudFormation中配置共享模块的Serverless Lambda函数
最优解决方案
方案一:用Lambda Layer托管公共模块(推荐)
把共享的module做成Lambda Layer,两个Lambda函数可以共享这个Layer,既避免代码重复,也不会把无关代码打包进函数部署包。
实现步骤:
- 保持你现有文件夹结构不变:
src/ lambda1/ lambda2/ module/
- 在CloudFormation(SAM)模板中定义Lambda Layer及关联的函数:
Resources: SharedModuleLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: SharedModuleLayer ContentUri: ./src/module/ CompatibleRuntimes: - python3.9 # 替换为你实际使用的运行时 RetentionPolicy: Retain LambdaFunction1: Type: AWS::Serverless::Function Properties: FunctionName: Lambda1 CodeUri: ./src/lambda1/ Handler: lambda_function.lambda_handler Runtime: python3.9 Layers: - !Ref SharedModuleLayer # 引用共享Layer LambdaFunction2: Type: AWS::Serverless::Function Properties: FunctionName: Lambda2 CodeUri: ./src/lambda2/ Handler: lambda_function.lambda_handler Runtime: python3.9 Layers: - !Ref SharedModuleLayer
- 部署时SAM会自动把
module打包成Layer,Lambda函数运行时可以直接按本地方式import该模块。
方案二:自定义构建脚本打包(适合不想用Layer的场景)
借助SAM的自定义构建能力,在打包每个Lambda函数时自动将module复制到对应函数目录,再生成部署包。
实现步骤:
- 在项目根目录创建
Makefile:
build-LambdaFunction1: cp -r src/module src/lambda1/ sam build -t template.yml --build-dir .aws-sam/build/LambdaFunction1 LambdaFunction1 build-LambdaFunction2: cp -r src/module src/lambda2/ sam build -t template.yml --build-dir .aws-sam/build/LambdaFunction2 LambdaFunction2
- 在CloudFormation模板中指定
BuildMethod为makefile:
Resources: LambdaFunction1: Type: AWS::Serverless::Function Properties: FunctionName: Lambda1 CodeUri: ./src/lambda1/ Handler: lambda_function.lambda_handler Runtime: python3.9 Metadata: BuildMethod: makefile LambdaFunction2: Type: AWS::Serverless::Function Properties: FunctionName: Lambda2 CodeUri: ./src/lambda2/ Handler: lambda_function.lambda_handler Runtime: python3.9 Metadata: BuildMethod: makefile
- 运行
sam build时,会自动执行Makefile中的复制逻辑,把公共模块加入对应Lambda的部署包,同时不会混入另一个Lambda的代码。
内容的提问来源于stack exchange,提问作者phil iot
相关产品推荐
相关产品推荐

