Amazon EC2 の永続的なスポット インスタンス リクエストを作成する記事の中で、EC2 インスタンスが終了した後もボリュームを削除せず残すための設定について触れました。
ところがこの「終了時に削除」設定には 1 つ問題があり、削除するにせよしないにせよ、インスタンスの起動時に設定し忘れてしまうと、後から AWS コンソールで設定を変更することができません。
インスタンス起動後に「終了時に削除」設定を変更する方法についてまとめました。
EBS ボリュームを削除しないことの効用
オンデマンド インスタンスでもスポット インスタンスでも、EC2 インスタンスの起動時に EBS ボリュームの「終了時に削除 (Delete on termination)」設定を「いいえ」にしておくことで、インスタンスの終了時にアタッチされたボリュームが自動的に削除されるのを防ぐことができます。
「終了時に削除」設定をオフにしておくと、インスタンス終了後にボリュームが未アタッチの状態で残ります。いわば、PC は捨ててしまってハードドライブだけが残っているような状態に似ています。他の EC2 インスタンスにアタッチして、OS 側でマウントすれば、残されたボリュームにアクセスすることができます。
また、残されたボリュームからスナップショットを作成し、このスナップショットを起動ボリュームとする AMI を作れば、終了したインスタンスと実質的に同一のインスタンスをもう一度起動し直すことも可能です。これはスポット インスタンスの変更を行う場合に有用です。スポット インスタンスでは、オンデマンド インスタンスのように自由にインスタンス タイプを変更することができません。運用中のスポット インスタンスをスケールアップまたはスケールダウンしたい場合には、スポット インスタンスを一度終了させ、残ったボリュームから作成した AMI を使ってもう一度スポット インスタンスを新たに起動し直すことで、実質的なインスタンス タイプの変更を行います。
インスタンス起動時に「終了時に削除」設定を忘れた
ある時、Amazon Linux の新しいスポット インスタンスを起動した後で、リクエスト作成時に「終了時に削除」設定をオフにした覚えがないことに気づきました。
設定を見に行ってみます。
AWS コンソールの EC2 ページで、[インスタンス] 画面のリストから起動中のインスタンスを選択します。右端近くの [ストレージ] タブを開くと、このインスタンスにアタッチされているボリュームごとの設定を確認することができます。
案の定、起動ボリューム /dev/xvda の「終了時に削除」設定が「はい」になっていました。
AWS コンソールでは「終了時に削除」設定を変更できない
起動した直後なので、インスタンスを破棄してもう一度起動し直してもよいのですが、せっかく起動したインスタンスを捨てるのはもったいないです。「終了時に削除」設定を変更することにします。
しかし、実は現時点の AWS コンソール上には、インスタンスにアタッチされたボリュームの「終了時に削除」設定を後から変更する UI が用意されていません。
起動ボリュームでなければ、インスタンスの終了前にボリュームを OS 側でアンマウントした後、デタッチすればボリュームをインスタンスから切り離せます。こうすればインスタンスが終了してもボリュームが削除されることはありません。しかし今回は起動ボリュームなので、この方法は使えません。
インスタンスを終了する前に一時的に停止すれば(オンデマンド インスタンスまたは永続スポット インスタンスであることが前提になります)、停止中のインスタンスから起動ボリュームをデタッチすることが可能です。しかしいずれにしても、インスタンスを終了する前に忘れずにボリュームをデタッチしなければいけません。普段は「終了時に削除」をオフにしている分、忘れてしまいそうで不安になります。
AWS CLI から「終了時に削除」設定を変更する
この場合の解決方法は、AWS CLI を利用することです。AWS CLI を使えば、ボリュームの「終了時に削除」設定をインスタンスを起動した後でも変更することができます。
AWS を利用しているとときどき遭遇することですが、AWS コンソールの UI 上からは調整できない設定が、AWS CLI からであれば変更可能になっているケースがあります。言い換えると、API レベルでは設定変更可能な項目に対応する UI が、まだ AWS コンソール上にはリリースされていないと表現することもできます。今回はこうしたケースです。
設定を変更する前に、念のためコマンドでも現在の設定を確認しておきます。ec2 describe-instance-attribute コマンドを使うと、特定の EC2 インスタンスの属性値を確認できます。
$ aws ec2 describe-instance-attribute --region ap-northeast-1 --instance-id i-01a23b45c67d89e01 --attribute blockDeviceMapping
{
"InstanceId": "i-01a23b45c67d89e01",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-0fed123cba4569877",
"AttachTime": "2024-02-29T02:29:27.000Z"
}
}
]
}
上記のコマンドでは、アジアパシフィック(東京)リージョンに存在する、ID が i-01a23b45c67d89e01 であるインスタンスの blockDeviceMapping 属性を確認しています。blockDeviceMapping 属性の値を見ることで、このインスタンスへの EBS ボリュームのアタッチ設定を確認できます。
コマンドの実行がエラーになる場合には、DescribeInstanceAttribute アクションを実行可能な権限があることを確認してください。EC2 インスタンス上から AWS CLI を実行している場合、実行権限を付与する一番簡単な方法は、EC2 インスタンスに IAM ロールを割り当てることです。
コマンドの実行が正常に完了すると、指定した属性の値を含む JSON 文字列が表示されます。ここでの応答を見ると "DeleteOnTermination": true になっているので、確かに「終了時に削除」設定がオンになっていることを確認できました。
設定を変更するには、ec2 modify-instance-attribute コマンドを使用します。
$ aws ec2 modify-instance-attribute --region ap-northeast-1 --instance-id i-01a23b45c67d89e01 --block-device-mappings '[{"DeviceName": "/dev/xvda", "Ebs": {"DeleteOnTermination": false}}]'
オプション --block-device-mappings の値として、デバイス名と変更後の値 "DeleteOnTermination": false を含む JSON 文字列を '[{"DeviceName": "/dev/xvda", "Ebs": {"DeleteOnTermination": false}}]' のように指定します。
ec2 modify-instance-attribute コマンドの実行がエラーなく成功すると、何も応答は表示されずプロンプトに戻ります。設定が期待通りに変わっているか、AWS コンソールで確認してみます。
起動ボリューム /dev/xvda の「終了時に削除」設定をぶじ「いいえ」に変更できました。
まとめ
EC2 インスタンスの起動時にボリュームの「終了時に削除」設定をオフにし忘れると、後から AWS コンソール上で変更することはできません。ec2 modify-instance-attribute コマンドを使用することで、「終了時に削除」設定を CLI から変更することができます。
いずれ AWS コンソール上でも「終了時に削除」設定を変更できるようになるかもしれませんが、当面の間は AWS CLI が役立つケースのひとつであるといえます。