今回も、書籍(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も変えないといけないようです。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら