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

在AWS Lambda中调用Yahoo Fantasy Sports API的令牌读取问题

在AWS Lambda中调用Yahoo Fantasy Sports API的OAuth2问题解决

问题背景

本地调用Yahoo Fantasy Sports API的OAuth2认证流程正常,但迁移到AWS Lambda后遇到两类异常:


问题1:从S3读取JSON内容传入OAuth2构造函数触发TypeError

错误代码

s3x = boto3.client('s3')
o_bucket='mysportss3bucket'
o_path = 'oauth2.json'
resp = s3x.get_object(Bucket=o_bucket, Key = o_path)['Body'].read()
sc = OAuth2(None, None, resp)

报错信息

TypeError                                 Traceback (most recent call last)
<ipython-input-49-fd439f281ac6> in <module>
      1 print(resp)
----> 2 sc = OAuth2(None, None, resp)

TypeError: __init__() takes 3 positional arguments but 4 were given

原因与解决

Yahoo OAuth2的构造函数不支持直接将JSON字节作为位置参数传入,正确做法是先将字节内容转成UTF-8字符串,再通过from_string关键字参数传递:

s3x = boto3.client('s3')
o_bucket='mysportss3bucket'
o_path = 'oauth2.json'
# 读取字节并转成字符串
resp_str = s3x.get_object(Bucket=o_bucket, Key=o_path)['Body'].read().decode('utf-8')
# 使用关键字参数传入JSON字符串
sc = OAuth2(None, None, from_string=resp_str)

问题2:存放JSON文件到Lambda目录触发OSError

报错信息

{
  "errorMessage": "[Errno 30] Read-only file system: 'tmp/oauth2.json'",
  "errorType": "OSError",
  "requestId": "7f23496c-50fa-4a49-b567-fd6bb66cabbc",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 13, in lambda_handler\n    sc = OAuth2(None, None, from_file=x)\n",
    "  File \"/opt/python/lib/python3.9/site-packages/yahoo_oauth/oauth.py\", line 234, in __init__\n    super(OAuth2, self).__init__('oauth2', consumer_key, consumer_secret, **kwargs)\n",
    "  File \"/opt/python/lib/python3.9/site-packages/yahoo_oauth/oauth.py\", line 100, in __init__\n    write_data(data, vars(self).get('from_file', 'secrets.json'))\n",
    "  File \"/opt/python/lib/python3.9/site-packages/yahoo_oauth/utils.py\", line 41, in write_data\n    return func(data, filename)\n",
    "  File \"/opt/python/lib/python3.9/site-packages/yahoo_oauth/utils.py\", line 46, in json_write_data\n    with open(filename, 'w') as fp:\n"
  ]
}

原因与解决

  1. 路径错误:Lambda唯一可写的临时目录是/tmp(开头带斜杠),而非tmp,需修正路径为/tmp/oauth2.json。
  2. 权限限制:Lambda仅允许写入/tmp目录,确保文件存放路径符合要求。

修正后的代码示例(从S3下载文件到/tmp再读取):

s3x = boto3.client('s3')
o_bucket='mysportss3bucket'
o_path = 'oauth2.json'
local_tmp_path = '/tmp/oauth2.json'
# 下载文件到Lambda可写目录
s3x.download_file(o_bucket, o_path, local_tmp_path)
# 从本地文件初始化OAuth2
sc = OAuth2(None, None, from_file=local_tmp_path)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54