如何在AWS Lambda中配置Java环境以使用Tabula读取PDF?
如何在AWS Lambda中配置Java环境以使用Tabula读取PDF?
嘿,我之前也碰到过一模一样的问题!Tabula这个库是依赖Java运行时才能工作的,但Lambda默认的Python运行环境里根本没装Java,所以才会抛出那个JavaNotFoundError。给你分享几个靠谱的解决办法,亲测有效:
方法一:用Lambda层挂载Java环境(最推荐)
Lambda层可以帮我们把Java这种通用依赖单独打包,不用每次更新代码都重复带它,步骤超清晰:
- 先搞到适配Lambda环境的Java包:Lambda用的是Amazon Linux 2系统,所以得对应下载x86_64或者arm64架构的OpenJDK(看你Lambda函数选的架构),我一般用Amazon Corretto 11,稳定还兼容:
你可以在本地用Amazon Linux 2的容器来操作,避免系统不兼容的问题,执行这些命令:# 下载Corretto 11安装包 curl -O https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.tar.gz # 创建java目录并解压 mkdir java tar -xzf amazon-corretto-11-x64-linux-jdk.tar.gz -C java --strip-components=1 - 打包成zip:把java目录直接打包成zip文件,命令是
zip -r java-layer.zip java/ - 上传成Lambda层:打开AWS Lambda控制台,左侧菜单点「层」,然后点「创建层」,上传刚才的zip,运行时选你函数用的Python版本(比如Python 3.9)
- 把层关联到你的函数:进入你的Lambda函数页面,切换到「层」选项卡,点「添加层」,选择你刚创建的Java层
- 配置环境变量:去函数的「配置」->「环境变量」,添加两个变量:
- 键:
JAVA_HOME,值:/opt/java - 键:
PATH,值:$PATH:/opt/java/bin
这样Python进程就能找到java命令了!
- 键:
方法二:用自定义容器镜像部署
要是你觉得层的步骤有点繁琐,也可以直接做个包含Python和Java的容器镜像,这样环境一步到位:
- 写个Dockerfile,示例如下(以Python 3.9为例):
FROM public.ecr.aws/lambda/python:3.9 # 安装Amazon Corretto 11 RUN yum install -y java-11-amazon-corretto-devel # 设置Java环境变量 ENV JAVA_HOME /usr/lib/jvm/java-11-amazon-corretto.x86_64 ENV PATH $PATH:$JAVA_HOME/bin # 安装Python依赖(把你的requirements.txt放在同目录) COPY requirements.txt . RUN pip install -r requirements.txt # 复制你的Lambda代码到任务根目录 COPY lambda_function.py ${LAMBDA_TASK_ROOT} # 设置Lambda入口函数 CMD ["lambda_function.lambda_handler"] - 把这个镜像构建好,推送到AWS ECR,然后在Lambda里创建一个用容器镜像的函数就行,这样环境里自带Java,不用再额外配置了。
小提醒
- 别忘了检查你的Lambda执行角色权限,得有读取源S3桶和写入目标桶(bucket-recebendo)的权限,不然会报权限错误
- Tabula和Java版本兼容没问题,Java 8或11都能用,我个人更推荐11,稳定性更好
备注:内容来源于stack exchange,提问作者ique
相关产品推荐
相关产品推荐

