Warm tip: This article is reproduced from serverfault.com, please click

amazon web services-elasticbeanstalk未能部署工作人员环境/var/pids/web.pid:没有此类文件或目录

(amazon web services - elasticbeanstalk failed to deploy worker environment /var/pids/web.pid: no such file or directory)

发布于 2020-09-04 22:32:39

我在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
Questioner
Nick Brady
Viewed
11
Nick Brady 2020-09-08 23:58:33

由于最初的问题是关于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中指定的文件,并包括所有其他文件。特别是,它包括未提交的源文件。

这似乎已经解决了问题。