Skip to content

Instantly share code, notes, and snippets.

@drafie
Forked from kixorz/aws_autoscaling_cron.rb
Created January 28, 2021 02:34
Show Gist options
  • Select an option

  • Save drafie/a2dccce9c57ec8336fea329604d7b1ff to your computer and use it in GitHub Desktop.

Select an option

Save drafie/a2dccce9c57ec8336fea329604d7b1ff to your computer and use it in GitHub Desktop.
Running cron jobs in AWS Auto Scaling group is tricky. When you deploy the same code and configuration to all instances in the group, cron job would run on all of them. You may not want that. This script detects the first instance in the group and allows only this instance to run the job. IAM user used by this script needs to have permissions to…
#!/usr/bin/env ruby
require 'syslog'
require 'net/http'
require 'aws-sdk'
Syslog.open
AWS.config({
:access_key_id => '<iam user key>',
:secret_access_key => '<iam user secret>'
})
metadata_endpoint = 'http://169.254.169.254/latest/meta-data/'
instance_id = Net::HTTP.get( URI.parse( metadata_endpoint + 'instance-id' ) )
auto_scaling = AWS::AutoScaling.new
auto_scaling.groups.each { |group|
instance = group.ec2_instances.filter('instance-state-name', 'running').first
if( instance.instance_id == instance_id )
command = ARGV * ' '
Syslog.alert( 'running cron on ' + instance_id + ': ' + command )
`#{command}`
end
}
#!/bin/bash
source "/usr/local/rvm/scripts/rvm"
cd "$(dirname "$0")"
./aws_autoscaling_cron.rb "$@"
{
"Statement": [
{
"Action": [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeAutoScalingInstances",
"ec2:DescribeInstanceAttribute",
"ec2:DescribeInstanceStatus",
"ec2:DescribeInstances"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
#run a command every day at midnight
0 0 * * * ubuntu /aws_autoscaling_cron.sh <command> <parameters> > /dev/null 2> /dev/null
@drafie
Copy link
Author

drafie commented Jan 28, 2021

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