AWS EC2 VISUALIZER

EC2 インスタンスのライフサイクル(状態遷移)

クラウド上で仮想サーバーを起動・管理できるコンピューティングサービス

シナリオ
EC2インスタンスの状態遷移と課金の関係
ステップ1 / 5
ステップ
run-instances を実行。状態: pending(起動準備中)
run-instancesを実行するとインスタンスはまずpending状態になります。AMIからルートボリュームが作成され、ENIが割り当てられ、物理ホストに配置されます。pending中はまだ課金されません。
STATE MACHINE
EC2インスタンスの状態遷移図
STEP 1
CODE VIEW
── アクション: run-instances ──
 
$ aws ec2 run-instances \
--image-id ami-0abc1234def56789 \
--instance-type t3.medium
 
State: pending
 
処理中:
├─ AMIからEBSボリュームを作成
├─ ENI(ネットワークIF)の割り当て
└─ 物理ホストへのスケジューリング
 
💰 課金: まだ開始されていない
pending
running
stopping / stopped
shutting-down / terminated
解説

💰
状態と課金の関係

EC2の課金はrunning状態の間のみ発生します(秒単位、最低60秒)。stopped状態ではEC2の課金は停止しますが、EBSボリュームの課金は継続します。terminated状態になるとすべての課金が停止します。

より具体的には、running状態ではコンピュート料金が秒単位(最低60秒)で発生します。stopped状態ではコンピュート料金は停止しますが、アタッチされたEBSボリュームのストレージ料金と、関連付けられたElastic IPアドレス(未使用状態)の料金は引き続き発生します。terminated状態ではすべてのリソースが解放され課金が停止しますが、データも失われます。コスト最適化のためには、不要なインスタンスはstoppedのまま放置せず、terminateするかEBSスナップショットを取得してボリュームを削除することが重要です。

イメージで理解: EC2のライフサイクルは、レンタカーの利用状態と似ています。「running(走行中)」は課金中、「stopped(駐車場に停めた)」はガソリン代は不要だけど駐車場代(EBSストレージ)はかかる、「terminated(返却)」は完全に返却して課金ゼロ。ただしterminatedにするとデータも消えるので注意です。
pendingrunningstoppingstoppedterminated課金中EBS課金のみ課金なし
runningEC2: 課金あり / EBS: 課金あり
stoppedEC2: 課金なし / EBS: 課金あり
terminatedEC2: 課金なし / EBS: デフォルト設定次第

🚫
terminated は復元不可

terminated状態は不可逆です。一度terminateしたインスタンスは、どのような手段を使っても復元できません。ルートEBSボリュームもデフォルト設定(DeleteOnTermination=true)では一緒に削除されます。つまり、OS設定やアプリケーションデータなど、ボリュームに保存されていたすべての情報が失われます。

このリスクに備えるために、いくつかの予防策を講じることが重要です。まずTermination Protectionを有効にして、API/コンソールからの誤操作を防止します。次に、定期的にAMI(Amazon Machine Image)を取得しておけば、同じ構成で新しいインスタンスをすぐに起動できます。さらに、重要なデータが入ったEBSボリュームについてはスナップショットを定期的に取得することで、データの復元ポイントを確保できます。

なお、terminated状態のインスタンスはコンソール上にしばらく表示され続けますが、これは記録としての表示であり、復元操作はできません。通常、数時間以内にコンソールからも消えます。

runningterminateterminated復元不可EBS (default: 削除)Instance Store: 消失AMI/Snapshot: 残る
予防策まとめ: (1) Termination Protectionを有効化、(2) AMIを定期取得、(3) EBSスナップショットを定期取得、(4) 重要なEBSボリュームはDeleteOnTermination=falseに設定してterminateしてもボリュームを残す。

🔀
stop/start でホストが変わる

EC2インスタンスをstop → startすると、AWSはそのインスタンスを別の物理ホスト(サーバー)に再配置する可能性があります。AWSのデータセンターには何万台もの物理サーバーがあり、stopすると元の物理サーバー上のリソースは解放されます。startすると、空いている別の物理サーバーに配置されるため、いくつかの情報が変わります。

具体的に影響を受けるのは以下の2つです。

パブリックIPアドレスが変更される

パブリックIPはAWSの動的プールから割り当てられるため、stop/startのたびに新しいIPが付与されます。固定IPが必要な場合はElastic IPをアタッチしてください。

インスタンスストアのデータが消失する

インスタンスストアは物理ホストのローカルディスクです。ホストが変わるとデータにアクセスできなくなります。EBSボリュームのデータやプライベートIP、ENIはそのまま保持されます。

reboot との違い: reboot-instancesはOSレベルの再起動なので、同じ物理ホストに留まり、パブリックIPもインスタンスストアも保持されます。
Physical Host AEC2stopstoppedstartPhysical Host B (別)EC2IP: 54.1.2.3IP: 13.4.5.6 (変更!)Instance Store データは Host A に残り、Host B からアクセス不可
stop/startPublic IP: 変更される / Instance Store: 消失 / Private IP: 保持 / EBS: 保持
rebootPublic IP: 保持 / Instance Store: 保持 / Private IP: 保持 / EBS: 保持

🛡
Termination Protection(終了保護)

Termination Protection(DisableApiTermination)は、AWS API やマネジメントコンソールからの terminate 操作をブロックする安全機構です。うっかり本番サーバーを terminate してしまう事故は実際に発生しうるため、この機能は非常に重要です。有効にすると、terminate を実行しようとしても「The instance may not be terminated」というエラーが返され、操作が拒否されます。

ただし、Termination Protection が防げないケースもあります。OS 内部からのshutdown -h nowコマンド(InstanceInitiatedShutdownBehavior が terminate の場合)、Auto Scaling のスケールインによるterminate、Spot インスタンスの中断はこの保護の対象外です。Auto Scaling 環境では別途Instance Scale-in Protectionを設定する必要があります。

本番環境では、Termination Protection に加えて、IAM ポリシーで ec2:TerminateInstances を制限する多層防御が推奨されます。さらにCloudTrailでterminate操作を監査ログとして記録し、誰がいつ操作したか追跡できるようにしておくと安心です。

Protection ONEC2terminateAPI / Console からの削除をブロックProtection OFFEC2terminateterminatedそのまま削除される(データ消失)
// Termination Protectionの有効化
$ aws ec2 modify-instance-attribute \
--instance-id i-0abc123 \
--disable-api-termination
本番環境の推奨設定: (1) Termination Protection を有効化、(2) IAM で ec2:TerminateInstances を制限(特定ロールのみ許可)、(3) CloudTrail で terminate 操作を監査、(4) Auto Scaling 環境では Instance Scale-in Protection も併用。この多層防御により、人為的ミスによるインスタンス喪失リスクを最小化できます。

📝
AWS 認定試験(SAA)レベルの問題

Q1.EC2インスタンスをstop→startした場合、保持されるものはどれですか?
A.パブリックIPアドレス
B.インスタンスストアのデータ
C.プライベートIPアドレス
D.物理ホストの割り当て
Q2.EC2 Hibernationを使用するための前提条件として正しくないものはどれですか?
A.EBSルートボリュームが暗号化されていること
B.起動後にHibernationを有効化すること
C.メモリサイズ分のEBS空き容量があること
D.対応するインスタンスタイプであること

関連コンテンツ