我有一个非常简单的Python,需要用作AWS Lambda函数:
import pyodbc
def lambda_handler():
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
"Server=AAA;"
"Database=BBB;"
"UID=CCC;"
"PWD=DDD;")
cursor = cnxn.cursor()
cursor.execute("INSERT INTO [dbo].[log]([opened_by_id],[open_timestamp],[type_id],[title]) VALUES(118,GETDATE(),1,'test_1')")
cnxn.commit()
我已经使用pip安装了pyodbc,并将其作为py文件所在的文件夹。 py文件和pyodbc文件夹都添加到了我已上传到Lambda函数控制台的zip文件中。当我测试该功能时,我收到一个错误:
START RequestId: XXX Version: $LATEST
Unable to import module 'detect_last_sample': No module named 'pyodbc'
END RequestId: XXX
REPORT RequestId: YYY Duration: 1.24 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 21 MB
请帮助我了解我在这里想念的内容。非常感谢!
-编辑 看起来,除了简单地使用外部库创建一个zip之外,这个问题还有很多,当在aws lambda中使用时,pyodbc本身存在问题。 无论如何,在搜索过程中,我发现此存储库包含预先编译的库,包括pyodbc:https://github.com/Miserlou/lambda-packages
祝大家好运。
答案 0 :(得分:1)
您的zip文件可能结构不正确。 pip安装依赖项并指定正确版本的Python时是否建立了虚拟环境?
创建一个文件夹,其中包含(i)您的代码和(ii)“ site-package”文件夹的内容-然后向上拉文件夹(而非文件夹)的“ contents”并上传。像这样:
1)创建您的虚拟环境
python3.6 -m venv /path_where_you_want_a_virtual_env/
2)激活您的虚拟环境:
$source my_env/bin/activate
3)在虚拟环境中安装依赖项:
python3.6 -m pip install pyodbc
AWS支持2.7或3.6。如果您没有将依赖项安装在正确的文件夹中,它将不会存在。
4)将site-packages文件夹的内容复制到您选择的文件夹中(可以在/lib/python3.6/site-packages中找到)。我个人使用文件管理器来执行此操作。
5)将.py脚本复制到同一文件夹。
6)压缩文件夹的内容(而不是文件夹本身)
zip -r myzipfile.zip *
转到AWS管理控制台并上传此zip文件。
严重的是,一旦完成一次,它就是奶油芝士;-)
其他修改:
(A).py脚本中的主例程应完全像这样开始: def lambda_handler(event,context):
(B)在AWS Lambda函数GUI中,您需要将lambda处理程序设置为my_py_script_name.lambda_handler(即仅丢失.py并添加.lambda_handler)