Python 使用无服务器框架将Plotly/Dash应用程序部署到AWS

Python 使用无服务器框架将Plotly/Dash应用程序部署到AWS,python,amazon-web-services,aws-lambda,serverless-framework,plotly-dash,Python,Amazon Web Services,Aws Lambda,Serverless Framework,Plotly Dash,我正在尝试使用无服务器框架将Plotly Dash应用程序部署为AWS Lambda。该应用程序在本地按预期工作,我可以使用serverless wsgi-serve命令启动它无服务器部署报告成功。但是,在调用时,lambda会失败,并出现以下错误: Traceback (most recent call last): File "/var/task/wsgi_handler.py", line 44, in import_app wsgi_module = importli

我正在尝试使用无服务器框架将Plotly Dash应用程序部署为AWS Lambda。该应用程序在本地按预期工作,我可以使用
serverless wsgi-serve
命令启动它<代码>无服务器部署报告成功。但是,在调用时,lambda会失败,并出现以下错误:

Traceback (most recent call last):
File "/var/task/wsgi_handler.py", line 44, in import_app
wsgi_module = importlib.import_module(wsgi_fqn_parts[-1])
File "/var/lang/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 783, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/var/task/app.py", line 4, in <module>
import dash
File "/tmp/sls-py-req/dash/__init__.py", line 5, in <module>
from .dash import Dash, no_update  # noqa: F401,E402
File "/tmp/sls-py-req/dash/dash.py", line 21, in <module>
from flask_compress import Compress
File "/tmp/sls-py-req/flask_compress.py", line 14, in <module>
import brotli
File "/tmp/sls-py-req/brotli.py", line 8, in <module>
import _brotli
ModuleNotFoundError: No module named '_brotli'
[ERROR] Exception: Unable to import app.server
Traceback (most recent call last):
  File "/var/lang/lib/python3.8/imp.py", line 234, in load_module
    return load_source(name, filename, file)
  File "/var/lang/lib/python3.8/imp.py", line 171, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 702, in _load
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/var/task/wsgi_handler.py", line 119, in <module>
    wsgi_app = import_app(config)
  File "/var/task/wsgi_handler.py", line 49, in import_app
    raise Exception("Unable to import 
{}
".format(config["app"]))
serverless.yml

---
服务:无服务器
变量解决模式:20210219
useDotenv:对
供应商:
名称:aws
运行时:python3.8
阶段:测试
地区:欧盟-中部-1
apiGateway:
shouldStartNamewith服务:true
lambdahashing版本:20201221
功能:
应用程序:
处理程序:wsgi_handler.handler
活动:
-http:有吗/
-http:“任意{proxy+}”
自定义:
wsgi:
app:app.server
蟒蛇宾:蟒蛇3
包装要求:错误
蟒蛇要求:
DockerIP:非linux
插件:
-无服务器wsgi
-无服务器python需求
包裹:
排除:
-节点单元/**
#及其他
requirements.txt

-i https://pypi.org/simple
brotli==1.0.9
click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
dash-core-components==1.15.0
dash-html-components==1.1.2
dash-renderer==1.9.0
dash-table==4.11.2
dash==1.19.0
flask-compress==1.9.0
flask==1.1.2
future==0.18.2; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'
itsdangerous==1.1.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
jinja2==2.11.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
markupsafe==1.1.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
plotly==4.14.3
retrying==1.3.3
six==1.15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
werkzeug==1.0.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'

ModuleNotFoundError的原因:没有名为“\u brotli”的模块是不正确的依赖项打包。它是通过使用Docker和Docker lambda图像打包应用程序来修复的
slim:true
strip:false
在保留二进制文件的同时最小化包大小,在某些情况下这是必需的(在本例中是这样的)

python要求:
皮普:是的
斯利姆:是的
长条:假
解决了_brotlinot found问题后,我遇到了下一条错误消息
pkg_resources.DistributionNotFound:找不到“flask compress”发行版,该发行版是应用程序所必需的
。我能够用中描述的解决方法解决它

最后,应用程序在
/
下服务(本例中为
/test/
)。这需要修改Dash应用程序配置,即 在破折号构造函数中提供
请求\u路径名\u前缀=“/test/dash/”

完整的工作示例:

app.py

从集合导入namedtuple
导入pkg_资源
#备份真函数
_true\u get\u distribution=pkg\u resources.get\u distribution
#为仪表板呼叫创建小占位符
#烧瓶压缩版本=解析版本(获取分发(“烧瓶压缩”).version)
_Dist=namedtuple(“距离”,“版本”)
def_获取_分配(dist):
如果dist==“烧瓶压缩”:
返回距离('1.9.0')。#你的版本是什么
其他:
return\u true\u get\u分布(dist)
#monkey修补该功能,使其在冻结后可以工作,pkg_资源可用
#没有帮助
pkg_resources.get_distribution=\u get_distribution
导入破折号
将dash_html_组件导入为html
从烧瓶进口烧瓶
服务器=烧瓶(名称)
@server.route(“/”)
def index():
返回“Hello Flask应用程序”
app=dash.dash(
__姓名,
服务器=服务器,
路由路径名前缀=“/dash/”,
请求路径名前缀=“/test/dash/”
)
app.layout=html.Div(html.H1(“Hello Dash!”)
如果名称=“\uuuuu main\uuuuuuuu”:
server.run(debug=True)
serverless.yml

---
服务:无服务器
变量解决模式:20210219
useDotenv:对
供应商:
名称:aws
运行时:python3.8
阶段:测试
地区:欧盟-中部-1
apiGateway:
shouldStartNamewith服务:true
lambdahashing版本:20201221
功能:
应用程序:
处理程序:wsgi_handler.handler
活动:
-http:有吗/
-http:“任意{proxy+}”
自定义:
wsgi:
app:app.server
蟒蛇宾:蟒蛇3
包装要求:错误
蟒蛇要求:
皮普:是的
斯利姆:是的
长条:假
插件:
-无服务器wsgi
-无服务器python需求
包裹:
排除:
-节点单元/**
#及其他