2016年7月24日日曜日

[AWS] aws-cli で AutoScaling の AMI を差し替える


aws-cli を使用して、AutoScaling のAMIを差し替えてみます。

AutoScaling の AMI を差し替えるには、新しい起動設定を作成して、AutoScalingGroup の起動設定を変更します。

既存の起動設定をコピーして「起動設定の名称」と「AMI-ID」だけを変更したかったので、以下のようなシェルをつくりました。
[root@localhost packer]# cat as_config_copy.sh
#!/bin/bash

CRT_CONFIG_NAME="web01-001"
NEW_CONFIG_NAME="web01-002"
NEW_AMI_ID="ami-6869aa05"

# 現在の起動設定をJSON形式で取得
aws autoscaling describe-launch-configurations \
 --launch-configuration-names ${CRT_CONFIG_NAME} \
 --output json \
 | jq .LaunchConfigurations[0] \
 > /tmp/xxx.tmp1

# 不要な情報を削除
cat /tmp/xxx.tmp1 \
 | egrep -v '^ *"RamdiskId"|^ *"KernelId"|^ *"LaunchConfigurationARN"|^ *"CreatedTime"|^ *"ClassicLinkVPCSecurityGroups"' \
 > /tmp/xxx.tmp2

# 起動設定の名称とAMI-IDを変更
cat /tmp/xxx.tmp2 \
 | sed -e "s/^\( *\"LaunchConfigurationName\": \)[^ ]*$/\1\"${NEW_CONFIG_NAME}\",/" \
 | sed -e "s/^\( *\"ImageId\": \)[^ ]*$/\1\"${NEW_AMI_ID}\",/" \
 > /tmp/xxx.tmp3

# 新しい起動設定を作成
new_config=`cat /tmp/xxx.tmp3`
eval "aws autoscaling create-launch-configuration --cli-input-json '${new_config}'"

rm /tmp/xxx.tmp1
rm /tmp/xxx.tmp2
rm /tmp/xxx.tmp3

exit 0

このシェルを使用して、AutoScaling のAMIを差し替えてみます。

まず、現在の起動設定と、AutoScalingGroupを確認します。
[root@localhost ~]# aws autoscaling describe-launch-configurations --query "LaunchConfigurations[].[LaunchConfigurationName,ImageId]"
-------------------------------
|DescribeLaunchConfigurations |
+------------+----------------+
|  web01-001 |  ami-5d901b4a  |
+------------+----------------+
[root@localhost ~]# aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[].[AutoScalingGroupName,LaunchConfigurationName]"
---------------------------
|DescribeAutoScalingGroups|
+-----------+-------------+
|  WebGroup |  web01-001  |
+-----------+-------------+

上記のシェルで web01-001 をコピーして web01-002 という名称に変更し、AMI-ID も変更した起動設定を作成します。
[root@localhost ~]# bash ./packer/as_config_copy.sh
[root@localhost ~]# aws autoscaling describe-launch-configurations --query "LaunchConfigurations[].[LaunchConfigurationName,ImageId]"
-------------------------------
|DescribeLaunchConfigurations |
+------------+----------------+
|  web01-001 |  ami-5d901b4a  |
|  web01-002 |  ami-6869aa05  |
+------------+----------------+

AutoScalingGroupの "WebGroup" の起動設定を "web01-002" に変更します。
[root@localhost ~]# aws autoscaling update-auto-scaling-group --auto-scaling-group-name "WebGroup" --launch-configuration-name "web01-002"
[root@localhost ~]# aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[].[AutoScalingGroupName,LaunchConfigurationName]"
---------------------------
|DescribeAutoScalingGroups|
+-----------+-------------+
|  WebGroup |  web01-002  |
+-----------+-------------+

最後に、不要になった起動設定の "web01-001" を削除します。
root@localhost ~]# aws autoscaling delete-launch-configuration --launch-configuration-name "web01-001"
[root@localhost ~]# aws autoscaling describe-launch-configurations --query "LaunchConfigurations[].[LaunchConfigurationName,ImageId]"
-------------------------------
|DescribeLaunchConfigurations |
+------------+----------------+
|  web01-002 |  ami-6869aa05  |
+------------+----------------+

以上でAutoScalingのAMIを差し替えられました。

起動中のEC2インスタンスは、古いままなので、
一度、EC2インスタンスをSTOPすれば、新しいAMIでEC2インスタンスが起動します。