一覧CL-05-2 · 仮想マシンの配備

インスタンスの再起動・停止・中断

VMの状態だけでなく、保存場所・IP割当て・アプリの健康状態を別々に確認し、再開に必要な記録を選べるようになります。

説明

VMが持つ状態には、RAM、一時的なinstance store、永続的なEBSなどがあります。再起動・停止・終了では失われる範囲が違い、同じデータでも保存場所によって復旧できる時点が変わります。

EBS起動の固定VMを使い、RAMの処理番号7、一時領域の作業途中データ、EBS上のチェックポイント6を確認します。再起動と停止・再開を比較した後、Spotの終了通知に対してチェックポイント7を保存し、終了後に残るものを調べます。

VMの状態だけでなく、保存場所・IP割当て・アプリの健康状態を別々に確認し、再開に必要な記録を選べるようになります。

1どこに処理状態が保存されているか

RAM、instance_store、ebs_root、ebs_dataを別々の欄で確認します。public IPv4は自動割当てで、Elastic IPは使いません。

cat scope.txtVMと保存領域の条件を読む python3 lifetime.py init初期の状態記録を用意する python3 lifetime.py show各保存場所とIPを確認する

RAMにはjob=7がありますが、EBSに保存されたcheckpointは6です。終了によってRAMが失われると、再開に使えるのは保存済みの6までです。

2インスタンスの稼働状態とアプリの正常性

healthの三つの項目を取り出します。systemとinstanceは基盤・インスタンス側、applicationはアプリ側の確認結果です。

python3 -c "import json; s=json.load(open('state.json')); print(s['state']VMの稼働状態を読む); print(s['health']基盤とアプリの確認結果を読む)"

VMはrunning、systemとinstanceはokでも、applicationはfailedです。基盤の状態だけでは、利用者の要求をアプリが処理できることまで保証しません。

3再起動で残る保存領域

rebootの状態変化を適用します。

python3 lifetime.py reboot再起動時の状態変化を適用する python3 lifetime.py show残るデータと再初期化された状態を読む

RAMは空になり、アプリはstartingです。EBSとinstance storeは残り、private/public IPも同じです。再起動でプロセスのメモリ状態がそのまま保持されるわけではありません。

4停止すると一時領域も失われる

VMをstopした場合を確認します。

python3 lifetime.py stop停止時の状態変化を適用する python3 lifetime.py show一時領域と永続領域の差を確認する

state=stopped、RAMとinstance_storeは空、public IPはNoneになります。EBSのconfig=v1とcheckpoint=6は残ります。instance storeの作業途中データは、停止後の復旧には使えません。

5再開後のIPと復旧点

停止状態からstartします。

python3 lifetime.py start停止したVMを再開した状態へ進める python3 lifetime.py showIPと永続データを照合する

private IPは10.0.1.10のままですが、自動割当てpublic IPは203.0.113.20になります。EBSのcheckpoint=6から再開位置を判断できます。IPやローカル一時ファイルが前と同じだと仮定した処理は、再開後に見直す必要があります。

6Spotの中断動作を読む

初期状態へ戻し、10:00に受け取った10:02終了予定の通知を適用します。この例の中断動作はterminateです。

python3 lifetime.py init中断前の独立した初期状態へ戻す python3 lifetime.py notice固定の終了予定通知を記録する python3 lifetime.py show通知段階の状態を確認する

通知を受けた段階ではrunningです。Spotの中断は設定により終了・停止・休止があり、この例では終了に備えます。通知や猶予を常に得られる前提だけにせず、普段から再開点を保存する設計も必要です。

7処理結果を永続領域へ確定する

処理番号7まで完了したという固定条件で、追加EBSへcheckpoint=7を保存します。

python3 lifetime.py checkpoint完了済みの処理位置を追加EBSへ保存する python3 lifetime.py show永続側の再開点を確認する

RAMのjob=7だけでなく、EBSにもcheckpoint=7が残りました。実際の処理では、結果の確定と再開点の更新が対応するようにし、未完了の処理を完了済みとして記録しないことが必要です。

8終了後に残った再開点

予定された終了を適用します。rootは終了時に削除、dataは保持する設定です。

python3 lifetime.py interrupt終了と各保存領域の削除設定を適用する python3 lifetime.py show終了後に残った永続記録を確認する

VMはterminated、RAMとinstance storeは空、rootはNoneです。一方、追加EBSのcheckpoint=7は残ります。再開には別VMへの接続やアプリの起動が必要ですが、どこまで確定したかを判断する記録は保持できました。

まとめ

再起動・停止・終了では、RAM・instance store・EBSの保持範囲が違います。

VMのrunningや基盤の正常性と、アプリの利用可能性は別に確認します。

処理結果と対応する再開点を永続化し、中断後に使える保存場所へ残します。

操作履歴と解説を振り返れます。

シェル / Python 3

