0

我最近将 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'

请帮忙,并在此先感谢您。

4

0 回答 0