2.2.3 スケールイン開始前にスナップショットログ出力処理時間分の猶予を設ける
実行可能JAR/WARプロセスをオートスケーリング構成のマシン上で実行している場合,本製品がスナップショットログの収集処理をしている間は,できる限りマシンがスケールインされないようにする必要があります。
- ユーザスクリプトによる閉塞をすることで自動的にスケールインされないように構築している場合
-
このケースに該当する場合は,実行可能JAR/WARプロセスの停止後にスケールインを実行するスクリプトが実行されるように設定してください。これによって,スナップショットログ出力処理が終わるまでスケールインされないようにできます。
systemdを用いてOS起動と同時に実行可能JAR/WARをサービス起動させ,実行可能JAR/WARプロセスの停止後にスケールインを実行する場合のユニットファイル定義例を次に示します。
[Unit] Description=Spring Boot Application After=network.target [Service] Type=simple WorkingDirectory=<実行可能JAR/WARを実行する際のカレントディレクトリのパス> ExecStart=<本製品のインストール先>/bin/starter.sh <実行可能JAR/WARの起動コマンドライン> ExecStop=/bin/kill $MAINPID ExecStopPost=<スケールインを実行するスクリプトのパス> TimeoutStopSec=700 SuccessExitStatus=143 User=myuser Group=mygroup [Install] WantedBy=multi-user.target
AWSでAmazon EC2 Auto Scalingを使用している場合のスケールインを実行するスクリプトの実装例を次に示します。
#!/bin/bash # Get InstanceID TOKEN=$(curl -X PUT http://169.254.169.254/latest/api/token \ -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") INSTANCEID=$(curl http://169.254.169.254/latest/meta-data/instance-id/ \ -H "X-aws-ec2-metadata-token: ${TOKEN}") echo InstanceID=${INSTANCEID} # Polling Instance status MAX_POLLING_COUNT=10 RETRY_INTERVAL=60 for ((i=1;i<=${MAX_POLLING_COUNT};i++)); do INSTSTATUS=$(aws autoscaling describe-auto-scaling-instances --instance-ids ${INSTANCEID} \ | jq -r '.AutoScalingInstances[].LifecycleState') echo InstanceStatus=${INSTSTATUS} if [ "${INSTSTATUS}" == "Standby" ]; then # Terminate instance aws autoscaling terminate-instance-in-auto-scaling-group --instance-id ${INSTANCEID} \ --no-should-decrement-desired-capacity echo "Instance will be terminated." exit 0 fi if [ ${i} -eq ${MAX_POLLING_COUNT} ]; then echo "Max polling count reached (count = ${i})." exit 1 fi echo "InstanceStatus is not STANDBY. Retry after ${RETRY_INTERVAL} seconds (count = ${i})." sleep ${RETRY_INTERVAL}s done注
このスクリプトは実装例であり,これをそのまま使用した場合の動作は保証しません。必ずクラウドベンダが提供する最新のドキュメントを参照してユーザ側で適切なスクリプトを記述してください。
また,実行するコマンドがインストール済みかどうか,コマンドの実行に必要な権限があるかどうかに注意してください。
- オートスケーリンググループからの切り離しと同時にスケールインに遷移するように設定している場合(マネージドサービス側で管理)
-
スナップショットログの出力に掛かる時間を確保できる,十分な猶予時間を設定してください。猶予時間とは,障害を検知されたマシンがオートスケーリンググループから切り離されてから,OSのシャットダウンが開始されるまでの時間を指します。