如何为Python AWS Synthetic(Canary)上传依赖?导入失败排查
AWS CloudWatch Synthetics Python脚本依赖导入失败问题解决
针对你遇到的问题——将依赖包打包进ZIP上传后,明明模块存在于sys.path路径下却无法导入,结合AWS官方文档和实践经验,给出以下排查和解决步骤:
一、检查依赖包的结构与兼容性
- 确保依赖包适配CloudWatch Synthetics的运行环境:它基于Lambda的Amazon Linux 2环境,带C扩展的包不能用本地编译版本,必须在兼容环境(比如EC2的Amazon Linux 2实例,或Docker镜像
public.ecr.aws/lambda/python:3.9)下编译后再打包。 - 确认依赖包的目录结构合规:如果是Python包,必须包含
__init__.py文件(命名空间包除外),且包目录要直接放在你添加到sys.path的父目录下,而非嵌套多层。
二、修正依赖打包方式
不要手动复制本地site-packages里的依赖,改用pip的--target参数将依赖安装到指定目录,再和脚本一起打包:
# 在空目录下执行,将依赖安装到当前目录的deps文件夹 pip install --target ./deps requests==2.31.0 # 将脚本文件(比如canary.py)和deps目录一起打包 zip -r canary.zip canary.py deps/
三、调整脚本中的路径处理逻辑
- 确保在
import依赖前添加正确的路径到sys.path,且添加的是依赖包的父目录,而非包目录本身:
import sys import os # 获取脚本所在的绝对路径 script_path = os.path.abspath(__file__) script_dir = os.path.dirname(script_path) # 将依赖所在的deps目录加入sys.path sys.path.append(os.path.join(script_dir, "deps")) # 现在可以正常导入依赖 import requests
- 避免使用相对导入,改用绝对导入,避免环境路径解析问题。
四、排查日志与验证打包结构
- 查看CloudWatch Synthetics的详细日志,除了
ModuleNotFoundError,还要检查是否有依赖内部的导入错误(比如依赖本身缺失子模块)。 - 手动解压上传的ZIP文件,确认依赖包的位置和脚本中
sys.path指向的路径完全匹配,没有层级错误。
内容的提问来源于stack exchange,提问作者scubbo
相关产品推荐
相关产品推荐

