【问题标题】:elasticbeanstalk failed to deploy worker environment /var/pids/web.pid: no such file or directoryelasticbeanstalk 部署工作环境/var/pids/web.pid 失败:没有这样的文件或目录
【发布时间】:2020-12-24 04:06:59
【问题描述】:

我在 EBS 上苦苦挣扎,因为我认为 EBS 的架构相对简单。我有一个 Django 应用程序。这个 Django 应用程序将包含我的工作环境和我的 WebServer 的代码。我一直很好地部署到 WebServer,并且在我尝试合并它时只有我的工作环境存在这个问题。 This poor chap 有同样的问题,which the community 似乎没有一个好的答案。

这是我学到的第 1 个错误,因为没有很好的方法来分离配置。

从我得到这个错误开始:

2020/09/03 20:17:59.065285 [错误] 更新进程 [web sqsd nginx healthd cfn-hup] pid 符号链接失败并出现错误读取 pid 源文件 /var/pids/web.pid 失败并出现错误:打开 / var/pids/web.pid: 没有这样的文件或目录

来自this link,我认为是由于我的.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

这似乎可行,但我仍然无法部署我的工作环境。接下来我尝试创建一个 Makefile,因为昨天删除了 .platform 为我修复了错误。

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] 执行指令:跟踪 healthd 中的 pid 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 |剪切 -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 |剪切 -d= -f2 2020/09/04 22:12:21.496690 [信息] web.service

2020/09/04 22:12:21.496761 [错误] 更新进程 [web nginx healthd cfn-hup sqsd] pid 符号链接失败并出现错误读取 pid 源文件 /var/pids/web.pid 失败并出现错误:打开 / var/pids/web.pid:没有这样的文件或目录 2020/09/04 22:12:21.496772 [错误] 执行命令 [app-deploy] - [Track pids in healthd] 时出错。停止运行命令。错误:更新进程 [web nginx healthd cfn-hup sqsd] pid 符号链接失败并出现错误读取 pid 源文件 /var/pids/web.pid 失败并出现错误:打开 /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","re​​sults":[{"status":"FAILURE","msg" :"引擎执行遇到错误。","re​​turncode":1,"events":[{"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

【问题讨论】:

  • 应用程序的入口点是什么?它应该被称为application。例如,在烧瓶中显示here 入口点是application = Flask(__name__)。所以我认为你的工作环境也期望你的主文件中有 application 变量。它找不到它,因此您会收到有关 No module named 'application' 的错误。
  • 感谢您的评论。该变量名为application,位于config/wsgi.py,所以看起来我的WSGIPath 应该没问题。几周以来,我也一直在将配置 + 代码库部署到 Web 环境中,所以看到它让我感到惊讶

标签: amazon-web-services amazon-elastic-beanstalk


【解决方案1】:

由于最初的问题是关于 web.service 故障,我将添加 AWS 支持人员的此注释。

接下来,“web.service”是 Beanstalk 的 linux 服务,它负责使用“gunicorn”python 插件 [2] 在暂存和运行 WSGI 服务器时激活虚拟环境。因此,从错误“/var/pids/web.pid failed with error: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'd 两个不同的日志文件并看到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 应用程序

/.ebextensions/django.config中启动应用程序的相关Elastic Beanstalk代码

  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 thread 看来,这可以通过 .ebignore 文件来完成。

这里在文档中特别说: Configure the EB CLI - AWS Elastic Beanstalk

当 .ebignore 存在时,EB CLI 不会使用 git 命令来创建您的源包。这意味着 EB CLI 会忽略 .ebignore 中指定的文件,并包括所有其他文件。特别是,它包括未提交的源文件。

这似乎解决了问题。

【讨论】:

    【解决方案2】:

    eb deploy 期间,我的日志中显示了相同的错误消息,但原因不同。添加以防将来有人遇到此问题

    简答:

    我在环境变量中的 Django 设置中存储了一些变量。我没有在环境创建期间创建这些环境变量。我的过程是在 eb cli 中运行 eb create -t worker -p "Python 3.7"。然后让 cli 创建环境并部署代码。部署将失败,并在日志中显示此错误消息。在环境创建期间设置 env 变量让这对我有用。

    其他信息:

    我的 Django worker env 和 web env 使用相同的代码库。两者都通过在 Amazon Linux/2.9.15 上运行 Python 3.6 的 EB 部署到 AWS。

    我必须在 Amazon Linux 2/3.1.3 上将我的工作线程升级到 Python 3.7。

    当我通过 eb cli 创建新的 worker env 时,我没有使用环境变量创建环境。我的典型工作流程(使用 Amazon Linux/2.9.15 对我来说效果很好)是通过 eb cli 创建环境。让它创建、部署代码。然后进入eb web界面,通过配置添加env变量。

    但是在 Amazon Linux 2/3.1.3 上的 3.7 上,似乎需要在创建时设置环境变量。正如我看到这个确切的错误消息,直到我使用 env 变量创建了 env。

    AWS 提供了一个few ways to do this,但我是在 /.ebextensions/environmentvariables.config 内部完成的

    该文件的格式是(例如):

    option_settings:
      - option_name: DJANGO_SETTINGS_MODULE
        value: example.settings
    

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2015-03-23
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2021-05-13
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多