如何在CloudFormation中配置Docker部署的Python3 Lambda函数的Entrypoint/Cmd?
同一Docker容器部署多Lambda函数的ImageConfig配置问题
问题背景
原本通过Zip包部署两个Lambda函数(ConfigLambda、LogLambda),分别通过Handler属性指定config.handler和logs.handler作为处理入口。现在切换为Docker容器部署,希望两个函数共用同一镜像,通过CloudFormation的ImageConfig覆盖容器默认配置,但测试时出现Runtime.ExitError,模块顶层代码可执行但处理函数未被调用。
原Zip包部署的CloudFormation配置片段:
... ConfigLambda: Type: 'AWS::Serverless::Function' Properties: Handler: config.handler ... ... LogLambda: Type: 'AWS::Serverless::Function' Properties: Handler: logs.handler ...
尝试的Docker部署配置片段(存在问题):
... LogLambda: Type: 'AWS::Serverless::Function' Properties: PackageType: Image ImageUri: !Ref EcrImageUri FunctionName: !Sub "${AWS::StackName}-Logs" ImageConfig: WorkingDirectory: /var/task Command: ['logs.py'] EntryPoint: ['/var/lang/bin/python3'] ... ConfigLambda: Type: 'AWS::Serverless::Function' Properties: PackageType: Image ImageUri: !Ref EcrImageUri FunctionName: !Sub "${AWS::StackName}-Config" ImageConfig: WorkingDirectory: /var/task Command: ['config.py'] EntryPoint: ['/var/lang/bin/python3']
测试时的错误信息:
RequestId: <uuid> Error: Runtime exited without providing a reason Runtime.ExitError
解决方案
核心原理
AWS Lambda Python容器镜像的正确执行逻辑依赖官方提供的/lambda-entrypoint.sh启动脚本,该脚本会解析传入的处理程序路径(格式为模块名.函数名),自动调用对应的Lambda处理函数。直接用python3作为EntryPoint运行.py文件,只会执行模块顶层代码,不会触发处理函数调用。
正确的CloudFormation配置
修改ImageConfig的EntryPoint和Command,与原Zip包的Handler格式保持一致:
... LogLambda: Type: 'AWS::Serverless::Function' Properties: PackageType: Image ImageUri: !Ref EcrImageUri FunctionName: !Sub "${AWS::StackName}-Logs" ImageConfig: WorkingDirectory: /var/task Command: ['logs.handler'] EntryPoint: ['/lambda-entrypoint.sh'] ... ConfigLambda: Type: 'AWS::Serverless::Function' Properties: PackageType: Image ImageUri: !Ref EcrImageUri FunctionName: !Sub "${AWS::StackName}-Config" ImageConfig: WorkingDirectory: /var/task Command: ['config.handler'] EntryPoint: ['/lambda-entrypoint.sh'] ...
额外注意事项
- 确保你的Docker镜像基于AWS官方Python Lambda基础镜像(例如
public.ecr.aws/lambda/python:3.11),/lambda-entrypoint.sh脚本是官方镜像的内置组件,自定义镜像需保留该脚本逻辑。 WorkingDirectory: /var/task是Lambda容器代码的默认存放路径,需保证config.py和logs.py文件位于该目录下。Command的格式必须为[模块名.处理函数名],与Zip包部署时的Handler参数完全匹配。
内容的提问来源于stack exchange,提问作者user1729210
相关产品推荐
相关产品推荐

