今回も、書籍(Amazon Web Servicesクラウドデザインパターン設計ガイド)からCloud Design Pattern(CDP)の記事になります。
今回は「Scale Outパターン」に関して、運用よりの話になります。
このパターンの「注意点」に下記のような記載があります。
EC2内のアップデートが必要な場合は、Auto Scalingで起動する元となるAMIもアップデートする必要がある。
今回は、以前紹介した記事「コマンドラインツール使ってVPCでAuto Scaling」内で紹介した
コマンドラインツールで、Auto Scalingで利用するAMIを差し替えてみます。
そもそも、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も変えないといけないようです。