提问人:Max 提问时间:9/20/2023 最后编辑:Max 更新时间:9/27/2023 访问量:91
为 AWS Lambda 创建 OR 工具层
Creating OR tools layer for AWS Lambda
问:
我正在尝试在 Lambda 上运行 OR-Tools 以解决旅行推销员问题。我正在使用 Python 3.9 运行时。我以通常的方式创建了一个 lambda 层:
mkdir python
cd python
pip3 install ortools -t .
然后我压缩了父文件夹,最终的 zip 结构是
ortools-layer -> python ->所有 ortools 文件
但是,当我尝试执行 lambda 函数时,我收到 CloudWatch 错误:
[ERROR] ImportError: cannot import name '_pywrapcp' from 'ortools.constraint_solver' (/opt/python/ortools/constraint_solver/__init__.py)
Traceback (most recent call last):
File "/opt/python/serverless_aws_lambda_sdk/instrument/__init__.py", line 596, in stub
return self._handler(user_handler, event, context)
File "/opt/python/serverless_aws_lambda_sdk/instrument/__init__.py", line 578, in _handler
result = user_handler(event, context)
File "/var/task/serverless_sdk/__init__.py", line 144, in wrapped_handler
return user_handler(event, context)
File "/var/task/s_writeSortedToS3ORTools.py", line 25, in error_handler
raise e
File "/var/task/s_writeSortedToS3ORTools.py", line 20, in <module>
user_handler = serverless_sdk.get_user_handler('writeSortedToS3ORTools.writeSortedToS3ORTools')
File "/var/task/serverless_sdk/__init__.py", line 56, in get_user_handler
user_module = import_module(user_module_name)
File "/var/lang/lib/python3.9/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "/var/task/writeSortedToS3ORTools.py", line 7, in <module>
from ortools.constraint_solver import pywrapcp
File "/opt/python/ortools/constraint_solver/pywrapcp.py", line 10, in <module>
from . import _pywrapcp
有没有简单的解决方法?我发现了一些提到使用 Docker/EC2 实例的线程,但我使用无服务器框架部署我的 lambda,并且只提供对单独上传到 S3 的 lambda 层的引用。现有的解决方案似乎很复杂和/或涉及 lambda 函数从与层/依赖项相同的位置编写/部署的情况。
有没有一种简单的方法可以更改我的图层以解决导入问题?
尝试在线查找解决方案,找到安装 VSCode 可再发行组件的参考(不要认为这在 lambda 上是不可能的)和一些 Docker 脚本等。
我想知道标准图层创建过程是否:
mkdir python
cd python
pip3 install ortools -t .
可以以某种方式进行修改以创建可用的图层。
答:
3赞
Ryan O'Neil
9/27/2023
#1
我没有针对您的问题的具体解决方案,但我认为您应该使用 Lambda 容器映像将 OR-Tools 安装到 Lambda 函数中。由于各种原因,压缩 pip 安装的软件包不太可能起作用。
值得一提的是,使用 Python 模型从本地开发到生产环境可能并非易事。这就是我们在Nextmv上构建OR-Tools集成的原因。
评论