You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda使用yahoo_oauth遇只读文件系统错误的解决办法咨询

解决AWS Lambda中yahoo_oauth写入临时目录报错的问题

问题根源

你遇到的OSError: [Errno 30] Read-only file system错误,核心原因是路径使用错误:
Lambda的临时目录是绝对路径/tmp,而你的代码中使用了相对路径tmp/oauth2.json,这会让程序尝试在Lambda的默认工作目录(/var/task,只读)下创建tmp文件夹并写入文件,自然触发只读文件系统的错误。

可行解决方法

  1. 使用绝对路径指向/tmp目录
    修改代码中的路径为绝对路径,直接指向Lambda的可写临时目录:

    from yahoo_oauth import OAuth2
    oauth = OAuth2(None, None, from_file='/tmp/oauth2.json')
    

    这是最直接的修复方式,确保程序正确访问到Lambda的可写临时目录。

  2. 初始化凭证文件(首次运行)
    如果是第一次运行函数,/tmp/oauth2.json可能不存在,你需要确保该文件包含基础的OAuth凭证(client_id、client_secret)。可以通过以下方式处理:

    • 提前将包含凭证的文件上传到Lambda的部署包中,在函数启动时复制到/tmp目录:
      import shutil
      import os
      
      # 检查/tmp下是否存在凭证文件,不存在则从部署包复制
      if not os.path.exists('/tmp/oauth2.json'):
          shutil.copy('oauth2.json', '/tmp/oauth2.json')
      
      from yahoo_oauth import OAuth2
      oauth = OAuth2(None, None, from_file='/tmp/oauth2.json')
      
    • 或者在代码中直接写入基础凭证到/tmp目录(注意不要硬编码敏感信息,建议用Lambda环境变量存储client_id和client_secret):
      import json
      import os
      
      # 从环境变量获取凭证
      client_id = os.environ['YAHOO_CLIENT_ID']
      client_secret = os.environ['YAHOO_CLIENT_SECRET']
      
      # 初始化凭证文件到/tmp
      if not os.path.exists('/tmp/oauth2.json'):
          with open('/tmp/oauth2.json', 'w') as f:
              json.dump({
                  'client_id': client_id,
                  'client_secret': client_secret
              }, f)
      
      from yahoo_oauth import OAuth2
      oauth = OAuth2(None, None, from_file='/tmp/oauth2.json')
      
  3. 跨会话持久化令牌(可选)
    Lambda的/tmp目录在函数冷启动时会被重置,令牌无法跨会话保留。如果需要长期维护会话,可以将令牌存储到S3或DynamoDB中,自定义yahoo_oauth的令牌读取/写入逻辑:

    • 继承OAuth2类,重写_save_token和_load_token方法,将令牌读写操作指向S3/DynamoDB而非本地文件。

内容的提问来源于stack exchange,提问作者Justin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:25:01