【问题标题】:AWS Elasticbeanstalk post deploy script problemAWS Elasticbeanstalk 部署后脚本问题
【发布时间】:2020-12-01 18:21:55
【问题描述】:

在我的应用程序部署到 AWS Elasticbeanstalk 之后,我正在尝试运行 celery worker。

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/ && cp .ebextensions/99_celery_start.sh /.platform/hooks/postdeploy/ && chmod 774 /.platform/hooks/postdeploy/99_celery_start.sh"
  02_run_celery:
    command: "sudo /.platform/hooks/postdeploy/99_celery_start.sh"

所以我正在尝试复制 .ebextension 文件夹中的 celery-worker 脚本并将其粘贴到 post-deploy hook 文件夹中,以便脚本在应用程序部署到实例后运行。但是命令 02_run_celery在应用程序被提取并部署到实例之前执行。由于脚本需要应用程序文件夹/var/app/rootfolder/myprjct/.env,部署过程会报错cat: /var/app/rootfolder/myprjct/.env: No这样的文件或目录。

【问题讨论】:

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


    【解决方案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%?}
    ...
    
    

    【讨论】:

    • 感谢您的回复。但它不起作用。它导致超时。
    【解决方案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
    

    现在在 celery.config 中添加 99_celery_start.script 的权限:

    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 保存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 2017-06-16
      • 2018-01-25
      • 2014-03-02
      • 2022-09-25
      • 2015-07-28
      • 2016-09-05
      • 2020-07-01
      相关资源
      最近更新 更多