initial commit from code.google.com

This commit is contained in:
Colin Johnson
2012-06-17 22:46:53 +00:00
commit 52dcc5c58e
24 changed files with 1764 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
# Introduction:
as-update-launch-config was created to easily modify the EC2 Instance Type of an Auto Scaling Group's Launch Configuration File. The most typical use case is to change the size of instance used by an Auto Scaling Group, although as-update-launch-config can also be used to update the storage type, user-data or AMI used by a Launch Config (and hence, an Auto Scaling Group).
#
# Directions For Use:
#
## Example of Use:
#
as-update-launch-config -a my-scaling-group -i m1.small -u /home/cjohnson/web-server-user-data.txt
-
the above example would modify the Auto Scaling Group "my-scaling-group" to use an m1.small EC2 Instance Type with the user-data available at /home/cjohnson/web-server-user-data.txt - note that this would also use an Amazon Linux AMI by default. The three parameters -a -i and -u are required for operation, as explained in the section "Required Parameters."
#
## Required Parameters:
#
as-update-launch-config requires the following three arguments:
-a <auto-scaling-group-name> - the name of the Auto Scaling Group that you wish to modify.
-i <instance-type> - the EC Instance Type you wish to switch use - for example -i m1.small would mean all future instances are launched as m1.small EC2 Instances.
-u <user-data> - path to the user-data file that the Auto Scaling Group's Launch Configuration should use.
#
## Optional Parameters:
#
-b <bits> if you specify a t1.micro, m1.small, m1.medium or c1.medium EC2 Instance Type you must specify either a 32-bit or 64-bit platform. This parameter is valid only for the t1.micro, m1.small, m1.medium and c1.medium instance types.
-p <region> - allows you specify the region in which your Auto Scaling Group and Launch Configuration are in.
-p <preview> - set to "true" if you wish to preview output rather than execute. Useful for testing.
-s <storage> - set to ebs if you wish to use an EBS backed AMI or s3 if you wish to use an s3 backed AMI. With no input, ebs is selected by default.
-m <AMI> - allows you specify the AMI that you desire your Auto Scaling Group's Launch Configuration to use.
#
# Additional Information:
#
Author: Colin Johnson / colin@cloudavail.com
Date: 2012-03-07
Version 0.5
License Type: GNU GENERAL PUBLIC LICENSE, Version 3

View File

