部署Python Lambda集成OpenSearch时awswrangler模块导入失败排查
Lambda依赖未安装的验证与解决方法
问题背景
我按照AWS CDK示例部署Python Lambda对接OpenSearch端点,Lambda目录包含处理程序文件及requirements.txt,CDK代码如下:
const lambdaFunction: lambda.Function = new lambda.Function(this, id, { runtime: lambda.Runtime.PYTHON_3_9, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`)} );
requirements.txt内容:
awswrangler[opensearch] boto3
调用Lambda时出现“Internal server error”,CloudWatch日志报错:
[ERROR] Runtime.ImportModuleError: Unable to import module 'index': No module named 'awswrangler' Traceback (most recent call last):
Lambda代码导入了awswrangler:
import awswrangler as wr # 此配置在CDK中设置 open_search_domain_endpoint = os.environ.get('DOMAIN_ENDPOINT') os_client = wr.opensearch.connect( host=open_search_domain_endpoint, )
看起来requirements.txt中的依赖未安装,需要验证依赖状态并解决模块导入错误。
一、验证依赖是否已安装的方法
- 查看部署包内容
- 找到CDK构建后
cdk.out目录下对应Stack的资产文件夹,找到Lambda的.zip部署包 - 解压该压缩包,检查根目录或
python文件夹下是否存在awswrangler文件夹,无则说明依赖未打包
- 找到CDK构建后
- Lambda控制台检查
- 登录AWS控制台进入Lambda服务,找到目标函数
- 切换到「代码」标签页,查看代码源文件列表,确认是否有
awswrangler相关模块文件夹
- 临时调试代码输出
在Lambda处理函数开头添加以下代码,部署后触发函数,查看CloudWatch日志的依赖列表:
日志中若无import pkg_resources installed_packages = pkg_resources.working_set installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages]) print(installed_packages_list)awswrangler,则依赖未安装
二、解决依赖未安装的问题
当前CDK代码直接导入本地文件夹,未配置依赖安装步骤,可通过以下方式处理:
方式1:使用Lambda层管理依赖(推荐)
创建依赖层并关联到Lambda函数,修改CDK代码:
import { PythonLayerVersion } from 'aws-cdk-lib/aws-lambda-python-alpha'; // 创建包含依赖的层 const dependenciesLayer = new PythonLayerVersion(this, 'WranglerLayer', { entry: './lambda', // 指向包含requirements.txt的目录 compatibleRuntimes: [lambda.Runtime.PYTHON_3_9], }); // 创建Lambda并关联层 const lambdaFunction: lambda.Function = new lambda.Function(this, id, { runtime: lambda.Runtime.PYTHON_3_9, handler: 'index.handler', code: lambda.Code.fromAsset(`lambda`), layers: [dependenciesLayer], });
注意:需先安装依赖包:npm install @aws-cdk/aws-lambda-python-alpha
方式2:本地手动打包依赖
- 在Lambda目录下创建
python文件夹 - 执行命令将依赖安装到该文件夹(根据Lambda架构调整平台参数):
# x86_64架构 pip install -r requirements.txt -t ./python --platform manylinux2014_x86_64 --only-binary=:all: # ARM架构 pip install -r requirements.txt -t ./python --platform manylinux2014_aarch64 --only-binary=:all: - 确保
python文件夹与index.py同目录,重新执行CDK部署
方式3:使用PythonFunction构造自动处理依赖
替换原Function为专门的Python函数构造,它会自动读取requirements.txt并安装依赖:
import { PythonFunction } from 'aws-cdk-lib/aws-lambda-python-alpha'; const lambdaFunction = new PythonFunction(this, id, { runtime: lambda.Runtime.PYTHON_3_9, entry: './lambda', index: 'index.py', handler: 'handler', });
内容的提问来源于stack exchange,提问作者219CID
相关产品推荐
相关产品推荐

