我正在构建一个使用嵌套堆栈的 SAM 模板。我的顶层 template.yaml 有两个嵌套的堆栈资源:base_layer 和 eventHandler。 base_layer 堆栈创建了一个 lambda 堆栈集,该堆栈集具有其他函数将依赖的较低级别的功能(日志记录等)。这些似乎都按预期工作。
eventHandler 堆栈有一个 SNS 主题和一个 SQS 队列以及一个 lambda 函数,该函数应该从 SQS 队列中获取事件并将它们插入到 RDS 数据库(存在于 SAM 堆栈之外)。
eventHandler python 执行 import
的 mysql.connector
。有一个 requirements.txt 文件,其中列出了 mysql 和 mysql-connector。
当我在 AWS Lambda 控制台中测试 eventHandler lambda 函数时,我得到:
{
"errorMessage": "Unable to import module 'eventHandler': No module named 'mysql'",
"errorType": "Runtime.ImportModuleError"
}
我的文件结构如下:
+template.yaml
+samconfig.toml
+cloudformation_stacks
| +base_layer.yaml
| +eventHandler.yaml
+code
+base_layer
| +python
| +lib
| +python3.8
| +site-packages
| +loggingfunctions.py
| +otherlowlevelfunctions.py
| +moremiscellaneousfunctions.py
+eventHandler
+eventHandler.py
+requirements.txt
Requirements.txt 具有:
mysql-connector==2.2.9
mysql==0.0.2
我尝试将 requirements.txt 文件移动到目录树中的几个不同位置,但始终得到相同的结果。为什么 SAM/Cloudformation 不构建带有 mysql 依赖项的 Python 环境?我该如何解决这个问题?
编辑:当我按照 https://docs.aws.amazon.com/lambda/latest/dg/python-package-create.html 处的说明操作并在包含 python 文件的文件夹的子文件夹中使用目标文件夹执行 pip install 时,我看到 sam build 实际上确实打包了这些文件在它上传到 S3 的 .zip 文件中。我想我需要阅读如何告诉 Python 在哪里搜索导入文件。 (而且我仍然不相信这是正确的方法,但看起来确实很有希望。)