我在EBS方面苦苦挣扎,因为我认为它具有相对简单的体系结构。我有一个Django应用。这个Django应用程序将包含我的工作环境和WebServer的代码。我已经很好地部署到了WebServer,并且在尝试合并它的时候我的工作环境中只有这个问题。这个糟糕的家伙也遇到了同样的问题,社区似乎并没有很好的答案。
由于没有很好的方法来分离配置,这是我学到的错误1。
从我得到这个错误开始:
2020/09/03 20:17:59.065285 [错误]更新过程[web sqsd nginx运行良好的cfn-hup] pid符号链接失败,并显示错误读取pid源文件/var/pids/web.pid失败,并显示错误:open / var / pids /web.pid:没有这样的文件或目录
从这个链接中,我以为是由于我.platform
用nginx覆盖(仅修改gzip以将其打开)导致了某种原因。我已将其删除并重新部署,但错误不存在,因此似乎很合理。不幸的是,它看起来很气质,因为它又回来了(在我已经部署了几次之后!!!)。
我第一次解决此问题的方法是使用 saved_configs/
├── .elasticbeanstalk
│ ├── config.yml
│ └── saved_configs
│ ├── web.cfg.yml
│ └── worker.cfg.yml
并这样称呼它:
eb create testweb --cfg web
eb create testwrkr -t worker --cfg worker
eb deploy testweb
eb deploy testwrkr
这似乎可行,但是我仍然无法部署我的工作环境。接下来,由于删除了.platform昨天为我修复了错误,因此我尝试创建一个Makefile。
ENVS = 'production development'
ifndef env
$(error "env" is not specified. Please use one of: $(ENVS))
endif
create_web: clean copy_web_configuration
@echo "Creating Environment: $(env)"
-eb create $(env)
create_worker: clean copy_worker_configuration
@echo "Creating Worker Environment: $(env)"
-eb create $(env) -t worker
deploy_web: clean copy_web_configuration
@echo "Deploying to: $(env)"
-eb deploy $(env) $(args)
@$(MAKE) clean
deploy_worker: clean copy_worker_configuration
@echo "Deploying worker to: $(env)"
-eb deploy $(env) $(args)
@$(MAKE) clean
copy_web_configuration:
@cp -r config/ebs/extensions/shared/ .ebextensions/
@cp -r config/ebs/extensions/web/ .ebextensions/
@cp -r config/ebs/platform/web/ .platform/
copy_worker_configuration:
@cp -r config/ebs/extensions/shared/ .ebextensions/
@cp -r config/ebs/extensions/worker/ .ebextensions/
clean:
@find .ebextensions/ -maxdepth 1 -type f -exec rm -f {} \;
@rm -rf .platform/nginx
@find .platform/ -maxdepth 1 -type f -exec rm -f {} \;
因此我可以100%确定目标平台所用的.ebextensions/
或.platform/
适用的内容。
My new file tree looks like this:
.ebextensions/
.platform/
config/
├── __init__.py
├── ebs
│ ├── extensions
│ │ ├── shared
│ │ │ ├── 01_packages.config
│ │ │ ├── appslog.config
│ │ │ └── django.config
│ │ ├── web
│ │ │ ├── db-migrate.config
│ │ │ ├── securelistener-clb.config
│ │ │ └── static.config
│ │ └── worker
│ │ └── worker.config
│ └── platform
│ └── web
│ └── nginx
│ └── nginx.conf
├── settings
│ ├── __init__.py
│ ├── base.py
│ ├── local.py
│ └── production.py
├── urls.py
└── wsgi.py
现在,当我部署(添加之后cron.yaml
)时,我又重新认识了我的老朋友
2020/09/04 22:12:21.485660 [INFO]执行指令:跟踪健康的pids 2020/09/04 22:12:21.485677 [INFO]这是增强的健康环境... 2020/09/04 22:12 :21.485697 [INFO]运行命令/ bin / sh -c systemctl show -p ConsistsOf aws-eb.target | cut -d = -f2 2020/09/04 22:12:21.491871 [INFO] nginx.service healthd.service cfn-hup.service sqsd.service
2020/09/04 22:12:21.491894 [INFO]运行命令/ bin / sh -c systemctl show -p ConsistsOf eb-app.target | cut -d = -f2 2020/09/04 22:12:21.496690 [INFO] web.service
2020/09/04 22:12:21.496761 [错误]更新过程[web nginx运行良好的cfn-hup sqsd] pid符号链接失败,并显示错误消息读取pid源文件/var/pids/web.pid失败,并出现错误:open / var / pids /web.pid:没有这样的文件或目录2020/09/04 22:12:21.496772 [错误]执行命令[app-deploy]-[在健康状态下跟踪pids]时发生错误。停止运行命令。错误:更新进程[web nginx运行良好的cfn-hup sqsd] pid符号链接失败,并显示错误读取pid源文件/var/pids/web.pid失败,并显示以下错误:open /var/pids/web.pid:无此类文件或目录
2020/09/04 22:12:21.496776 [INFO]执行清理逻辑2020/09/04 22:12:21.496861 [INFO] CommandService响应:{“ status”:“ FAILURE”,“ api_version”:“ 1.0”,“结果“:[{”状态“:”失败“,” msg“:”引擎执行遇到错误。“,”返回码“:1,”事件“:[{” msg“:”实例部署成功生成了' Procfile'。“,” timestamp“:1599257531,” severity“:” INFO“},{” msg“:”实例部署失败。有关详细信息,请参见'eb-engine.log'。“,” timestamp“:1599257541, “ severity”:“ ERROR”}]}]}}
我的工作人员配置中没有太多内容,因此我不知为何无法部署它。有人看过这个问题吗?我在网上找到的唯一资源是:
我同时监视日志,并按操作顺序查看,首先出现此错误:
Sep 4 22:42:18 ip-172-31-7-235 web: File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
Sep 4 22:42:18 ip-172-31-7-235 web: return _bootstrap._gcd_import(name[level:], package, level)
Sep 4 22:42:18 ip-172-31-7-235 web: File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
Sep 4 22:42:18 ip-172-31-7-235 web: File "<frozen importlib._bootstrap>", line 983, in _find_and_load
Sep 4 22:42:18 ip-172-31-7-235 web: File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
Sep 4 22:42:18 ip-172-31-7-235 web: ModuleNotFoundError: No module named 'application'
Sep 4 22:42:18 ip-172-31-7-235 web: [2020-09-04 22:42:18 +0000] [9303] [INFO] Worker exiting (pid: 9303)
Sep 4 22:42:18 ip-172-31-7-235 web: [2020-09-04 22:42:18 +0000] [9296] [INFO] Shutting down: Master
Sep 4 22:42:18 ip-172-31-7-235 web: [2020-09-04 22:42:18 +0000] [9296] [INFO] Reason: Worker failed to boot.
然后
2020/09/04 22:42:21.717799 [INFO] Running command /bin/sh -c systemctl show -p ConsistsOf eb-app.target | cut -d= -f2
2020/09/04 22:42:21.722604 [INFO] web.service
2020/09/04 22:42:21.722678 [ERROR] update processes [web healthd nginx sqsd cfn-hup] pid symlinks failed with error Read pid source file /var/pids/web.pid failed with error:open /var/pids/web.pid: no such file or directory
2020/09/04 22:42:21.722689 [ERROR] An error occurred during execution of command [app-deploy] - [Track pids in healthd]. Stop running the command. Error: update processes [web healthd nginx sqsd cfn-hup] pid symlinks failed with error Read pid source file /var/pids/web.pid failed with error:open /var/pids/web.pid: no such file or directory
2020/09/04 22:42:21.722694 [INFO] Executing cleanup logic
2020/09/04 22:42:21.722778 [INFO] CommandService Response: {"status":"FAILURE","api_version":"1.0","results":[{"status":"FAILURE","msg":"Engine execution has encountered an error.","returncode":1,"events":[{"msg":"Instance deployment successfully generated a 'Procfile'.","timestamp":1599259331,"severity":"INFO"},{"msg":"Instance deployment failed. For details, see 'eb-engine.log'.","timestamp":1599259341,"severity":"ERROR"}]}]}
所以我猜web.service
没有找到是因为ModuleNotFound
错误。我不了解的是,我正在使用与Web环境完全相同的代码回购。.那么,Worker环境将如何失败?该配置对我来说还可以。我的树在上面,相关的beantalk配置是这样的:
aws:elasticbeanstalk:container:python:
WSGIPath: config.wsgi:application
由于最初的问题是关于web.service
失败的,因此我将添加来自AWS支持人员的此说明。
接下来,“ web.service”是Beanstalk的linux服务,它负责使用“ gunicorn” python插件在启动和运行WSGI服务器时激活虚拟环境[2]。因此,从错误“ /var/pids/web.pid失败并出现错误:open /var/pids/web.pid”看来,当“ web.service”想使用“ ExecStart = / bin”运行应用程序时/ sh -c“ gunicorn --bind 127.0.0.1:8000 --workers = 1 --threads = 15 application””,并且由于缺少模块而失败。
这指向了我认为问题出在哪里ModuleNotFound
。当我找到tail -f
两个不同的日志文件时,看到ModuleNotFound
是在另一个错误之前发生的,这支持了这一论点。
之所以发生这种情况,是因为在我切换到使用Makefile之后,在运行eb部署之前,或者至少将其暂存并运行带有--staged
标志的部署之前,我没有自动提交代码。不幸的是,如果我想使用相同的存储库,AWS推荐的建议是使用两个不同的分支来管理工作程序代码和Web代码。我发现这是绝对糟糕的建议,并且在EBS上的设计很差,所以我决定保留我Makefile
的解决方案,并找到了一种变通办法,如果我指定.ebignore
,我可以规避git
,并且在部署之前直接复制任何文件,然后将其清理,将被部署。
这是我的调试过程(如果有人发现有帮助):
WSGI应用程序未启动。这意味着无论出于何种原因都找不到python应用程序的入口点。
在应用程序的根目录下,我有:
config/
├── settings
│ ├── __init__.py
│ ├── base.py
│ ├── local.py
│ └── production.py
├── urls.py
└── wsgi.py
具有以下变量:
application = get_wsgi_application()
由于某种原因,配置文件无法找到此变量,从而启动了python应用程序
在其中启动应用程序的相关Elastic Beanstalk代码 /.ebextensions/django.config
aws:elasticbeanstalk:container:python:
WSGIPath: config.wsgi:application
这对我来说似乎是正确的,所以我有点困惑。另外,我已经使用此设置部署了很多次,并且可以正常工作。但是现在失败了。为什么?
检查控制台以查看是否设置了WSGI路径,如我所想
它只是说应用程序。它在实际工作的环境中怎么说?如我所见,工作环境说config.wsgi:application
。所以..问题是,无论出于何种原因,/该配置实际上并未将其设置为使用Elastic Beanstalk。
我意识到我要部署的文件实际上并没有提交。目录中的.ebextensions
文件需要像应用程序的其余部分一样进行提交。这Makefile
有点棘手,因为文件不会被提交,因为我刚刚将它们复制了过来。
尝试将新复制的文件添加到中git
,然后使用运行我的部署--staged
,然后使用删除更改git restore --source=HEAD --staged --worktree -- .ebextensions/
。所以我去看看是否有一种方法可以在git之外进行部署。这行得通,但我不喜欢干扰git工作流程。从这个AWS线程看来,可以使用一个.ebignore
文件来完成此操作。
在文档中 对此进行了特别说明:配置EB CLI-AWS Elastic Beanstalk
如果存在.ebignore,则EB CLI不会使用git命令来创建你的源包。这意味着EB CLI会忽略.ebignore中指定的文件,并包括所有其他文件。特别是,它包括未提交的源文件。
这似乎已经解决了问题。