-
Notifications
You must be signed in to change notification settings - Fork 0
/
cron-leaderonly-linux.config
127 lines (117 loc) · 5.55 KB
/
cron-leaderonly-linux.config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
###################################################################################################
#### Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
####
#### Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file
#### except in compliance with the License. A copy of the License is located at
####
#### http://aws.amazon.com/apache2.0/
####
#### or in the "license" file accompanying this file. This file is distributed on an "AS IS"
#### BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#### License for the specific language governing permissions and limitations under the License.
###################################################################################################
###################################################################################################
#### This configuration file allows a cron job to run only on one Linux instance in the environment.
####
#### The script "/usr/local/bin/test_cron.sh" will sort and compare the current instances in the
#### Auto Scaling group and if it matches the first instance in the sorted list it will exit 0.
#### This will mean that this script will only exit 0 for one of the instances in your environment.
####
#### The second script is an example of how you might use the "/usr/local/bin/test_cron.sh" script
#### to execute commands and log a timestamp to "/tmp/cron_example.log".
####
#### A cron example is setup at "/etc/cron.d/cron_example" to execute the script
#### "/usr/local/bin/cron_example.sh" every minute. A command is also run upon each deployment to
#### clear any previous versions of "/etc/cron.d/cron_example" by removing
#### "/etc/cron.d/cron_example.bak".
####
#### Note that for the first script to gather the required information, additional IAM permissions
#### will be needed to be added to a policy attached to the instance profile used by the instances
#### in the environment. The policy shown below will grant the access needed. Note that the default
#### instance profile for Elastic Beanstalk is "aws-elasticbeanstalk-ec2-role".
####
#### How to create a New Policy
#### - https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html
####
#### Adding Permissions to the Default Instance Profile
#### - https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/iam-instanceprofile.html#iam-instanceprofile-addperms
####
#### NB: Please note that as the "/usr/local/bin/test_cron.sh" script makes use of the EC2 health
#### status to determine "InService" instances in the Auto Scaling Group, the cron could fail to
#### run if the "leader" instance has failed and Auto Scaling has not yet changed the EC2 instance
#### state.
###################################################################################################
####
#### {
#### "Version": "2012-10-17",
#### "Statement": [
#### {
#### "Sid": "Stmt1409855610000",
#### "Effect": "Allow",
#### "Action": [ "autoscaling:DescribeAutoScalingGroups" ],
#### "Resource": [ "*" ]
#### },
#### {
#### "Sid": "Stmt1409855649000",
#### "Effect": "Allow",
#### "Action": [ "ec2:DescribeTags" ],
#### "Resource": [ "*" ]
#### }
#### ]
#### }
####
###################################################################################################
###################################################################################################
packages:
yum:
jq: []
files:
"/usr/local/bin/test_cron.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id 2>/dev/null`
REGION=`curl -s http://169.254.169.254/latest/dynamic/instance-identity/document 2>/dev/null | jq -r .region`
# Find the Auto Scaling Group name from the Elastic Beanstalk environment
ASG=`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" \
--region $REGION --output json | jq -r '.[][] | select(.Key=="aws:autoscaling:groupName") | .Value'`
# Find the first instance in the Auto Scaling Group
FIRST=`aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names $ASG \
--region $REGION --output json | \
jq -r '.AutoScalingGroups[].Instances[] | select(.LifecycleState=="InService") | .InstanceId' | sort | head -1`
# If the instance ids are the same exit 0
[ "$FIRST" = "$INSTANCE_ID" ]
"/usr/local/bin/cron_example.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
/usr/local/bin/test_cron.sh || exit
# Now run commands that should run on only 1 instance.
echo "Cron running at "`date` > /tmp/cron_example.log
"/usr/local/bin/reports_refresh.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
/usr/local/bin/test_cron.sh || exit
# Now run commands that should run on only 1 instance.
. /opt/elasticbeanstalk/support/envvars
cd /var/app/current && /opt/rubies/ruby-current/bin/bundle exec /opt/rubies/ruby-current/bin/rails reports:refresh
echo $0" completed at: "`date`
"/etc/cron.d/cron_example":
mode: "000644"
owner: root
group: root
content: |
# * * * * * root /usr/local/bin/cron_example.sh
*/15 * * * * root /usr/local/bin/reports_refresh.sh >/tmp/reports.log 2>&1
# 0 7 * * * root /usr/local/bin/sitemap_refresh.sh >/tmp/sitemap.log 2>&1
commands:
rm_old_cron:
command: "rm -fr /etc/cron.d/cron_example.bak"
ignoreErrors: true