[入門] 稼働中のEC2インスタンスのEBS Volumeを暗号化する [EC2インスタンス]

はじめに

突然ですが、稼働中のEC2インスタンスのEBSを暗号化したくなりませんか?今すぐに。

通常何もしていなければ稼働しているEC2インスタンスのEBS Volumeは特に暗号化されていません。セキュリティ要件によって、稼働後にEBSを全て暗号化しないといけないケースもあるかもしれません。稼働しているインスタンスのEBSを暗号化する手順を調べたので記録しておきます。

前提

まずは以下の前提で手順の方を確認します。

  • ASGを使ってAMIから起動されたEC2インスタンスではない
  • すでに稼働しているEC2インスタンスである
  • 数十分のダウンタイムは許容できる
  • EC2インスタンスはAmazonLinux

手順

暗号化の手順はざっと以下のとおりです。

  1. AWS KMSでキーを作成する
  2. 稼働しているEC2インスタンスを停止する
  3. EC2インスタンスに紐付いているEBS Volumeを特定する
  4. EBS VolumeのSnapshotを作成する
  5. 作成されたSnapshotをコピーする
  6. コピーしたSnapshotからEBS Volumeを作成する
  7. EC2インスタンスに紐づいている既存のEBS Volumeをでタッチする
  8. EC2インスタンスに前段の手順で作成した新たなEBS Volumeをアタッチする
  9. EC2インスタンスを再起動する

意外と手順は多いのです。

ダウンタイムについては、Snapshotの作成、Snapshotのコピーに一番時間がかかります。そのためVolumeのサイズなどによって異なります。それにEC2インスタンスの起動時間とアプリケーション起動時間が加算されます。事前にリハーサルして計測しておくことが望ましいと思われます。また、EC2インスタンスのStop/Startとなるため、Public IPなどが変更されます。

1. AWS KMSでキーを作成する

KMSでKeyを作成します。Roleは必要に応じて適切に設定してください。

KMSの暗号化キーの設定はIAMのメニューにあります。 *1暗号化キーをクリックするとKMSの画面へ遷移し以下のような画面になります。

スクリーンショット 2017-10-03 11.54.43

キーの作成をクリック。

スクリーンショット 2017-10-03 11.55.34

利用するリージョンの選択、エイリアスの設定などを行います。ここのエイリアスで大体選択することになるのでわかりやすくしておいたほうが良さそうです。

スクリーンショット 2017-10-03 11.56.23

今回は自分しか触らないので自分のみRoleを割り当てました。

スクリーンショット 2017-10-03 11.56.38

作成されました。

2. 稼働しているEC2インスタンスを停止する

当然ですが、EC2インスタンスが稼働したままでは、ストレージのI/Oがある可能性があります。そのため、完全なストレージのコピーとしたい場合は確実にI/Oを止める必要があります。今回は完全なストレージのコピーを取りたいのでインスタンスの停止を実行します。

スクリーンショット 2017-10-03 15.30.48

3. EC2インスタンスに紐付いているEBS Volumeを特定する

EC2インスタンスの停止を確認したらVolumeを特定します。まあ、これは簡単ですね。ポチッと。

スクリーンショット 2017-10-03 15.32.43

暗号化はされてません。

スクリーンショット 2017-10-03 15.32.55

4. EBS VolumeのSnapshotを作成する

Snapshotを作成します。Snapshotには分かりやすいように Plain- というPrefixを付与しました。Volumeのサイズによりますがそれなりに時間がかかります。

スクリーンショット 2017-10-03 15.33.58

スクリーンショット 2017-10-03 15.34.28

5. 作成されたSnapshotをコピーする

Snapshotをコピーして 暗号化 を適用します。ここで初めて暗号化が可能です。暗号化のオプションとKMSのKey ID(Key Alias)を指定します。こちらもそこそこ時間がかかります。こちらは暗号化後のSnapshotなので Encrypted という単語をコメントに追加しました。

Image 2017-10-03 17-28-19

スクリーンショット 2017-10-03 15.37.20

暗号化されています。

Image 2017-10-03 17-28-57

6. コピーしたSnapshotからEBS Volumeを作成する

暗号化したSnapshotからEBS Volumeを作成します。これで初めて暗号化されたEBS Volumeが作成できます。こちらも Encrypted- のPrefixをタグに付与してわかりやすくしておきます。

スクリーンショット 2017-10-03 15.43.23

Encrypted となっていることが確認できます。

スクリーンショット 2017-10-03 15.44.43

7. EC2インスタンスに紐づいている既存のEBS Volumeをデタッチする

既存のEC2インスタンスからVolumeをデタッチします。ここで必ずルートデバイスを確認しておきます。EC2のメタ情報に記載されてるので確認しておきます。

スクリーンショット 2017-10-03 15.46.45

AmazonLinuxは /dev/xvda のようです。

EC2インスタンスに紐付いているVolumeをデタッチします。

スクリーンショット 2017-10-03 15.57.32

EC2インスタンスからVolumeがデタッチされました。

スクリーンショット 2017-10-03 15.58.27

8. EC2インスタンスに前段の手順で作成した新たなEBS Volumeをアタッチする

新しく作成した暗号化Volumeをアタッチします。EC2インスタンスを指定します。ここで先程確認しておいたルートデバイスを確実に入力します。ここでデフォルトのままアタッチすると、ルートデバイスが正常に結びつかずVolumeが適用されません。

スクリーンショット 2017-10-03 16.00.18

アタッチするとEC2インスタンスに正常にひも付きます。以下のようにルートデバイスが正常に表示していればOK

スクリーンショット 2017-10-03 16.05.13

9. EC2インスタンスを再起動する

新しいVolumeがアタッチされたことを確認し、インスタンスを再起動します。再起動後には、以前動作していたスクリプトやサービスが正常に動作していることを必ず確認します。

スクリーンショット 2017-10-03 16.07.19

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を利用したサーバーの場合はまた別の方法があるようなので、また次の記事で紹介します。

参照

脚注

  1. 自分は迷いました。