首页 > 解决方案 > 在新的 Amazon Linux 2 上的 AWS Elastic Beanstalk 中创建 systemd 服务

问题描述

我目前正在尝试在 AWS Elastic Beanstalk 上创建一个工作人员,该工作人员正在从特定的 SQS 队列中提取消息(在 Symfony 信使的帮助下)。我不想为此任务使用专用的工作实例。经过一番研究,我发现 systemd 可以在这里提供帮助,它在新的 Amazon Linux 2 实例上默认启用。

但是,我无法创建正在运行的 systemd 服务。这是我的 .ebextensions/03_workers.config 文件:

files:
    /etc/systemd/system/my_worker.service:
        mode: "000755"
        owner: root
        group: root
        content: |
            [Unit]
            Description=My worker

            [Service]
            User=nginx
            Group=nginx
            Restart=always
            ExecStart=/usr/bin/nohup /usr/bin/php /var/app/current/bin/console messenger:consume integration_incoming --time-limit=60

            [Install]
            WantedBy=multi-user.target

services:
    systemd:
        my_worker:
            enabled: "true"
            ensureRunning: "true"

如果我正在运行此命令,我将看不到我的服务正在运行:

systemctl | grep my_worker

我究竟做错了什么?:)

标签: amazon-web-servicessymfonyamazon-elastic-beanstalksystemd

解决方案


systemd服务中不支持。唯一正确的是sysvinit

services:
  sysvinit:
    my_worker:
      enabled: "true"
      ensureRunning: "true"

但我认为它甚至不会起作用,因为这是针对 Amazon Linux 1,而不是针对 Amazon Linux 2。

在 Amazon Linux 2 中,您甚至不应该使用太多 .ebextensions. AWS文档特别写道:

在 Amazon Linux 2 平台上,我们强烈建议您使用 Buildfile,而不是在 .ebextensions 配置文件中提供文件和命令。Procfile 和平台挂钩尽可能在实例供应期间在您的环境实例上配置和运行自定义代码。

因此,您应该考虑使用Procfile,它基本上可以实现您想要实现的目标:

将 Procfile 用于不应退出的长时间运行的应用程序进程。Elastic Beanstalk 期望从 Procfile运行的进程连续运行。Elastic Beanstalk 监控这些进程并重新启动任何终止的进程。对于短期运行的进程,请使用 Buildfile。

选择

由于您已经为 . 创建了一个单元文件/etc/systemd/system/my_worker.service,您systemd可以自己创建它。enablestart

对于这个container_commands.ebextensions可以使用。例如:

container_commands:
   10_enable_worker:
     command: systemctl enable worker.service
   20_start_worker:
     command: systemctl start worker.service

推荐阅读