首页 > 解决方案 > 生成新实例时,AWS Elastic Beanstalk ebextensions 配置不起作用

问题描述

在我的 Laravel 应用程序中,我创建了一个文件夹,它具有在 EC2 实例.ebextensions中安装主管的配置。

当我第一次部署应用程序并创建实例时,一切正常。主管安装。

但是当实例扩展并生成新的 EC2 时,它不会采用相同的配置。我需要在较新的实例上手动安装主管。

有没有办法让较新的实例从 .ebextensions 获取配置并以与第一次类似的方式运行它?

这是 .ebextensions 文件夹的结构

.ebextensions
    - supervisor
        - setup.sh
        - supervisor_laravel.conf
        - supervisord.conf
    - supervisor.config

安装程序.sh

#!/bin/bash

echo "Supervisor - starting setup"
. /opt/elasticbeanstalk/deployment/env

if [ ! -f /usr/bin/supervisord ]; then
    echo "installing supervisor"
    easy_install supervisor
else
    echo "supervisor already installed"
fi

if [ ! -d /etc/supervisor ]; then
    mkdir /etc/supervisor
    echo "create supervisor directory"
fi

if [ ! -d /etc/supervisor/conf.d ]; then
    mkdir /etc/supervisor/conf.d
    echo "create supervisor configs directory"
fi

. /opt/elasticbeanstalk/deployment/env && cat .ebextensions/supervisor/supervisord.conf > /etc/supervisor/supervisord.conf
. /opt/elasticbeanstalk/deployment/env && cat .ebextensions/supervisor/supervisord.conf > /etc/supervisord.conf
. /opt/elasticbeanstalk/deployment/env && cat .ebextensions/supervisor/supervisor_laravel.conf > /etc/supervisor/conf.d/supervisor_laravel.conf

if ps aux | grep "[/]usr/bin/supervisord"; then
    echo "supervisor is running"
else
    echo "starting supervisor"
    /usr/bin/supervisord
fi

/usr/bin/supervisorctl reread
/usr/bin/supervisorctl update

echo "Supervisor Running!"

yum -y install http://cbs.centos.org/kojifiles/packages/beanstalkd/1.9/3.el7/x86_64/beanstalkd-1.9-3.el7.x86_64.rpm

if ps aux | grep "[/]usr/bin/beanstalkd"; then
    echo "beanstalkd is running"
else
    echo "starting beanstalkd"
    /bin/systemctl start beanstalkd.service
fi

echo "Beanstalkd Running..."

supervisor_laravel.conf

[program:worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /var/www/html/artisan queue:work --tries=3 --timeout=0
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
;user=forge
numprocs=3
redirect_stderr=true
stderr_logfile=/var/log/supervisor_laravel.err.log
stdout_logfile=/var/log/supervisor_laravel.out.log

主管.conf

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)
environment=SYMFONY_ENV=prod

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = /etc/supervisor/conf.d/*.conf

[inet_http_server]
port = 9000
username = user
password = pw

主管.config

container_commands:
    01_install_supervisor:
        command: ".ebextensions/supervisor/setup.sh"

标签: amazon-web-servicesamazon-elastic-beanstalksupervisordebextensions

解决方案


我找到了答案。但方式略有不同。

最初,我有 .ebextensions 文件夹中的所有文件,我将一些文件移动到另一个名为“awsconfig”的文件夹(名称无关紧要),并将 setup.sh 文件的一些命令移动到 .platform/ hooks/postdeploy 并将权限作为 chmod +x 授予 setup.sh

重要的

AWS 在执行后清理 .ebextensions 文件夹。我在这里读到

我这样做是因为在较新的实例中安装了主管(在扩展后创建的实例),但配置文件没有被复制,因为较新的实例中没有 .ebextensions 文件夹

为了在部署实例后复制配置文件,我使用了平台挂钩 postdeploy。

您可以在此处阅读有关 platform-hooks-postdeploy 的信息

这是我现在的结构

.ebextensions
    - supervisor
        - setup.sh
    - supervisor.config

.platform
    - hooks
        - postdeploy
            - setup.sh

awsconfig
    - supervisor
        - supervisor_laravel.conf
        - supervisord.conf

这些是 setup.php 文件中的更改,该文件分为不同文件夹中的两个文件

.ebextensions/supervisor/setup.sh

#!/bin/bash

echo "Supervisor - starting setup"
. /opt/elasticbeanstalk/deployment/env

if [ ! -f /usr/bin/supervisord ]; then
    echo "installing supervisor"
    easy_install supervisor
else
    echo "supervisor already installed"
fi

if [ ! -d /etc/supervisor ]; then
    mkdir /etc/supervisor
    echo "create supervisor directory"
fi

if [ ! -d /etc/supervisor/conf.d ]; then
    mkdir /etc/supervisor/conf.d
    echo "create supervisor configs directory"
fi

.platform/hooks/postdeploy/setup.sh

#!/bin/bash

. /opt/elasticbeanstalk/deployment/env && cat /var/www/html/awsconfig/supervisor/supervisord.conf > /etc/supervisor/supervisord.conf
. /opt/elasticbeanstalk/deployment/env && cat /var/www/html/awsconfig/supervisor/supervisord.conf > /etc/supervisord.conf
. /opt/elasticbeanstalk/deployment/env && cat /var/www/html/awsconfig/supervisor/supervisor_laravel.conf > /etc/supervisor/conf.d/supervisor_laravel.conf

if ps aux | grep "[/]usr/bin/supervisord"; then
    echo "supervisor is running"
else
    echo "starting supervisor"
    /usr/bin/supervisord
fi

/usr/bin/supervisorctl reread
/usr/bin/supervisorctl update

echo "Supervisor Running!"

yum -y install http://cbs.centos.org/kojifiles/packages/beanstalkd/1.9/3.el7/x86_64/beanstalkd-1.9-3.el7.x86_64.rpm

if ps aux | grep "[/]usr/bin/beanstalkd"; then
    echo "beanstalkd is running"
else
    echo "starting beanstalkd"
    /bin/systemctl start beanstalkd.service
fi

echo "Beanstalkd Running..."

所有其他文件的内容与我在问题中发布的内容相同。


推荐阅读