【问题标题】:Create systemd service in AWS Elastic Beanstalk on new Amazon Linux 2在新的 Amazon Linux 2 上的 AWS Elastic Beanstalk 中创建 systemd 服务
【发布时间】:2020-09-25 04:52:21
【问题描述】:

我目前正在尝试在 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-services symfony amazon-elastic-beanstalk systemd


    【解决方案1】:

    Services 不支持systemd。唯一正确的是sysvinit

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

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

    在 Amazon Linux 2 中,您甚至不应该大量使用 .ebextensions。 AWSdocs具体写:

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

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

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

    替代方案

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

    为此可以使用.ebextensions中的container_commands。例如:

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

    【讨论】:

    • 感谢您的 cmets 和想法。我似乎 PHP 平台不支持 Procfiles。因此,如果我想使用我的工作队列,我似乎必须降级到 Amazon Linux 1 才能使用“sysvinit”。
    • @AlexanderBarton 没问题。您根本不必降级。在.ebexternsions 中不使用services 部分,而是使用container_commands。我会用例子来扩展答案。
    • @AlexanderBarton 我在答案中添加了一个替代解决方案。希望这可以帮助。顺便说一句,如果您觉得答案有帮助,我们将不胜感激。
    • 非常感谢。您的替代解决方案运行良好,当然有意义;)您真的拯救了我的一天!
    • 我做到了!这是我的第一个问题,我不得不在 UI 中搜索接受按钮 ^^
    猜你喜欢
    • 2020-07-23
    • 2021-01-22
    • 2015-10-22
    • 2012-07-05
    • 2021-01-12
    • 2020-10-25
    • 2015-10-10
    • 2015-03-05
    • 2016-09-12
    相关资源
    最近更新 更多