5.1. AutoScalingインスタンスのステータス更新¶
作業の目的 [why]¶
AutoScalingグループ"as-handson-cli"に属するインスタンスのステータスを更新します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
- EC2インスタンス"i-xxxxxxxxxxxxxxxxx"のヘルスステータスが"UNHEALTHY"で、ライフサイクルステータスが"Terminating"である。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
- AutoScalingグループ"as-handson-cli"が存在する。
- 事前条件2
- EC2インスタンス"i-xxxxxxxxxxxxxxxxx"が"as-handson-cli"に属している。
- 事前条件3
- EC2インスタンス"i-xxxxxxxxxxxxxxxxx"のヘルスステータスが"HEALTHY"で、ライフサイクルステータスが"InService"である。
前提と異なることが判明した場合、直ちに処理を中止します。
作業対象 [what]¶
- AutoScalingグループ内のインスタンス
標準時間¶
8分
前提条件¶
作業環境条件 [where]¶
本作業は、以下の作業環境で行います。
作業環境条件1: OSとバージョン
Amazon Linuxの以下のバージョンで動作確認済
コマンド:
cat /etc/issue | head -1
結果(例):
Amazon Linux AMI release 2016.09
作業環境条件2: シェルとバージョン
bashの以下のバージョンで動作確認済
コマンド:
bash --version -v | head -1
結果(例):
GNU bash, バージョン 4.2.46(1)-release (x86_64-redhat-linux-gnu)
作業環境条件3: AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.14.28
コマンド:
aws --version
結果(例):
aws-cli/1.14.31 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.8.35
バージョンが古い場合は最新版に更新しましょう。
コマンド:
sudo -H pip install -U awscli
開始条件¶
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: AutoScalingグループ名
- 操作するインスタンスが属するAutoScalingグループの名称です。
- 今回は"as-handson-cli"とします。
リソース2: AutoScalingインスタンス
- 操作するインスタンスです。
- 今回はヘルスステータスが"HEALTHY"のインスタンスのうちの1つとします。
タスクの実施¶
0. パラメータの指定¶
まず変数の確認をします。
変数の確認:
cat << ETX # 0.a. AWS_DEFAULT_PROFILE:"<AutoScalingのフル権限を許可されたプロファイル>" AWS_DEFAULT_PROFILE="${AWS_DEFAULT_PROFILE}" # 0.b. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. AS_GROUP_NAME:"as-handson-cli" AS_GROUP_NAME="${AS_GROUP_NAME}" # 0.2. EC2_INSTANCE_ID:"i-xxxxxxxxxxxxxxxxx" EC2_INSTANCE_ID="${EC2_INSTANCE_ID}" ETX
下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号について作業を行います。
0.2. AutoScalingインスタンスの指定¶
AutoScalingインスタンスを指定します。
まず、ヘルスステータスが"Healthy"のインスタンスを調べます。
変数の設定:
AS_INSTANCE_HEALTH_STATUS='HEALTHY'
コマンド:
aws autoscaling describe-auto-scaling-instances \ --query "AutoScalingInstances[?AutoScalingGroupName == \`${AS_GROUP_NAME}\` && HealthStatus == \`${AS_INSTANCE_HEALTH_STATUS}\`].[join(\`\`,[InstanceId,\`: \`,HealthStatus,\`: \`,LifecycleState])]"
結果(例):
[ [ "i-xxxxxxxxxxxxxxxxx: HEALTHY: InService" ] ]
インスタンスIDを変数に格納します。
変数の設定:
EC2_INSTANCE_ID="<操作対象とするインスタンスのインスタンスID>"
再確認¶
設定されている変数の内容を再確認します。
変数の確認:
cat << ETX # 0.a. AWS_DEFAULT_PROFILE:"<AutoScalingのフル権限を許可されたプロファイル>" AWS_DEFAULT_PROFILE="${AWS_DEFAULT_PROFILE}" # 0.b. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. AS_GROUP_NAME:"as-handson-cli" AS_GROUP_NAME="${AS_GROUP_NAME}" # 0.2. EC2_INSTANCE_ID:"i-xxxxxxxxxxxxxxxxx" EC2_INSTANCE_ID="${EC2_INSTANCE_ID}" ETX
1. 前処理¶
1.1. 処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: AutoScalingグループ"as-handson-cli"が存在する。
「AutoScalingグループ"as-handson-cli"が存在する。」ことを確認します。
コマンド:
aws autoscaling describe-auto-scaling-groups \ --auto-scaling-group-names ${AS_GROUP_NAME} \ --query 'AutoScalingGroups[].AutoScalingGroupName'
結果(例):
[ "as-handson-cli" ]
事前条件2: EC2インスタンス"i-xxxxxxxxxxxxxxxxx"が"as-handson-cli"に属している。
「EC2インスタンス"i-xxxxxxxxxxxxxxxxx"が"as-handson-cli"に属している。」ことを確認します。
コマンド:
aws autoscaling describe-auto-scaling-instances \ --instance-ids ${ARRAY_AS_INSTANCE_IDS} \ --query "AutoScalingInstances[].AutoScalingGroupName"
結果(例):
[ "as-handson-cli" ]
事前条件3: EC2インスタンス"i-xxxxxxxxxxxxxxxxx"のヘルスステータスが"HEALTHY"で、ライフサイクルステータスが"InService"である。
「EC2インスタンス"i-xxxxxxxxxxxxxxxxx"のヘルスステータスが"HEALTHY"で、ライフサイクルステータスが"InService"である。」ことを確認します。
コマンド:
aws autoscaling describe-auto-scaling-instances \ --instance-ids ${ARRAY_AS_INSTANCE_IDS} \ --query "AutoScalingInstances[].[join(\`\`,[InstanceId,\`: \`,HealthStatus,\`: \`,LifecycleState])]"
結果(例):
[ [ "i-xxxxxxxxxxxxxxxxx: HEALTHY: InService" ] ]
2. 主処理¶
AutoScalingインスタンスのステータス変更¶
変数の確認:
cat << ETX # EC2_INSTANCE_ID:"i-xxxxxxxxxxxxxxxxx" EC2_INSTANCE_ID="${EC2_INSTANCE_ID}" # AS_INSTANCE_HEALTH_SET_VALUE:"Unhealthy" AS_INSTANCE_HEALTH_SET_VALUE="${AS_INSTANCE_HEALTH_SET_VALUE}" ETX
コマンド:
aws autoscaling set-instance-health \ --instance-id ${EC2_INSTANCE_ID} \ --health-status ${AS_INSTANCE_HEALTH_SET_VALUE}
結果(例):
(戻り値なし)
3. 後処理¶
3.1. 完了条件の確認¶
主処理は、以下を満たしたときに成功したものとします。
完了条件1: EC2インスタンス"i-xxxxxxxxxxxxxxxxx"のヘルスステータスが"UNHEALTHY"で、ライフサイクルステータスが"Terminating"である。
「EC2インスタンス"i-xxxxxxxxxxxxxxxxx"のヘルスステータスが"UNHEALTHY"で、ライフサイクルステータスが"Terminating"である。」ことを確認します。
コマンド:
aws autoscaling describe-auto-scaling-instances \ --instance-ids ${ARRAY_AS_INSTANCE_IDS} \ --query "AutoScalingInstances[].[join(\`\`,[InstanceId,\`: \`,HealthStatus,\`: \`,LifecycleState])]"
結果(例):
[ [ "i-xxxxxxxxxxxxxxxxx: UNHEALTHY: Terminating" ] ]
"Terminating"が完了するとインスタンスが削除されるため、数分後にはコマンド結果は(出力なし)となります。
3.2. 後処理に必要な作業¶
ヘルスステータスが"Healthy"のインスタンスを調べます。
変数の設定:
AS_INSTANCE_HEALTH_STATUS='HEALTHY'
コマンド:
aws autoscaling describe-auto-scaling-instances \ --query "AutoScalingInstances[?AutoScalingGroupName == \`${AS_GROUP_NAME}\` && HealthStatus == \`${AS_INSTANCE_HEALTH_STATUS}\`].[join(\`\`,[InstanceId,\`: \`,HealthStatus,\`: \`,LifecycleState])]"
結果(例):
[ [ "i-xxxxxxxxxxxxxxxxx: HEALTHY: InService" ] ]
AutoScalingインスタンスの数がDesiredを下回る場合は、新しいインスタンスが起動し、一定時間後に一覧に追加されます。