Python Lambda使用yahoo-oauth库写入根目录报错解决方案咨询
解决Lambda中yahoo-oauth库写入只读文件系统的问题
我使用yahoo-oauth库拉取Yahoo Fantasy的数据,将Lambda函数打包为Docker镜像上传至ECR并部署到Lambda,期望该函数每日运行一次,但出现以下错误:该库试图写入Lambda环境的根目录,而Lambda仅允许写入/tmp目录,且我无法控制该库的写入路径,求可行解决方案。
错误日志
{ "errorMessage": "[Errno 30] Read-only file system: 'secrets.json'", "errorType": "OSError", "requestId": "65a32608-80ea-4c68-923c-ec395a996da8", "stackTrace": [ " File \"/var/task/app.py\", line 56, in handler\n oauth = OAuth2(\n", " File \"/var/lang/lib/python3.12/site-packages/yahoo_oauth/oauth.py\", line 236, in __init__\n super(OAuth2, self).__init__('oauth2', consumer_key, consumer_secret, **kwargs)\n", " File \"/var/lang/lib/python3.12/site-packages/yahoo_oauth/oauth.py\", line 102, in __init__\n write_data(data, vars(self).get('from_file', 'secrets.json'))\n", ] }
可行解决方案
指定自定义文件路径:从报错栈可以看到,库的初始化逻辑会读取
from_file参数,默认值为secrets.json。初始化OAuth2时直接传入该参数,指定到Lambda允许写入的/tmp目录即可:oauth = OAuth2(consumer_key="你的密钥", consumer_secret="你的密钥", from_file="/tmp/secrets.json")使用AWS Secrets Manager存储凭证:绕过库的本地文件存储逻辑,自行处理OAuth流程,将token等凭证存储在AWS Secrets Manager中,每次函数运行时从Secrets Manager读取凭证,直接传入库(若支持)或手动构建请求。
Docker镜像中创建软链接:在构建Docker镜像时,将根目录的
secrets.json软链接到/tmp目录,让库的写入操作实际指向允许的路径。在Dockerfile中添加以下命令:RUN ln -s /tmp/secrets.json /secrets.json修改库源码:若上述方法都不适用,可fork yahoo-oauth库的源码,将默认的
secrets.json路径改为/tmp/secrets.json,再使用修改后的库构建Docker镜像。
内容的提问来源于stack exchange,提问作者lmurphud
相关产品推荐
相关产品推荐

