[入門] 稼働中のEC2インスタンスのEBS Volumeを暗号化する [EC2インスタンス]
はじめに
突然ですが、稼働中のEC2インスタンスのEBSを暗号化したくなりませんか?今すぐに。
通常何もしていなければ稼働しているEC2インスタンスのEBS Volumeは特に暗号化されていません。セキュリティ要件によって、稼働後にEBSを全て暗号化しないといけないケースもあるかもしれません。稼働しているインスタンスのEBSを暗号化する手順を調べたので記録しておきます。
前提
まずは以下の前提で手順の方を確認します。
- ASGを使ってAMIから起動されたEC2インスタンスではない
- すでに稼働しているEC2インスタンスである
- 数十分のダウンタイムは許容できる
- EC2インスタンスはAmazonLinux
手順
暗号化の手順はざっと以下のとおりです。
- AWS KMSでキーを作成する
- 稼働しているEC2インスタンスを停止する
- EC2インスタンスに紐付いているEBS Volumeを特定する
- EBS VolumeのSnapshotを作成する
- 作成されたSnapshotをコピーする
- コピーしたSnapshotからEBS Volumeを作成する
- EC2インスタンスに紐づいている既存のEBS Volumeをでタッチする
- EC2インスタンスに前段の手順で作成した新たなEBS Volumeをアタッチする
- EC2インスタンスを再起動する
意外と手順は多いのです。
ダウンタイムについては、Snapshotの作成、Snapshotのコピーに一番時間がかかります。そのためVolumeのサイズなどによって異なります。それにEC2インスタンスの起動時間とアプリケーション起動時間が加算されます。事前にリハーサルして計測しておくことが望ましいと思われます。また、EC2インスタンスのStop/Startとなるため、Public IPなどが変更されます。
1. AWS KMSでキーを作成する
KMSでKeyを作成します。Roleは必要に応じて適切に設定してください。
KMSの暗号化キーの設定はIAMのメニューにあります。 *1暗号化キーをクリックするとKMSの画面へ遷移し以下のような画面になります。
キーの作成をクリック。
利用するリージョンの選択、エイリアスの設定などを行います。ここのエイリアスで大体選択することになるのでわかりやすくしておいたほうが良さそうです。
今回は自分しか触らないので自分のみRoleを割り当てました。
作成されました。
2. 稼働しているEC2インスタンスを停止する
当然ですが、EC2インスタンスが稼働したままでは、ストレージのI/Oがある可能性があります。そのため、完全なストレージのコピーとしたい場合は確実にI/Oを止める必要があります。今回は完全なストレージのコピーを取りたいのでインスタンスの停止を実行します。
3. EC2インスタンスに紐付いているEBS Volumeを特定する
EC2インスタンスの停止を確認したらVolumeを特定します。まあ、これは簡単ですね。ポチッと。
暗号化はされてません。
4. EBS VolumeのSnapshotを作成する
Snapshotを作成します。Snapshotには分かりやすいように Plain-
というPrefixを付与しました。Volumeのサイズによりますがそれなりに時間がかかります。
5. 作成されたSnapshotをコピーする
Snapshotをコピーして 暗号化
を適用します。ここで初めて暗号化が可能です。暗号化のオプションとKMSのKey ID(Key Alias)を指定します。こちらもそこそこ時間がかかります。こちらは暗号化後のSnapshotなので Encrypted
という単語をコメントに追加しました。
暗号化されています。
6. コピーしたSnapshotからEBS Volumeを作成する
暗号化したSnapshotからEBS Volumeを作成します。これで初めて暗号化されたEBS Volumeが作成できます。こちらも Encrypted-
のPrefixをタグに付与してわかりやすくしておきます。
Encrypted
となっていることが確認できます。
7. EC2インスタンスに紐づいている既存のEBS Volumeをデタッチする
既存のEC2インスタンスからVolumeをデタッチします。ここで必ずルートデバイスを確認しておきます。EC2のメタ情報に記載されてるので確認しておきます。
AmazonLinuxは /dev/xvda
のようです。
EC2インスタンスに紐付いているVolumeをデタッチします。
EC2インスタンスからVolumeがデタッチされました。
8. EC2インスタンスに前段の手順で作成した新たなEBS Volumeをアタッチする
新しく作成した暗号化Volumeをアタッチします。EC2インスタンスを指定します。ここで先程確認しておいたルートデバイスを確実に入力します。ここでデフォルトのままアタッチすると、ルートデバイスが正常に結びつかずVolumeが適用されません。
アタッチするとEC2インスタンスに正常にひも付きます。以下のようにルートデバイスが正常に表示していればOK
9. EC2インスタンスを再起動する
新しいVolumeがアタッチされたことを確認し、インスタンスを再起動します。再起動後には、以前動作していたスクリプトやサービスが正常に動作していることを必ず確認します。
SSHして確認してみます。
__| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/ 8 package(s) needed for security, out of 8 available Run "sudo yum update" to apply all updates. [ec2-user@ip-172-30-26-171 ~]$ df -H Filesystem Size Used Avail Use% Mounted on devtmpfs 512M 58k 512M 1% /dev tmpfs 521M 0 521M 0% /dev/shm /dev/xvda1 8.4G 1.1G 7.2G 13% /
問題なさそう。ちなみにどんなインスタンスでも暗号化をサポートしているかというとそうでもないようです。インスタンスタイプによっては対応してないので注意しましょう。
実際にはtd-agentのサービスが動作していることやJavaのプロセスが稼働しているかなどを確認しています。
まとめ
稼働中のEC2インスタンスのEBS Volumeを暗号化する方法は意外と手順が煩雑です。「EC2インスタンス」、「ボリューム」、「スナップショット」のメニューを行ったり来たりしてました。数が多い場合はコマンドで実行したほうが良いかもしれませんが、結構非同期で処理されるものが多いので待ちが多いかもしれません。
EBS Volumeのコピーの仕方など、一つ一つ情報は揃っているのですが、自分のやりたいオペレーションに対してピンポイントの情報がなかったのでまとめました。
AMI、ASGを利用したサーバーの場合はまた別の方法があるようなので、また次の記事で紹介します。
参照
- Amazon EBS Encryption
- EC2 のルートデバイスに EBS をアタッチする方法
- スナップショットからの Amazon EBS ボリュームの復元
- 【新機能】EBSのブートボリュームが暗号化できるように
- EBS暗号化 - サポートされるインスタンスタイプ
脚注
- 自分は迷いました。 ↩