我最近将 Python 3.8 脚本移植到 AWS Lambda 函数。由于 Lambda 函数的 15 分钟超时,我必须将数据传递给另一个 Lambda 才能完成执行。
注意:我不会更改为另一个 AWS 服务来解决这个问题。
只需创建一个类,将所有数据放入其中,然后将其腌制到一个文件中供其他 Lambda 读取。
Lambda 1 如下所示:
#filename: lambda_function.py
import pandas as pd
import pickle, boto3, json, s3fs
class DataToPass():
def __init__(self,data):
self.data = data
self.s3 = s3fs.S3FileSystem(anon=False) #auth set in Lambda permissions
self.df = None
# ... etc
def my_method(self,variable):
return pd.DataFrame([self.data + variable])
def to_pickle(self, filename):
pickle_filename = self.S3_FOLDER_PICKLES+filename
with self.s3.open(pickle_filename, 'wb') as f:
pickle.dump(self,f)
return pickle_filename
def lambda_handler(event, context):
# do lots of calcs, create class instance, get all data in instance
data = 1 + 1
A = DataToPass(data)
A.df = A.my_method(6)
# the class data are in the instance "A", and it is ready to be pickled
pickle_filename = A.to_pickle('saved_instance.pickle') #NOTE: method above
# now invoke other (async, in this case) Lambda and tell it where
# to find the pickle file with the class instance data:
input_params = {"PICKLE_FILENAME":pickle_filename}
client = boto3.client('lambda')
response = client.invoke(
FunctionName = 'arn:aws:lambda:us-east-1:YATAYATAYATA',
InvocationType = 'Event',
Payload = json.dumps(input_params)
)
return "COMPLETE"
上面的一切都很好!它保存了泡菜,我的第二个 Lambda 很好地读取了它。
问题是我有时需要拉下pickle文件来调试或验证数据。当我从 s3 下载它(参考下面提到的代码块)并尝试在我的计算机上打开它时,例如在 Jupyter Notebook(也运行 Python 3.8)中,它会引发一个错误,指示创建类的文件lambda_function .py(见下文)与它一起被腌制。
# jupyter-notebook filename: CheckPickleFiles.ipynb
import pickle
with open('saved_instance.pickle','rb') as f:
A = pickle.load(f)
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-2-2b6241ac51f7> in <module>
2
3 with open('saved_instance.pickle','rb') as f:
----> 4 A = pickle.load(f)
ModuleNotFoundError: No module named 'lambda_function'
我已经阅读了有关此的其他答案,但实际上没有人尝试解决前端的问题,即首先防止泡菜插入文件名。毕竟,如果我的一位同事想要拔出泡菜并检查数据怎么办?它应该和我上面的第二个代码块一样简单。
PS - 我已经通过在不同的文件中创建类来测试这个,然后它说:
...
ModuleNotFoundError: No module named 'the_other_filename'
请帮忙,并在此先感谢您。