2012年9月23日日曜日

"Auto Scaling"で利用するAMIをアップデートしてみる

スズキです。

CDPネタです。今回も「Scale Outパターン」ですが、運用っぽい話です。


このパターンの「注意点」に
EC2内のアップデートが必要な場合は、Auto Scalingで起動する
元となるAMIもアップデートする必要がある。
といった記載があります。

今回は、下記でインストールしたコマンドラインツールで、
"Auto Scaling"で利用するAMIを 差し替えてみます。
コマンドラインツール使ってVPCで"Auto Scaling"
そもそも、AMIの情報は"Launch Config"で指定されています。
なので、"Launch Config"のAMI情報をアップデートすればよいと思うのですが、
"Launch Config"の情報をアップデートすることはできません。
そのかわり、"Launch Config"を指定している"Auto Scaling Group"の情報は
アップデートできます。
よって、新しいAMIを指定した"Launch Config"を作成し、既存の
"Auto Scaling Group"の"Launch Config"を、新しく作成した"Launch Config"に
アップデートする形となります。

それでは、上記を実際にコマンドラインツールで試してみます。

まずは新しいAMIで、新規の"Launch Config"を作成します。
# as-create-launch-config vpc-lc-20120923 \
> --image-id ami-f8fc41f9 \
> --group sg-40a7b72c,sg-877c60eb \
> --instance-type m1.small
OK-Created launch config

次に既存の"Auto Scaling Group"に指定されている"Launch Config"を、
新しく作成したものにアップデートします。
# as-update-auto-scaling-group vpc-ag-1 \
> --launch-configuration vpc-lc-20120923
OK-Updated AutoScalingGroup

対象の"Auto Scaling Group"が複数("Auto Scaling Group"の名前が"vpc-ag*")の場合は
下記のようにすれば効率的です。
# as-describe-auto-scaling-groups \
> | grep AUTO-SCALING-GROUP \
> | grep vpc-ag \
> | awk '{print $2}' \
> | xargs -I{} as-update-auto-scaling-group {} \
>   --launch-configuration vpc-lc-20120923
OK-Updated AutoScalingGroup
OK-Updated AutoScalingGroup

差し替えられた古い"Launch Config"は削除しておきます。
# as-delete-launch-config vpc-lc-20120922 \
> --force
OK-Deleted launch configuration

削除対象の"Launch Config"が複数("Launch Config"の名前が"vpc-lc*")の場合は
下記のようにすれば効率的です。
# as-describe-launch-configs \
> | grep vpc-lc- \
> | grep -v vpc-lc-20120923 \
> | awk '{print $2}' \
> | xargs -I{} as-delete-launch-config {} \
>   --force
OK-Deleted launch configuration
OK-Deleted launch configuration
OK-Deleted launch configuration

以上の手順をスクリプト化してみました。
  • 引数は"AMI ID"を一つ指定し、"Auto Scaling"するEC2のAMIを、
    指定したIDのものに変更します。
  • 新規に作成する"Launch Config"の名前はLAUNCH_CONFIG_PREFIXに
    タイムスタンプをつけたものとなります。
  • 対象の"Auto Scaling Group"は、名前がAUTO_SCALING_GROUP_PREFIXで
    始まる(含む)ものです。
  • 新規に作成し差し替えられた"Launch Config"以外の古いものは削除されます。
    (対象は名前がLAUNCH_CONFIG_PREFIXで始まる(含む)ものです)
#!/bin/sh

# エラー発生時にNGと終了ステータスコードを出力
set -e
trap 'echo NG:$?' ERR

# コマンドラインツールを利用する環境変数を指定(環境に応じて!)
export JAVA_HOME=/usr/lib/jvm/jre
export AWS_AUTO_SCALING_HOME=/opt/AutoScaling
export AWS_CREDENTIAL_FILE=$AWS_AUTO_SCALING_HOME/credential-as.txt
export AWS_AUTO_SCALING_URL=https://autoscaling.ap-northeast-1.amazonaws.com
export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin

# "Auto Scaling"の情報を指定(環境に応じて!)
LAUNCH_CONFIG_PREFIX=vpc-lc
AUTO_SCALING_GROUP_PREFIX=vpc-ag
SECURITY_GROUPS=sg-40a7b72c,sg-877c60eb
INSTANCE_TYPE=m1.small

# 新規に作成する"Launch Config"の名前を作成
TIMESTAMP=`date +"%Y%m%d%H%M%S"`
LAUNCH_CONFIG_NAME=${LAUNCH_CONFIG_PREFIX}-${TIMESTAMP}

# "Launch Config"を作成
echo CREATING LAUNCH CONFIG NAME: ${LAUNCH_CONFIG_NAME}
as-create-launch-config ${LAUNCH_CONFIG_NAME} \
--image-id $1 \
--group ${SECURITY_GROUPS} \
--instance-type ${INSTANCE_TYPE}

# 対象の"Auto Scaling Group"の"Launch Config"をアップデート
as-describe-auto-scaling-groups \
| grep AUTO-SCALING-GROUP \
| grep ${AUTO_SCALING_GROUP_PREFIX} \
| awk '{print $2}' \
| while read auto_scaling_group_name; do
    echo UPDATING AUTO SCALING GROUP NAME: ${auto_scaling_group_name}
    as-update-auto-scaling-group ${auto_scaling_group_name} \
    --launch-configuration ${LAUNCH_CONFIG_NAME}
done

# 古い"Launch Config"を削除
as-describe-launch-configs \
| grep ${LAUNCH_CONFIG_PREFIX} \
| grep -v ${LAUNCH_CONFIG_NAME} \
| awk '{print $2}' \
| while read launch_config_name; do
    echo DELETING LAUNCH CONFIG NAME: ${launch_config_name}
    as-delete-launch-config  ${launch_config_name} \
    --force
done

# 正常終了
echo OK:0
exit 0

実際に実行してみると下記のようになるはずです。
# ./as-change-ami.sh ami-f8fc41f9
CREATING LAUNCH CONFIG NAME: vpc-lc-20120923195402
OK-Created launch config
UPDATING AUTO SCALING GROUP NAME: vpc-ag-1
OK-Updated AutoScalingGroup
UPDATING AUTO SCALING GROUP NAME: vpc-ag-2
OK-Updated AutoScalingGroup
DELETING LAUNCH CONFIG NAME: vpc-lc-20120923195131
OK-Deleted launch configuration
OK:0

AMI変えたら、起動中の古いAMIのEC2も変えないといけない...
--------
http://www.suz-lab.com

0 コメント: