initial commit from code.google.com
This commit is contained in:
32
as-update-launch-config/README.txt
Normal file
32
as-update-launch-config/README.txt
Normal 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
|
||||
157
as-update-launch-config/as-update-launch-config.sh
Executable file
157
as-update-launch-config/as-update-launch-config.sh
Executable 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
|
||||
Reference in New Issue
Block a user