シェルスクリプトによる AWS の操作

シェルスクリプトで 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 を直接記述する事で上記制限はなくなります。

```sh:add2as
#!/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 名を直接記述する事で上記制限はなくなります。

```sh:add2elb
#!/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 名を記述する事で上記制限はなくなります。

```sh:del2elb
#!/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}"
```