AWS Lambda轮换RDS PostgreSQL密钥报错:无法导入pg模块
解决AWS Lambda Secrets Manager PostgreSQL旋转函数的
pg模块导入错误 问题根源
你的Lambda函数依赖psycopg2(PostgreSQL Python驱动),日志中出现的No module named 'pg'是psycopg2内部依赖缺失导致的误报,本质是没有正确部署兼容Lambda环境的psycopg2依赖包。之前创建的层无效,大概率是依赖包编译环境不兼容或层的打包结构错误。
解决方案
1. 编译兼容Lambda环境的psycopg2依赖
Lambda Python 3.9运行在Amazon Linux 2环境,必须用相同环境编译依赖,避免本地(Windows/macOS)编译的包不兼容。用Docker模拟Lambda环境:
- 拉取Lambda Python 3.9镜像并进入容器:
docker run -v "$PWD":/var/task public.ecr.aws/sam/build-python3.9:latest /bin/bash - 在容器内创建层的标准目录结构并安装依赖:
mkdir -p python/lib/python3.9/site-packages cd python/lib/python3.9/site-packages pip install psycopg2-binary==2.9.5 -t . - 退出容器,打包成层压缩包:
zip -r psycopg2-layer.zip python/
2. 用Terraform部署层并关联到Lambda函数
确保Terraform代码中正确配置层和Lambda的关联,同时检查handler配置(这是常见的隐性错误):
# 创建psycopg2 Lambda层 resource "aws_lambda_layer_version" "psycopg2_layer" { filename = "psycopg2-layer.zip" layer_name = "psycopg2-python39" compatible_runtimes = ["python3.9"] } # 部署Secrets Manager旋转Lambda函数 resource "aws_lambda_function" "postgres_rotation" { filename = "lambda_function.zip" # 你的旋转函数压缩包 function_name = "SecretsManagerRDSPostgreSQLRotationSingleUser" handler = "lambda_function.lambda_handler" # 必须与文件名对应,原函数是lambda_function.py runtime = "python3.9" role = aws_iam_role.lambda_rotation_role.arn # 提前创建的IAM角色,需包含Secrets Manager和RDS权限 layers = [aws_lambda_layer_version.psycopg2_layer.arn] # 如果RDS在VPC内,需配置VPC子网和安全组 # vpc_config { # subnet_ids = aws_subnet.lambda_subnets.*.id # security_group_ids = [aws_security_group.lambda_sg.id] # } }
3. 排查层无效的常见原因
- 兼容运行时不匹配:创建层时必须指定
python3.9作为兼容运行时,否则Lambda无法识别层内的依赖。 - 打包结构错误:层的依赖必须放在
python/lib/python3.9/site-packages/目录下,直接将依赖放在压缩包根目录会导致Lambda无法加载。 - Handler配置错误:如果将handler设为
function.lambda_handler但你的函数文件名是lambda_function.py,会触发Unable to import module 'function'错误,可能伴随依赖缺失的误报。
内容的提问来源于stack exchange,提问作者Judi
相关产品推荐
相关产品推荐

