How to run wget cron command on elastic beanstalk config - amazon-web-services

I have one instance on elastic Beanstalk.
According to the documentation for running the cron on beanstalk environment I would create a file named something like "mycron.config" and place it in the .ebextensions folder.
I've done that.
The "mycron.config" file read like this:
commands:
command: "*/5 * * * * /usr/bin/wget -O /dev/null https://example.com/pull-shopify-orders"
I'm attempting to hit this url every 5 minutes.
The cron isn't running. What am I doing wrong?

Not sure what documentation you are referring to (no link), but I guess you write about cron.yaml which is only for worker environments.
To setup cron on web environments, you have to create /etc/cron.d/mycron "manually" with proper content and permissions.
This procedure is explained in a very recent AWS blog post:
How do I create cron jobs on Amazon EC2 instances in Elastic Beanstalk environments?
The blog creates cron-linux.config with the exemplary content of (modified content for your use-case):
files:
"/etc/cron.d/mycron":
mode: "000644"
owner: root
group: root
content: |
*/5 * * * * root /usr/local/bin/myscript.sh
"/usr/local/bin/myscript.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
#date > /tmp/date
/usr/bin/wget -O /dev/null https://example.com/pull-shopify-orders
exit 0
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/mycron.bak"

Related

Npm module not found on cron job AWS

We're deploying our app on AWS using Elasticbeanstalk. We have a main service that is an API. We also have a cron job defined using crob tabs:
files:
"/etc/cron.d/jobexecutor":
mode: "000644"
owner: root
group: root
content: |
* * * * * root /usr/local/bin/run.sh >> /var/log/jobexecutor.log 2>&1
"/usr/local/bin/run.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
export DATABASE_HOST=$(/opt/elasticbeanstalk/bin/get-config environment -k DATABASE_HOST)
# export other env vars
/usr/bin/node /var/app/current/lib/workers/job-executor.js
And now the whole deployments fail because cron job script cannot find certain module when executing (Awillix npm module). This error started occurring only recently, it worked just fine before. I understand that it does not find an error since npm install is not done. Is this like 'race condition' error? If npm install of main service is executed before the cron job it would work. Otherwise, it will not?
What to do to prevent this? Is there a way to tell cron tab to not execute before the main service (API) is started (that's when we're sure all dependencies are installed)
Thanks in advance

Cron job Django Elastic Beanstalk

I am trying to set a cron job on my project to send a email after 15 minutes.
This is in django.config
04_cronjb:
command: "cat .ebextensions/cron-linux.config > /etc/cron.d/crontab && chmod 644 /etc/cron.d/crontab"
leader_only: true
This is my cron-linux.config file
files:
"/etc/cron.d/mycron":
mode: "000644"
owner: root
group: root
content: |
* * * * * source /opt/python/current/env && python /opt/python/current/app/manage.py cronjb
It all deploys successfully but i am not receiving any email.
Cronjb script is working i have tested it. So the error is one these two files.
Is there some mistake in it?
Your 04_cronjb copies entire content of cron-linux.config into crontab. This is sadly incorrect.
Instead you should do as shown here. This includes putting all the bash commands you want to execute in a custom script called, e.g., myscript.sh and then adding myscript.sh to cron only.

How to set environment variables in Amazon Elastic Beanstalk when running a cron job (Node.js)?