1
cat scope.txt python3 lifetime.py init python3 lifetime.py show
EBS起動のVM。instance storeに一時作業、EBS追加volumeにcheckpointを保存する。
public IPv4は自動割当てで、Elastic IPは使わない。
rebootはRAMを再初期化し、EBSとinstance storeを保持。
stopはRAMとinstance storeを失い、EBSを保持。startでpublic IPv4を再割当て。
terminateは各volumeの削除設定に従う。
Spotの中断動作はこの例ではterminate。通知時刻と完了時刻は固定シナリオ。
initial state loaded
{
  "delete_data_on_termination": false,
  "delete_root_on_termination": true,
  "ebs_data": {
    "checkpoint": 6
  },
  "ebs_root": {
    "config": "v1"
  },
  "health": {
    "application": "failed",
    "instance": "ok",
    "system": "ok"
  },
  "instance_store": {
    "scratch": "part-7"
  },
  "notice": null,
  "private_ip": "10.0.1.10",
  "public_ip": "203.0.113.10",
  "ram": {
    "job": 7
  },
  "state": "running"
}
2
python3 -c "import json; s=json.load(open('state.json')); print(s['state']); print(s['health'])"
running
{'system': 'ok', 'instance': 'ok', 'application': 'failed'}
3
python3 lifetime.py reboot python3 lifetime.py show
state=running
{
  "delete_data_on_termination": false,
  "delete_root_on_termination": true,
  "ebs_data": {
    "checkpoint": 6
  },
  "ebs_root": {
    "config": "v1"
  },
  "health": {
    "application": "starting",
    "instance": "ok",
    "system": "ok"
  },
  "instance_store": {
    "scratch": "part-7"
  },
  "notice": null,
  "private_ip": "10.0.1.10",
  "public_ip": "203.0.113.10",
  "ram": {},
  "state": "running"
}
4
python3 lifetime.py stop python3 lifetime.py show
state=stopped
{
  "delete_data_on_termination": false,
  "delete_root_on_termination": true,
  "ebs_data": {
    "checkpoint": 6
  },
  "ebs_root": {
    "config": "v1"
  },
  "health": {
    "application": "starting",
    "instance": "ok",
    "system": "ok"
  },
  "instance_store": {},
  "notice": null,
  "private_ip": "10.0.1.10",
  "public_ip": null,
  "ram": {},
  "state": "stopped"
}
5
python3 lifetime.py start python3 lifetime.py show
state=running
{
  "delete_data_on_termination": false,
  "delete_root_on_termination": true,
  "ebs_data": {
    "checkpoint": 6
  },
  "ebs_root": {
    "config": "v1"
  },
  "health": {
    "application": "starting",
    "instance": "ok",
    "system": "ok"
  },
  "instance_store": {},
  "notice": null,
  "private_ip": "10.0.1.10",
  "public_ip": "203.0.113.20",
  "ram": {},
  "state": "running"
}
6
python3 lifetime.py init python3 lifetime.py notice python3 lifetime.py show
initial state loaded
notice received at 10:00 UTC, action=terminate at 10:02 UTC
state=running
{
  "delete_data_on_termination": false,
  "delete_root_on_termination": true,
  "ebs_data": {
    "checkpoint": 6
  },
  "ebs_root": {
    "config": "v1"
  },
  "health": {
    "application": "failed",
    "instance": "ok",
    "system": "ok"
  },
  "instance_store": {
    "scratch": "part-7"
  },
  "notice": {
    "action": "terminate",
    "time": "2026-11-01T10:02:00Z"
  },
  "private_ip": "10.0.1.10",
  "public_ip": "203.0.113.10",
  "ram": {
    "job": 7
  },
  "state": "running"
}
7
python3 lifetime.py checkpoint python3 lifetime.py show
checkpoint=7 persisted to data volume
state=running
{
  "delete_data_on_termination": false,
  "delete_root_on_termination": true,
  "ebs_data": {
    "checkpoint": 7
  },
  "ebs_root": {
    "config": "v1"
  },
  "health": {
    "application": "failed",
    "instance": "ok",
    "system": "ok"
  },
  "instance_store": {
    "scratch": "part-7"
  },
  "notice": {
    "action": "terminate",
    "time": "2026-11-01T10:02:00Z"
  },
  "private_ip": "10.0.1.10",
  "public_ip": "203.0.113.10",
  "ram": {
    "job": 7
  },
  "state": "running"
}
8
python3 lifetime.py interrupt python3 lifetime.py show
state=terminated
{
  "delete_data_on_termination": false,
  "delete_root_on_termination": true,
  "ebs_data": {
    "checkpoint": 7
  },
  "ebs_root": null,
  "health": {
    "application": "failed",
    "instance": "ok",
    "system": "ok"
  },
  "instance_store": {},
  "notice": {
    "action": "terminate",
    "time": "2026-11-01T10:02:00Z"
  },
  "private_ip": "10.0.1.10",
  "public_ip": null,
  "ram": {},
  "state": "terminated"
}

演習完了