LoginSignup
63
60

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-08-14

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

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 名を直接記述する事で上記制限はなくなります。

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 名を記述する事で上記制限はなくなります。

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}"
63
60
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
60