EBS スナップショットのリージョン間コピーが増分になるかどうかで気にすべきはコピー元でなくコピー済みのスナップショットだった

リージョンをまたいだ EBS スナップショットをコピーする際に暗号化の有無がどう関わってくるかを調べました。まずはコピー後のスナップショットが増分になるかどうかからです。

コンバンハ、千葉(幸)です。

EBS スナップショットコピーが増分になるかどうか、その条件について以下に記述があります。

スナップショットコピーが増分かどうかは、最近完了したスナップショットコピーによって決定されます。リージョンまたはアカウントにわたってスナップショットをコピーする場合、次の条件に合致すればコピーは増分となります。

  • スナップショットがコピー先のリージョンまたはアカウントにコピーされたことがある。
  • 最近のスナップショットコピーがコピー先のリージョンまたはアカウントにまだ存在する。
  • コピー先リージョンまたはアカウントのスナップショットのコピーがすべて、暗号化されていないか、あるいは同じ KMS キーを使って暗号化されていた。

最初にこの記述を読んだ時、3つめの条件における「同じ KMSキー」は「コピー元のスナップショット」と「コピー先のスナップショット」の話をしているのだと勘違いしていました。

そのため、リージョンをまたいだコピーを想定した場合、KMS キーで暗号化された EBS スナップショットは増分にはならないのではと考えました。(KMS キーはリージョン固有のリソースであるため「同じ」キーで暗号化されたとみなされないだろう、という考え。)

いろいろ試した結果、わたしの解釈が誤っていたことが分かったため記しておきます。

EBS スナップショットのコピーが増分になるかどうか

気にすべきはここです。

改めて条件を読むと、一貫してコピー先のスナップショットについてしか述べられていないことに気づきました。

スナップショットコピーが増分かどうかは、最近完了したスナップショットコピーによって決定されます。リージョンまたはアカウントにわたってスナップショットをコピーする場合、次の条件に合致すればコピーは増分となります。

  • スナップショットがコピー先のリージョンまたはアカウントにコピーされたことがある。
  • 最近のスナップショットコピーがコピー先のリージョンまたはアカウントにまだ存在する。
  • コピー先リージョンまたはアカウントのスナップショットのコピーがすべて、暗号化されていないか、あるいは同じ KMS キーを使って暗号化されていた。

「スナップショットコピーというプロセスが増分で行われるか」というより、「コピー先のスナップショット群が増分スナップショットとなるか」ということがここで述べられていました。

EBS スナップショットのリージョン間コピーを試す構成

実際に手を動かして挙動を確認します。今回は以下のイメージで、同一アカウント内でリージョンをまたいだ EBS スナップショットコピーを行います。

便宜上、各スナップショットを以下の通り呼称します。

  • 1st スナップショット
  • 2nd スナップショット
  • 3rd スナップショット

1st のコピーが終わってから 2nd を作成して、それのコピーが終わったら 3rd を作成して……という流れで行っています。

また、コピー元が暗号化されていた場合も確認したかったので以下のようなイメージで 3 パターンに分けて実施しています。

  • 暗号化なしのパターン
  • デフォルトキー(aws/ebs)で暗号化されたパターン
  • カスタマー管理キー(マルチリージョンキー)で暗号化されたパターン

カスタマー管理キーをマルチリージョンキーにしたのは「そうでないといけない」という勘違いからです。コピー時に異なる KMS キーを指定できるので、マルチリージョンキーは必須の条件ではありません。

EBS スナップショットコピー検証の前準備

今回の検証を行う前にいくつか準備をしておきます。

CloudWatch イベントの作成

EBS スナップショットコピーが増分であったかどうかは CloudWatch イベントから確認できます。

copySnapshotイベントが行われた場合に以下形式の通知が発行され、Incrementaltrueになっていれば増分です。

