Auto Scaling のライフサイクルフックの使い方 ── インスタンスの終了前にデータの退避を済ませる
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| 起動テンプレート | soa-lifecycle-template | Amazon Linux 2023・t3.micro | EC2 Auto Scaling で落ちても自動で戻る Web サーバーを作る |
| Auto Scaling グループ | soa-lifecycle-asg | soa-lab-vpc のパブリックサブネット(1a・1c)。最小 0・希望 1・最大 1。インスタンス 1 台が InService | 同上 ※ロードバランサーは付けない |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| ライフサイクルフック | soa-terminate-hook | インスタンスの終了前に待機させる |
手順 1: 終了時のライフサイクルフックを作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに EC2 と入力し、「EC2」を選択します。
左側ナビゲーションの「Auto Scaling」→「Auto Scaling グループ」を選択し、soa-lifecycle-asg を開きます。「インスタンス管理」タブを選択し、インスタンスが 1 台 InService になっていることを確認します。
同じタブの「ライフサイクルフック」のセクションで「ライフサイクルフックを作成する」をクリックし、以下を設定します。
- ライフサイクルフック名:
soa-terminate-hook - ライフサイクル移行: 「インスタンス終了」
- ハートビートタイムアウト:
600秒(既定値は 3600 秒。手順を確かめやすいよう短めにしています) - デフォルトの結果: 「CONTINUE」(既定値は ABANDON なので変更します)
その他の項目はデフォルトのままにして、「作成」をクリックします。
手順 2: 希望する容量を 0 にする
「詳細」タブを選択し、「グループの詳細」の「編集」をクリックします。
- 希望する容量:
0
最小容量・最大容量はそのままにして、「更新」をクリックします。グループのステータスが「容量の更新」になり、インスタンスを 1 台終了しようとします。
手順 3: Terminating:Wait で待っていることを確かめる
「インスタンス管理」タブを選択します。インスタンスの「ライフサイクル」が Terminating:Wait になっています(表示が変わらない場合は、更新ボタンで一覧を読み込み直します)。
左側ナビゲーションの「インスタンス」→「インスタンス」を開くと、このインスタンスはまだ「実行中」です。終了は決まっていますが、フックの待機中なので、インスタンス上で退避などの処理を動かせる状態です。
手順 4: CloudShell で待機中のインスタンスを確かめ、待機を延ばす
上部のツールバーの CloudShell アイコンをクリックして AWS CloudShell を開き、次のコマンドで待機中のインスタンスを確認します。
aws autoscaling describe-auto-scaling-instances \
--query "AutoScalingInstances[?AutoScalingGroupName=='soa-lifecycle-asg'].[InstanceId,LifecycleState]" \
--output table
インスタンス ID と、Terminating:Wait の状態が表示されます。表示されたインスタンス ID を変数に入れ、ハートビートを送って待機を延ばします。
INSTANCE_ID=<表示されたインスタンス ID>
aws autoscaling record-lifecycle-action-heartbeat \
--lifecycle-hook-name soa-terminate-hook \
--auto-scaling-group-name soa-lifecycle-asg \
--instance-id $INSTANCE_ID
何も表示されなければ成功です。タイムアウトまでの 600 秒が、ここから数え直されます。
手順 5: ライフサイクルアクションを完了する
退避が終わったものとして、complete-lifecycle-action で CONTINUE を返します。
aws autoscaling complete-lifecycle-action \
--lifecycle-action-result CONTINUE \
--lifecycle-hook-name soa-terminate-hook \
--auto-scaling-group-name soa-lifecycle-asg \
--instance-id $INSTANCE_ID
続けて、状態を確認します。
aws autoscaling describe-auto-scaling-instances --instance-ids $INSTANCE_ID \
--query "AutoScalingInstances[].[InstanceId,LifecycleState]" --output table
Terminating:Proceed が表示されます(すでに終了していれば、何も表示されません)。
手順 6: 終了したことを確かめる
EC2 のコンソールに戻り、soa-lifecycle-asg の「アクティビティ」タブを選択します。「アクティビティ履歴」の最新の行で、インスタンスの終了(Terminating EC2 instance: i-...)のステータスが「成功」になっていることを確認します。開始時刻から終了時刻までの間が、フックで待機していた時間です。
「インスタンス管理」タブを開くと、インスタンスはグループから無くなっています。