Skip to content

Instantly share code, notes, and snippets.

@Alex3917
Created September 1, 2020 01:47
Show Gist options
  • Save Alex3917/9b09e67069c88361d4e0187e1968bc64 to your computer and use it in GitHub Desktop.
Save Alex3917/9b09e67069c88361d4e0187e1968bc64 to your computer and use it in GitHub Desktop.
How to configure Celery using Elastic Beanstalk with Amazon Linux 2
# In .ebextensions/01_celery.config
files:
"/etc/systemd/system/celery.service":
mode: "000644"
owner: celery
group: celery
content: |
[Unit]
Description=Celery Service
After=network.target
[Service]
# I saw some other tutorials suggesting using Type=simple, but that didn't work for me. Type=forking works
# as long as you're using an instance with at least 2.0 Gigs of RAM, but on a t2.micro instance it was running out
# of memory and crashing.
Type=forking
Restart=on-failure
RestartSec=10
User=celery
Group=celery
# You can have multiple EnvironmentFile= variables declared if you have files with variables.
# The celery docs on daemonizing celery with systemd put their environment variables in a file called
# /etc/conf.d/celery, but I'm choosing to instead set the celery variables as environment variables so that
# celery can also access the necessary variables for interacting with Django.
EnvironmentFile=/opt/elasticbeanstalk/deployment/env
WorkingDirectory=/var/app/current
ExecStart=/bin/sh -c '${CELERY_BIN} multi start worker \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=INFO --time-limit=300 --concurrency=2'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait worker \
--pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart worker \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=INFO --time-limit=300 --concurrency=2'
[Install]
WantedBy=multi-user.target
"/etc/tmpfiles.d/celery.conf":
mode: "000755"
owner: celery
group: celery
content: |
d /var/run/celery 0755 celery celery -
d /var/log/celery 0755 celery celery -
container_commands:
01_create_celery_log_file_directories:
command: mkdir -p /var/log/celery /var/run/celery
02_give_celery_user_ownership_of_directories:
command: chown -R celery:celery /var/log/celery /var/run/celery
03_change_mode_of_celery_directories:
command: chmod -R 755 /var/log/celery /var/run/celery
04_reload_settings:
command: systemctl daemon-reload
# In .platform/hooks/postdeploy/01_start_celery.sh
#!/bin/bash
(cd /var/app/current; systemctl stop celery)
(cd /var/app/current; systemctl start celery)
(cd /var/app/current; systemctl enable celery.service)
@ToddRKingston
Copy link

ToddRKingston commented Aug 12, 2022

@Alex3917 I've added a 01_python.config file like you mentioned in your first response to appli-intramuros, however should the path change from /opt/python/celery to something else in AL2?

I'm getting 'Created group celery successfully' but then 'Command 00_add_user_celery (useradd -d /opt/python/celery -g celery -u 1501 celery) failed' error..

When I SSH in and try to run the command 'useradd -d /opt/python/celery -g celery -u 1501 celery'
I get '-bash: /usr/sbin/useradd: Permission denied'

Thanks in advance.

@ToddRKingston
Copy link

ToddRKingston commented Aug 20, 2022

@edchelstephens I was able to get beat to start on deployment. I added another file in .ebextensions/01_celery.config; similar to "/etc/systemd/system/celery.service":, but instead called "/etc/systemd/system/celerybeat.service". This is the file (underneath celery.service file):

 "/etc/systemd/system/celerybeat.service":
        mode: "000644"
        owner: celery
        group: celery
        content: |
            [Unit]
            Description=Celery Beat Service
            After=network.target

            [Service]
            Type=forking
            Restart=on-failure
            RestartSec=10
            User=celery
            Group=celery
            EnvironmentFile=/opt/elasticbeanstalk/deployment/env
            WorkingDirectory=/var/app/current
            ExecStart=/bin/sh -c '/var/app/venv/staging-LQM1lest/bin/celery beat -A video.celery  \
            --pidfile=/tmp/celerybeat.pid \
            --logfile=/var/log/celery/celerybeat.log \
            --loglevel=INFO -s /tmp/celerybeat-schedule'

            [Install]
            WantedBy=multi-user.target

After that, I added:

(cd /var/app/current; systemctl stop celerybeat)
(cd /var/app/current; systemctl start celerybeat)
(cd /var/app/current; systemctl enable celerybeat.service)

to the 01_start_celery.sh file that had the same language for celery. Hope this helps.

@MahirMahbub
Copy link

MahirMahbub commented Oct 25, 2022

Take a look at this gist. I have successfully deployed Django Rest App with celery, AWS sqs in Elastic Beanstalk with Amazon Linux 2

https://gist.github.com/MahirMahbub/f9c226dbc0a01da22c8c539cf9c9bcc9

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment