シェルスクリプトで AWS の ELB 関係の処理を実行します。
aws コマンドを利用しているので role の設定などにより aws が正しく動作する必要があります。
add2as
EC2 インスタンスを生成して AutoScaling Group に追加します。
処理内容
内部では AutoScaling Policy を取得して実行しているだけです。
AutoScaling されているので AutoScaling Policy に従って自動的に terminate します。
制限
スクリプト中では AutoScaling Group と AutoScaling Policy を自動取得しているので以下に示す制限があります。
- AutoScaling Group は1個のみ定義されている事
- AutoScaling Policy は 1以上の増分指定されているものを利用
スクリプト中に AutoScaling Group と AutoScaling Policy を直接記述する事で上記制限はなくなります。
#!/bin/sh
logfile="/var/log/${0##*/}.log"
region="--region ap-northeast-1"
output="--output text"
aws="/usr/bin/aws ${region} ${output}"
as_query="--query AutoScalingGroups[*].AutoScalingGroupName"
policy_query="--query ScalingPolicies[*].[PolicyName,ScalingAdjustment]"
exec >> ${logfile}
echo "[`LANG=C date '+%Y/%m/%d %H:%M:$s'`] ${0##*/}: start"
# AutoScaling Group と AutoScaling Policy を自動取得する
# ここに直接記述する事で自動取得に関する制限はなくなる
as=`${aws} autoscaling describe-auto-scaling-groups ${as_query}`
policy=`${aws} autoscaling describe-policies ${policy_query} | awk '$2 > 0 { print $1; exit }'`
cat << EOF
AutoScalingGroup: ${as}
Policy: ${policy}
EOF
${aws} autoscaling execute-policy --auto-scaling-group-name ${as} --policy-name ${policy}
echo "[`LANG=C date '+%Y/%m/%d %H:%M:$s'`] Execute Poicy(${policy}) to AutoScalingGroup: ${as}"
add2elb
EC2 インスタンスを生成して ELB に追加します。
処理内容
AutoScaling されていないので(例えば)負荷が減少するなどしても ELB から削除されません。
生成した EC2 インスタンスには以下のタグ情報が設定されます。
- Name タグに ホスト名(web.ドメイン名) を設定
- CreatedBy タグに "add2elb" を設定
制限
スクリプト中では ELB 名、AMI 名、Security Policy名、IAM role 名を自動取得しているので以下に示す制限があります。
- AMI は web.ドメイン名 の Name タグが指定されている事
- ELB は1個のみ定義されている事
- セキュリティポリシーは1個のみ定義されている事
- IAM roleは1個のみ定義されている事
スクリプト中に ELB 名、AMI 名、Security Policy 名、IAM role 名を直接記述する事で上記制限はなくなります。
#!/bin/sh
logfile="/var/log/${0##*/}.log"
region="--region ap-northeast-1"
output="--output text"
type="m3.2xlarge"
tags="add2elb"
exec >> ${logfile}
hostname="web`hostname | sed 's/^[^\.]*//g'`"
filter="--filters Name=tag:Name,Values=${hostname}"
aws="/usr/bin/aws ${region} ${output}"
ami_query="--query Images[*][ImageId]"
ec2_query="--query Instances[*][InstanceId]"
elb_query="--query LoadBalancerDescriptions[*].LoadBalancerName"
role_query="--query Roles[*].RoleName"
sec_query="--query SecurityGroups[*].GroupName"
echo "[`LANG=C date '+%Y/%m/%d %H:%M:$s'`] ${0##*/}: start"
# AMI名、Security Policy、IAM role名、ELB名を自動取得する
# ここに直接記述する事で自動取得に関する制限はなくなる
ami=`${aws} ec2 describe-images --owners self ${filter} ${ami_query}`
sec=`${aws} ec2 describe-security-groups ${sec_query} | sed 's/[ ]*default[ ]*//g'`
role=`${aws} iam list-roles ${role_query}`
elb=`${aws} elb describe-load-balancers ${elb_query}`
cat <<EOF
AMI: ${ami}
Security Group: ${sec}
IAM role: ${role}
EOF
test -n "${role}" && role="--iam-instance-profile Name=${role}"
ec2=`${aws} ec2 run-instances --image-id ${ami} --security-groups ${sec} --instance-type ${type} ${role} ${ec2_query}`
${aws} ec2 create-tags --resources ${ec2} --tags Key=Name,Value=${hostname} Key=CreatedBy,Value=${tags}
${aws} elb register-instances-with-load-balancer --load-balancer-name ${elb} --instances ${ec2}
echo "[`LANG=C date '+%Y/%m/%d %H:%M:$s'`] EC2(${ec2}) add to ELB: ${elb}"
del2elb
EC2 インスタンスを ELB から削除して EC2 インスタンス自体も削除します。
処理内容
add2elb で追加された EC2 インスタンスを ELB から削除し EC2 インスタンス自体も terminate します。
CreatedBy タグに "add2elb" が設定されているインスタンスを取得して ELB から除外します。
制限
スクリプト中では ELB 名を自動取得しているので以下に示す制限があります。
- ELB は1個のみ定義されている事
スクリプト中に ELB 名を記述する事で上記制限はなくなります。
#!/bin/sh
logfile="/var/log/${0##*/}.log"
region="--region ap-northeast-1"
output="--output text"
tags="add2elb"
exec >> ${logfile}
aws="/usr/bin/aws ${region} ${output}"
name_query="--query LoadBalancerDescriptions[*].LoadBalancerName"
elb_query="--query LoadBalancerDescriptions[*].Instances"
ec2_query="--query Reservations[*].Instances[*].InstanceId"
filter="--filters Name=tag:CreatedBy,Values=${tags} Name=instance-state-name,Values=running"
echo "[`LANG=C date '+%Y/%m/%d %H:%M:$s'`] ${0##*/}: start"
# ELB 名を自動取得する
# ここに直接記述する事で自動取得に関する制限はなくなる
elb=`${aws} elb describe-load-balancers ${name_query}`
set -- `${aws} ec2 describe-instances --instance-ids \`${aws} elb describe-load-balancers ${elb_query}\` ${filter} ${ec2_query}`
if [ -n "${1}" ]
then
cat<<-EOF
EC2: ${1}
ELB: ${elb}
EOF
${aws} elb deregister-instances-from-load-balancer --load-balancer-name ${elb} --instances ${1}
${aws} ec2 terminate-instances --instance-ids ${1}
fi
echo "[`LANG=C date '+%Y/%m/%d %H:%M:$s'`] EC2(${i}) delete from ELB: ${elb}"