I have been working on configuring a cron job while deploying an environment on Elastic Beanstalk. The purpose of the job is to run every 30 minutes and execute a Node.js script that processes SMS schedules in our system; when a schedule is ready, an SMS message is sent via the Twilio api.
Unfortunately, Node.js environments don't have the file /opt/elasticbeanstalk/support/envvars containing the environment variables defined (Maybe I am missing something?).
To work around this issue, I am loading the environment variables from /opt/elasticbeanstalk/bin/get-config in Python and then executing my Node.js script.
Everything is working as expected so hopefully this can help someone in the same situation; however, I am wondering if there is a better way to accomplish this... Open to suggestions.
In my .ebextensions folder I have the config file for the cron:
files:
"/etc/cron.d/process-sms-schedules":
mode: "000644"
owner: root
group: root
content: |
*/30 * * * * root /usr/local/bin/process-sms-schedules.sh
"/usr/local/bin/process-sms-schedules.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
# Execute script to process schedules
python /var/app/current/process-sms-schedules.py > /var/log/process-sms-schedules.log
exit 0
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/*.bak"
Here is the Python script that gets executed as part of the cron job:
#!/usr/bin/env python
import os
import subprocess
from subprocess import Popen, PIPE, call
import simplejson as json
envData = json.loads(Popen(['/opt/elasticbeanstalk/bin/get-config', 'environment'], stdout = PIPE).communicate()[0])
for k, v in envData.iteritems():
os.environ[k] = v
call(["babel-node", "/var/app/current/process-sms-schedules.js"])
Thanks in advance for any feedback.
References
Cron Job Elastic Beanstalk
How to set environment variable in Amazon Elastic Beanstalk (Python)
I had this issue while trying to execute a PHP file inside an Elastic Beanstalk environment. In particular I was trying to execute wp-cron.php file.
Basically you should write a cron job like this:
/etc/cron.d/wp-cronjob :
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin
*/5 * * * * ec2-user . /opt/elasticbeanstalk/support/envvars; /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1
Explained:
Every 5 minutes executes commands as user "ec2-user": '*/5 * * * * ec2-user'
Loads elasticbeanstalk environment variables: '. /opt/elasticbeanstalk/support/envvars;'.
Do not print any output: '> /dev/null 2>&1'.
Also:
.ebextensions/wp-cronjob.txt
# Load paths
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin
# Every 5 minutes executes commands as user "ec2-user": '*/5 * * * * ec2-user'.
# Loads elasticbeanstalk environment variables: '. /opt/elasticbeanstalk/support/envvars;'.
# Do not print any output: '> /dev/null 2>&1'.
*/5 * * * * ec2-user . /opt/elasticbeanstalk/support/envvars; /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1
.ebextensions/cronjob.config
container_commands:
add_wp_cronjob:
command: "cat .ebextensions/wp-cronjob.txt > /etc/cron.d/wp-cronjob && chmod 644 /etc/cron.d/wp-cronjob"
leader_only: true
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/*.bak"
Maybe is not the same for a Node.js environment but I am pretty sure they are similar.

eb logs display binary data

I have deployed an application using Amazon Elastic Beanstalk and I am using the EB CLI to access my logs.
Until recently when I did eb logs I was able to tail my logs. But now when I issue the same command, eb prints some binary data, for example:
-------------------------------------
/var/log/nginx/access.log-20150906.gz
-------------------------------------
^_<8B>^H^#<90><A5><EB>U^#^C<ED><9D><DF>s<E3><C8>q<C7><DF><F3>W<A8>
.......
As you can see the log file is gzipped. How can I make eb return the logs as text so I can read them?
Can you try eb logs --all as documented here. This will save the logs to a directory.
This problem is caused by elasticbeanstalk default configuration.
At least in 64bit Amazon Linux 2015.09 v2.0.4 running Ruby 2.2 (Puma) platform.
If you login to your instance with eb ssh and run cat /opt/elasticbeanstalk/tasks/taillogs.d/nginx.conf
You'll find out that by default eb logs tails every file in /var/log/nginx/ directory.
So we need to change /var/log/nginx/* to /var/log/nginx/*.log
It can be done by creating .ebextensions/0001_eb_logs.config file in root directory of your project.
File's content:
files:
"/opt/elasticbeanstalk/tasks/taillogs.d/nginx.conf" :
mode: "000644"
owner: root
group: root
content: |
/var/log/nginx/*.log
commands:
rm_old_conf:
command: "rm nginx.conf.bak"
cwd: "/opt/elasticbeanstalk/tasks/taillogs.d/"
ignoreErrors: true

.config file is being ignored by elastic beanstalk AWS

I have a web app running on elastic beanstalk. For some reason I was able to install the composer files in order to run my laravel app. The problem is that no other config file works. I have put newrelic.config into the .ebextensions/ directory, but that file got ignored.
I recently tried to create a cron job using this, AWS Elastic Beanstalk, running a cronjob, but it is not working.
Example of a .config file:
container_commands:
01_some_cron_job:
command: "cat .ebextensions/some_cron_job.txt > /etc/cron.d/some_cron_job && chmod 644 /etc/cron.d/some_cron_job"
leader_only: true
When I ssh into the ec2 instance, there is no such directory as some_cron_job.
The source gets committed to beanstalk, but beanstalk is not running the commands.
How can I make beanstalk acknowledge the .config files. Fixing this cronjob will also fix installing new relic, because both configs are being ignored and I do not know why.
Try putting it in commands section. It is more of a server command than a container command.
commands:
01_some_cron_job:
command: "cat .ebextensions/some_cron_job.txt > /etc/cron.d/some_cron_job && chmod 644 /etc/cron.d/some_cron_job"
leader_only: true
I had similar issues as well using container_commands and files, however, I deferred to the files event and it worked like a charm. My specific setup is as below.
.ebextensions/cron.config
files:
"/etc/cron.d/mycronstuff":
mode: "000644"
owner: root
group: root
content: |
# Run daily job every 8 hours
0 */8 * * * root curl -i XXXXXXXXXX
# Run nightly job at 2AM (8AM UTC)
0 8 * * * root curl -i XXXXXXXXX
Update 2019:
You must use a cron.yaml file on your project directory.
inside the file you can mention:
version: 1
cron:
- name: "task1"
url: "/scheduled"
schedule: "* * * * *"