{
  "version": "0",
  "id": "01234567-0123-0123-0123-012345678901",
  "detail-type": "EBS Snapshot Notification",
  "source": "aws.ec2",
  "account": "123456789012",
  "time": "yyyy-mm-ddThh:mm:ssZ",
  "region": "us-east-1",
  "resources": [
    "arn:aws:ec2:us-west-2::snapshot/snap-01234567"
  ],
  "detail": {
    "event": "copySnapshot",
    "result": "succeeded",
    "cause": "",
    "request-id": "",
    "snapshot_id": "arn:aws:ec2:us-west-2::snapshot/snap-01234567",
    "source": "arn:aws:ec2:eu-west-1::snapshot/snap-76543210",
    "startTime": "yyyy-mm-ddThh:mm:ssZ",
    "endTime": "yyyy-mm-ddThh:mm:ssZ",
    "Incremental": "true"
  }
}

コピー先の各リージョンでイベントルールを作成し、結果を通知するようにセットアップしておきます。

イベントパターンは以下の通り設定しました。

Amazon_EventBridge

{
  "source": ["aws.ec2"],
  "detail-type": ["EBS Snapshot Notification"],
  "detail": {
    "event": ["copySnapshot"]
  }
}

マルチリージョンキーの作成

今回は大阪→シンガポールのリージョン間コピーでカスタマー管理キーを使用したいため、大阪リージョンでプライマリキーの作成を行います。

KMS キー作成のステップ1でマルチリージョンキーを選択し、そのままキーを作成します。今回はエイリアスとしてEBSKeyを指定しました。

KMS_Console_Multi_Region

作成したキーの「リージョンごと」タブから、「新しいレプリカキーを作成」を押下することでレプリカキーの作成が行えます。

KMS_Console_ReplicaKey

作成時にエイリアスやキーポリシーを変更することもできますが、今回は特に変更を加えませんでした。(後から考えると、エイリアスを変えた方が判別がつきやすかったです。)ステータスが有効になれば準備完了です。

KMS_Console_multiregion_key

プライマリキー、レプリカキーそれぞれの ARN は以下です。キー ID がmrk-から始まり両者で共通していることが分かります。

  • arn:aws:kms:ap-northeast-3:000000000000:key/mrk-09b6f8abd6a74928bea5f18d481cxxxx
  • arn:aws:kms:ap-southeast-1:000000000000:key/mrk-09b6f8abd6a74928bea5f18d481cxxxx

EBS スナップショットのリージョン間コピーをやってみた

各パターンでリージョン間コピーを行っていきます。コピーする際の操作イメージは以下です。(画像はカスタマー管理キーで暗号化されたスナップショットをコピーする例)

Snapshot_copy_cross_region

各パターンの結果を記します。

暗号化なしでリージョン間コピーした場合

大阪→東京リージョンで試行しました。

# コピー対象 コピー前 コピー後 増分か
1 1st スナップショット 暗号化なし 暗号化なし いいえ
2 2nd スナップショット 暗号化なし 暗号化なし はい
3 3rd スナップショット 暗号化なし 暗号化なし はい

2回目以降のコピーが増分になっています。増分か否かは CloudWatch イベントから確認しています。

{
	"version": "0",
	"id": "e25a90f3-c85d-2a3c-dcb3-95526e0dce91",
	"detail-type": "EBS Snapshot Notification",
	"source": "aws.ec2",
	"account": "000000000000",
	"time": "2022-04-17T15:10:03Z",
	"region": "ap-northeast-1",
	"resources": [
		"arn:aws:ec2::ap-northeast-1:snapshot/snap-0789f5a8a03df3af2"
	],
	"detail": {
		"event": "copySnapshot",
		"result": "succeeded",
		"cause": "",
		"request-id": "",
		"startTime": "2022-04-17T15:06:50.912Z",
		"endTime": "2022-04-17T15:10:01.801Z",
		"snapshot_id": "arn:aws:ec2::ap-northeast-1:snapshot/snap-0789f5a8a03df3af2",
		"source": "arn:aws:ec2::ap-northeast-3:snapshot/snap-0e1cfdd0c81a80783",
		"incremental": "true"
	}
}

デフォルトキーで暗号化されたものをリージョン間コピーした場合