@@ -0,0 +1,157 @@
#!/bin/bash -
# Author: Colin Johnson / colin@cloudavail.com
# Date: 2012-02-27
# Version 0.5
# License Type: GNU GENERAL PUBLIC LICENSE, Version 3
#
#####
#as-update-launch-config start
#gets an AMI from set of inputs
getimageidcurl()
{
#get list of AMIs - format is region,bitdepth,storage,ami-id, -s is required to prevent curl from outputing progress meter to stderr
amimap=`curl -s ${awsec2amimap}`
#gets instanceid from downloaded file
imageid=`echo "$amimap" | grep "$region,$bits,$storage" | cut -d ',' -f4`
echo "AMI ID $imageid will be used for the new Launch Configuration. Note that as-update-launch-config uses Amazon Linux AMIs by default."
}
#determines that the user provided AMI does, in fact, exit
imageidvalidation()
{
#amivalid redirects stderr to stdout - if the user provided AMI does not exist, the if statement will exit as-update-launch-config.sh else it is assumed that the user provided AMI exists
amivalid=`ec2-describe-images $imageid --region $region 2>&1`
if [[ $amivalid =~ "Client.InvalidAMIID.NotFound" ]]
then echo "The AMI ID $imageid could not be found. If you specify an AMI (-m) it must exist and be in the given region (-r). Note that region (-r defaults to \"us-east-1\" if not given." 1>&2 ; exit 64
else echo "The user provided AMI \"$imageid\" will be used when updating the Launch Configuration for the Auto Scaling Group \"$asgroupname.\""
fi
}
#confirms that executables required for succesful script execution are available
prerequisitecheck()
{
for prerequisite in basename cut curl date head grep as-update-auto-scaling-group as-describe-launch-configs as-describe-auto-scaling-groups ec2-describe-images
do
#use of "hash" chosen as it is a shell builtin and will add programs to hash table, possibly speeding execution. Use of type also considered - open to suggestions.
hash $prerequisite &> /dev/null
if [[ $? == 1 ]] #has exits with exit status of 70, executable was not found
then echo "In order to use `basename $0`, the executable \"$prerequisite\" must be installed." 1>&2 ; exit 70
fi
done
}
#calls prerequisitecheck function to ensure that all executables required for script execution are available
prerequisitecheck
#sets as-update-launch-config Defaults
awsec2amimap="http://s3.amazonaws.com/colinjohnson-cloudavailprd/aws-ec2-ami-map.txt"
region="us-east-1"
dateymd=`date +"%F"`
#handles options processing
while getopts :a:i:u:b:s:p:r:m: opt
do
case $opt in
a) asgroupname="$OPTARG";;
i) instancetype="$OPTARG";;
u) userdata="$OPTARG";;
b) bits="$OPTARG";;
s) storage="$OPTARG";;
p) preview="$OPTARG";;
r) region="$OPTARG";;
m) imageid="$OPTARG";;
*) echo "Error with Options Input. Cause of failure is most likely that an unsupported parameter was passed or a parameter was passed without a corresponding option." 1>&2 ; exit 64 ;;
esac
done
#sets previewmode - will echo commands rather than performing work
case $preview in
true|True) previewmode="echo"; echo "Preview Mode is set to $preview" 1>&2 ;;
""|false|False) previewmode="";;
*) echo "You specified \"$preview\" for Preview Mode. If specifying a Preview Mode you must specific either \"true\" or \"false.\"" 1>&2 ; exit 64 ;;
esac
# instance-type validator
case $instancetype in
t1.micro|m1.small|c1.medium|m1.medium) bits=$bits ;
# bit depth validator for micro to medium instances - demands that input of bits for micro to medium size instances be 32 or 64 bit
if [[ $bits -ne 32 && bits -ne 64 ]]
then echo "You must specify either a 32-bit (-b 32) or 64-bit (-b 64) platform for the \"$instancetype\" EC2 Instance Type." 1>&2 ; exit 64
fi ;;
m1.large|m1.xlarge|m2.xlarge|m2.2xlarge|m2.4xlarge|c1.xlarge|cc1.4xlarge) bits=64;;
"") echo "You did not specify an EC2 Instance Type. You must specify a valid EC2 Instance Type (example: -i m1.small or -i m1.large)." 1>&2 ; exit 64;;
*) echo "The \"$instancetype\" EC2 Instance Type does not exist. You must specify a valid EC2 Instance Type (example: -i m1.small or -i m1.large)." 1>&2 ; exit 64;;
esac
# user-data validator
if [[ ! -f $userdata ]]
then echo "The user-data file \"$userdata\" does not exist. You must specify a valid user-data file (example: -u /path/to/user-data.txt)." 1>&2 ; exit 64
fi
# storage validator
case $storage in
ebs|EBS) storage=EBS;;
s3|S3) storage=S3;;
"") storage=EBS ;; # if no storage type is set - default to EBS
*) echo "The \"$storage\" storage type does not exist. You must specify a valid storage type (either: -s ebs or -s s3)." 1>&2 ; exit 64;;
esac
# region validator
case $region in
us-east-1|us-west-2|us-west-1|eu-west-1|ap-southeast-1|ap-northeast-1|sa-east-1) ;;
*) echo "The \"$region\" region does not exist. You must specify a valid region (example: -r us-east-1 or -r us-west-2)." 1>&2 ; exit 64;;
esac
# as-group-name validator - need to also include "command not found" if as-describe-auto-scaling-groups doesn't fire
if [[ -z $asgroupname ]]
then echo "You must specify an Auto Scaling Group name (example: -a asgname)." 1>&2 ; exit 64
fi
#creates list of Auto Scaling Groups
asgresult=`as-describe-auto-scaling-groups $asgroupname --show-long --region $region --max-records 1000`
#user response for Auto Scaling Group lookup - alerts user if Auto Scaling Group was not found.
if [[ $asgresult = "No AutoScalingGroups found" ]]
then echo "The Auto Scaling Group named \"$asgroupname\" does not exist. You must specify an Auto Scaling Group that exists." 1>&2 ; exit 64
fi
#if $imageid has a length of non-zero call imageidvalidation else call getimageid.
if [[ -n $imageid ]]
then imageidvalidation
else
getimageidcurl
fi
#gets current launch-config
launch_config_current=`echo $asgresult | head -n 1 | cut -d ',' -f3`
aslcresult=`as-describe-launch-configs $launch_config_current --show-long --region $region --max-records 1000`
launch_config_security_group=`echo $aslcresult | cut -d ',' -f9`
launch_config_key=`echo $aslcresult | cut -d ',' -f5`
echo "The Auto Scaling Group \"$asgroupname\" uses the security group \"$launch_config_security_group\"." 1>&2
echo "The Auto Scaling Group \"$asgroupname\" uses the key \"$launch_config_key.\"" 1>&2
#code below searches for unique identifier for launch-config - without a unique identifier, launch config creation would fail.
unique_lc_name_found=0
lc_uniq_id=1
aslc_list=`as-describe-launch-configs --show-long --region $region --max-records 1000 | cut -d ',' -f2`
while [[ $unique_lc_name_found < 1 ]]
do
#tests if launch-config name will be unique
if [[ $aslc_list =~ "$asgroupname-$dateymd-id-$lc_uniq_id" ]]
then lc_uniq_id=$((lc_uniq_id+1))
else
unique_lc_name_found=1 ; #for testing "Launch Condifuration Named: \"$asgroupname-$dateymd-id-$lc_uniq_id.\""
fi
done
launchconfig_new="$asgroupname-$dateymd-id-$lc_uniq_id"
echo "A new Launch Configuration named \"$launchconfig_new\" for Auto Scaling Group \"$asgroupname\" will be created using EC2 Instance Type \"$instancetype\" and AMI \"$imageid.\""
#Create Launch Config
$previewmode as-create-launch-config $launchconfig_new --image-id $imageid --instance-type $instancetype --region $region --group $launch_config_security_group --key $launch_config_key --user-data-file $userdata
#
#Update Auto Scaling Group
$previewmode as-update-auto-scaling-group $asgroupname --region $region --launch-configuration $launchconfig_new