为 AWS Lambda 创建 OR 工具层

Creating OR tools layer for AWS Lambda

提问人:Max 提问时间:9/20/2023 最后编辑:Max 更新时间:9/27/2023 访问量:91

问:

我正在尝试在 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 .

可以以某种方式进行修改以创建可用的图层。

python-3.x pip 或工具 aws-lambda-layers

评论

0赞 Mizux 9/21/2023
VSCode Redistributable 适用于 Windows 原生 python 包,我很确定 aws lambda 是基于 unix (linux?) 发行版操作系统的......

答:

3赞 Ryan O'Neil 9/27/2023 #1

我没有针对您的问题的具体解决方案,但我认为您应该使用 Lambda 容器映像将 OR-Tools 安装到 Lambda 函数中。由于各种原因,压缩 pip 安装的软件包不太可能起作用。

值得一提的是,使用 Python 模型从本地开发到生产环境可能并非易事。这就是我们在Nextmv上构建OR-Tools集成的原因。