我使用 WSGI 开发了一个简单的 Python Web 服务,并希望使用 Elastic Beanstalk 将其部署到 AWS 云。我的问题是我无法使我在 Elastic Beanstalk 配置中指定的所有选项在云中正确配置。
对于部署,我使用 Elastic Beanstalk CLI 实用程序。我运行eb init
命令并设置所需的参数。此后,.elasticbeanstalk
在我的源树中创建了一个名为的目录。它有两个用于部署的配置文件,即config
和optionsettings
。其他选项中的后者包含必须/etc/httpd/conf.d/wsgi.conf
在实例上更新的 WSGI 配置。经过我的一些调整后,该文件具有以下设置:
[aws:elasticbeanstalk:应用程序:环境] DJANGO_SETTINGS_MODULE = 参数1 = 参数2 = 参数4 = 参数3 = 参数5 = [AWS:Elasticbeanstalk:容器:Python] WSGIPath = handler.py 进程数 = 2 静态文件 = /static= 线程数 = 10 [aws:elasticbeanstalk:容器:python:静态文件] /静态=静态/ [aws:elasticbeanstalk:主机管理器] LogPublicationControl = false [aws:自动缩放:启动配置] 实例类型 = t1.micro EC2KeyName = zmicier-aws [aws:elasticbeanstalk:应用程序] 应用程序健康检查 URL = [AWS:自动缩放:ASG] 最大尺寸 = 10 最小尺寸 = 1 自定义可用区域 = [AWS:Elasticbeanstalk:监控] 自动终止不健康实例 = true [aws:elasticbeanstalk:sns:主题] 通知端点 = 通知协议 = 电子邮件
事实证明,当我启动或更新环境时,并非所有这些选项都会被考虑。因此,当我更新NumThreads
或时NumProcesses
,相应的参数会按预期发生变化。但无论我向和参数wsgi.conf
写入什么,我都无法自动更改相应的值,它们保持不变WSGIPath
StaticFiles
wsgi.conf
Alias /static /opt/python/current/app/
WSGIScriptAlias / /opt/python/current/app/application.py
git aws.push
这让我很抓狂。此外,当我使用并具有以下内容的文件部署应用程序时.ebextensions/python.config
,我在其中指定的任何选项都不会影响部署。
选项设置: - 命名空间:aws:elasticbeanstalk:container:python 选项名称:WSGIPath 值: mysite/wsgi.py - 命名空间:aws:elasticbeanstalk:container:python 选项名称:NumProcesses 值: 5 - 命名空间:aws:elasticbeanstalk:container:python 选项名称:NumThreads 值: 25 - 命名空间:aws:elasticbeanstalk:container:python:staticfiles 选项名称:/static/ 值:app/static/
我想知道如何强制 AWS 使用我在配置中指定的所有参数,即 WSGI 路径和我的静态数据路径。
答案1
您可能需要考虑构建 Docker 容器并将其部署到 Elastic Beanstalk。AWS 有一个用于执行此操作的 Python 示例,网址为https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/docker-singlecontainer-deploy.html#docker-singlecontainer-pythonsample以及完整的 github 仓库https://github.com/aws-samples/eb-py-flask-signup/tree/docker
在本地测试会容易得多,而且灵活性也会更高。我的经验法则是,一旦我花时间与本应让我的生活更轻松的框架作斗争,就该改变方法了。我想你已经到了那个地步。
它还可以让您轻松地将应用程序迁移到 Fargate 之类的系统。
答案2
考虑使用以下文档中的 .ebextensions:
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
您可以file:
根据需要在主机实例上配置配置文件。然后,如果需要,可以使用command: