Проблема со скриптом AWS Elasticbeanstalk после развертывания

#amazon-web-services #amazon-elastic-beanstalk #celery #daemon

#amazon-веб-сервисы #amazon-elastic-beanstalk #сельдерей #демон

Вопрос:

Я пытаюсь запустить рабочий процесс celery после того, как мое приложение было развернуто в AWS Elasticbeanstalk.

99_celery_start.sh

 #!/usr/bin/env bash

#make dirs
sudo mkdir -p /usr/etc/
sudo chmod 755 /usr/etc/
sudo touch /usr/etc/celery.conf
sudo touch /usr/etc/supervisord.conf

# Get django environment variables
celeryenv=`cat /var/app/rootfolder/myprject/.env | tr 'n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g' | sed 's/%/%%/g'`
celeryenv=${celeryenv%?}

# Create celery configuration script
celeryconf="[program:celery-worker]
user=root
directory=/var/app/rootfolder
; Set full path to celery program if using virtualenv
command=/var/app/venv/*/bin/celery -A myprject worker -P solo --loglevel=INFO        
.
.
.
.
 

celery.config

 container_commands:
  01_celery_configure:
    command: "mkdir -p /.platform/hooks/postdeploy/ amp;amp; cp .ebextensions/99_celery_start.sh /.platform/hooks/postdeploy/ amp;amp; chmod 774 /.platform/hooks/postdeploy/99_celery_start.sh"
  02_run_celery:
    command: "sudo /.platform/hooks/postdeploy/99_celery_start.sh"
 

Итак, я пытаюсь скопировать скрипт celery-worker в папку .ebextension и вставить его в папку hook после развертывания, чтобы скрипт запускался после развертывания приложения на экземпляре.Но команда 02_run_celery выполняется до того, как приложение будет извлечено и развернуто в экземпляре. Поскольку для сценария требуется папка приложения /var/app/rootfolder/myprjct/.env, процесс развертывания выдает ошибку cat: /var/app/rootfolder/myprjct/.env: такого файла или каталога нет.

Ответ №1:

Если ваше предположение верно, и это условие гонки (вторая команда выполняется перед развертыванием приложения) — как насчет ожидания развертывания приложения? или ожидание конкретного файла, который вас интересует?

 ...

# Wait for the app deployment
while [ ! -f /var/app/rootfolder/myprject/.env ]
do
  sleep 1
  echo "Waiting for the application deployment"
done


# Get django environment variables
celeryenv=`cat /var/app/rootfolder/myprject/.env | tr 'n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g' | sed 's/%/%%/g'`
celeryenv=${celeryenv%?}
...

 

Комментарии:

1. Спасибо за ответ. Но это не сработало. Это вызвало тайм-аут.

Ответ №2:

Если кто-то все еще ищет ответ, то вот как я это сделал:

Структура папок:

 |-- .ebextensions/
|   |-- celery.config        # Option settings
|   `-- cloudwatch.config     # Other .ebextensions sections, for example files and container commands
`-- .platform/
    |-- nginx/                # Proxy configuration
    |   |-- nginx.conf
    |   `-- conf.d/
    |       `-- custom.conf
    |-- hooks/                # Application deployment hooks
    |   `-- postdeploy/
    |       `-- 99_celery_start.sh
 

Теперь добавьте разрешения для 99_celery_start.script в celery.config:

 01_celery_perm:
    command: "sudo chmod  x .platform/hooks/postdeploy/99_celery_start.sh"
02_dos2unix:
    command: "perl -i -pe's/r$//;' .platform/hooks/postdeploy/99_celery_start.sh"
 

ВАЖНО: убедитесь, что сценарий должен быть сохранен в конце строки LF вместо CRLF.