少し前に AWS EC2 でルートボリュームをインスタンスを停止せずに交換可能になったと発表がありました。
え、停止せずにって、無停止でってこと? そんな馬鹿な(馬鹿な)
ので、試してみました。
適当にインスタンスを作って、適当にファイルを書いて、
echo 'this is test 1' > test.txt
マネジメントコンソールからスナップショットを作成した後、↑のファイルを上書きします。
echo 'this is test 2' > test.txt
マネジメントコンソールからルートボリュームの置き換えを行います。インスタンス詳細のストレージタブにあります。
スナップショットのところにフォーカスすると候補が表示されるので、↑で作成したスナップショットを選択します。
置き換えタスクを作成すると、前画面のストレージのところに表示されます。
ここが「成功」になれば置き換え完了です。
インスタンスに ssh して確認してみると・・
cat test.txt #=> this is test 1 uptime #=> 18:34:23 up 0 min, 1 user, load average: 0.04, 0.01, 0.00
まあ当たり前でした。OS 的には再起動しています。ただ、インスタンスを停止→開始する必要がないので、associate-public-ip-address で付与された PublicIP が変わることもなければ、エフェメラルボリュームのデータもそのまま残ります(普通に停止→開始すると PublicIP は変わるしエフェメラルボリュームのデータも消える)。
さいごに
ルートボリュームをスナップショットで置き換えた後、同じインスタンスで再度ルートボリュームの置き換えをしようとしても、同じスナップショットは選択の候補に現れないようです。
ただ、置き換えるスナップショットを指定しなければルートボリュームの元となったスナップショットで置き換えられるため、直前に置き換えたスナップショットでもう一度置き換えたい場合は単にスナップショットを未指定で置き換えを実行すれば OK です(トライアンドエラーで試行錯誤するときにありそう)。
おそらく、置き換える対象のルートボリュームから作成されたスナップショットしか候補に表示されないようになっているのだと思います。置き換えるとルートボリュームが新しく作成されるので、以前のルートボリュームから作成されていたスナップショットはすべて候補にあがらなくなるのではないかと。
- ルートボリューム A からスナップショット S を作成する
- スナップショット S で ルートボリューム A を置き換える
- 新たにボリューム B が作られて置き換えられる
- B の置き換えでは S は B のスナップショットではないので候補にあがらない
- ただし B のベースは S なのでスナップショットが未指定なら S で置き換えられる
なお、これはマネジメントコンソール上で選択の候補にあげられるかどうかだけのものなので、 スナップショットのIDを直接入力すれば候補に無いスナップショットでも置き換え可能だし、 AWS CLI でやる分にはぜんぜん関係ありません。
aws --profile hj-tky ec2 create-replace-root-volume-task \ --instance-id i-04ff3fb484044124b --snapshot-id snap-0386ee904da7163a8 #=> { #=> "ReplaceRootVolumeTask": { #=> "ReplaceRootVolumeTaskId": "replacevol-0edbfcd8a8e82d2c2", #=> "InstanceId": "i-04ff3fb484044124b", #=> "TaskState": "pending", #=> "StartTime": "2021-05-17T18:52:29Z", #=> "Tags": [] #=> } #=> }
これ知らずにいると、なぜか置き換えできない・・とか思って嵌りそうです。