在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" ] }
原因与解决
- 路径错误:Lambda唯一可写的临时目录是
/tmp(开头带斜杠),而非tmp,需修正路径为/tmp/oauth2.json。 - 权限限制: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
相关产品推荐
相关产品推荐