大阪→ソウルリージョンで試行しました。

# コピー対象 コピー前 コピー後 増分か
1 1st スナップショット aws/ebs で暗号化 aws/ebs で暗号化 いいえ
2 2nd スナップショット aws/ebs で暗号化 aws/ebs で暗号化 はい
3 3rd スナップショット aws/ebs で暗号化 aws/ebs で暗号化 はい

こちらも同様の結果です。

念のため補足しておくと、どちらのリージョンのキーもエイリアスはaws/ebsですが、リソースとしては別物です。ARN も以下のように異なっています。

  • arn:aws:kms:ap-northeast-3:000000000000:key/682df8e4-adfc-4896-b9cb-dde44d38xxxx
  • arn:aws:kms:ap-northeast-2:000000000000:key/ef014d83-f1eb-4a17-95ca-9b78926bxxxx

あくまで、コピー先のソウルリージョンでの 2nd と 3rd が同じ KMS キーで暗号化されているために増分となっている、ということです。

カスタマー管理キーで暗号化されたものをリージョン間コピーした場合

大阪→シンガポールリージョンで試行しました。

大阪リージョンでカスタマー管理キーをマルチリージョンキーとして作成し、シンガポールリージョンにレプリカを作成しています。

# コピー対象 コピー前 コピー後 増分か
1 1st スナップショット プライマリキーで暗号化 レプリカで暗号化 いいえ
2 2nd スナップショット プライマリキーで暗号化 レプリカで暗号化 はい
3 3rd スナップショット プライマリキーで暗号化 レプリカで暗号化 はい

こちらも変わらず2回目以降が増分になっています。改めて考えると、コピー先リージョンで独自のカスタマー管理キーを作成してそれを指定する、でもよかったですね。

途中で暗号化ステータスを変えた場合

もう少し他のパターンも試したくなったので、大阪→シドニーリージョンで試行しました。

# コピー対象 コピー前 コピー後 増分か
1 1st スナップショット 暗号化なし 暗号化なし いいえ
2 2nd スナップショット 暗号化なし aws/ebs で暗号化 いいえ
3 3rd スナップショット 暗号化なし aws/ebs で暗号化 はい

2回目は増分にはならず、3回目が増分になっています。コピー後のスナップショット同士で比較されていることが分かります。

途中で暗号化ステータスを変えた場合 その2

先ほど以下を実行したシンガポールリージョンで追加のコピーを行います。

# コピー対象 コピー前 コピー後 増分か
1 1st スナップショット プライマリキーで暗号化 レプリカで暗号化 いいえ
2 2nd スナップショット プライマリキーで暗号化 レプリカで暗号化 はい
3 3rd スナップショット プライマリキーで暗号化 レプリカで暗号化 はい

上記が完了した状態から続けて以下のコピーを行います。

# コピー対象 コピー前 コピー後 増分か
4 3rd スナップショット 暗号化なし aws/ebs で暗号化 いいえ
5 3rd スナップショット 暗号化なし 暗号化なし いいえ

#4,5のコピー後のスナップショットは、それぞれコピー先のシンガポールリージョンで同じ暗号化状態のものがありませんので、増分になっていません。

スナップショットのコピー時に増分となる条件について理解が進みました。

終わりに

リージョンをまたいだ EBS スナップショットコピーを行う際、それが増分となるかどうかについて確認してみました。

「コピー元のスナップショットとコピー先のスナップショット」の暗号化の状態は比較対象でなく、「コピー先リージョンにすでに存在するスナップショット」との比較であることが分かりました。

そうなると次は「増分かどうかはリージョン間のデータ転送量に何か関係を及ぼすのか?」というのが気になってくるところですが、それはそれでちょっと思っていたのと違った部分があるので、別途記したいと思います。

以上、 チバユキ (@batchicchi) *1がお送りしました。

脚注

  1. もろもろの検証のために何個もスナップショットをコピーしていたら意外と料金が嵩んでしまったのでちょっと悲しくなっているそうです。