You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:39:36