Amazon Data Lifecycle Manager (以下、DLM)を使って、EC2インスタンスのクロスアカウントスナップショットコピーをしてみました。
目的
セキュリティ侵害やうっかりミスで、EC2インスタンスとスナップショットが全滅してしまったときでも、「こんなこともあろうかと」と、別のアカウントで取得していたバックアップから復旧できるようにする。
要件
実は AWS Backup を使えばクロスアカウントバックアップは簡単にできるのですが、それには AWS Organizations の機能を使う必要があります。AWS Organizations が利用できそうな場合は、まずはDLMよりもAWS Backupの検討をお勧めします。本記事では深く触れませんが、より高機能であり、EC2以外のサービスにも対応しています。
バックアップコピーの作成AWSアカウント - AWS Backup
今回はAWS Organizations の機能を利用できない状況だったので、DLMを試してみることにしました。
対象インスタンス
以下のタグがついたインスタンスを対象とします。
EBS暗号化はされていません。
| タグ | 値 |
|---|---|
| DLM | on |
バックアップ・スケジュール
日次バックアップを1週間分、月次バックアップを3ヶ月分保持します。
| 頻度 | 時刻 | 保持 | |
|---|---|---|---|
| 日次バックアップ | 毎日 | 8:00 | 7世代 |
| 月次バックアップ | 毎月1日 | 8:30 | 3世代 |
構成概要
複数アカウント・複数スケジュールと、少し複雑なので構成図を書いてみました。

2つのアカウントでDLMのポリシー設定し、以下の動作を実現します。
- (コピー元アカウント)スケジュールに従い、スナップショットが作成
- (コピー元アカウント)バックアップ用アカウントへスナップショットを共有
- (コピー先アカウント)共有がトリガーとなり、スナップショットをコピー
設定手順
こちらの公式ドキュメントを参考にしています。
コピー元アカウントの設定
まずは、EC2インスタンスがあるアカウントの方で設定をします。
マネージメントコンソール > EC2ダッシュボード > ライフサイクルマネージャー で ライフサイクルポリシーを作成 をクリックします。

「EBSスナップショットポリシー」を選択します。

ターゲットリソース

今回はバックアップしたいEC2インスタンスに、DLM:onというタグをつけることにしました。 インスタンスを選択し、タグを入力したら、追加ボタンを押します。
IAMロール

デフォルトで構いません。
ポリシーのステータス

有効にします。
スケジュール
同じライフサイクルポリシー内で、複数のスケジュールを作成可能です。 まずは日次バックアップのスケジュールを入力します。

日次バックアップのスケジュールが入力できたら、画面上にスケジュール追加ボタンがあるので、そこから月次バックアップを入力します。

今回はeverydayとeverymonthという2つのスケジュールを作成しました。
| 設定項目 | 日時バックアップ | 月次バックアップ |
|---|---|---|
| スケジュール名 | everyday | everymonth |
| 頻度 | 毎日/毎24時間 | 毎月最終 |
| 開始時刻 | 23:00 UTC | 23:30 UTC |
| 保持タイプ | カウント | カウント |
| 保持 | 7 | 3 |
| ソースからタグをコピー | チェック | チェック |
| アカウントの共有 | コピー先アカウントのID | コピー先アカウントのID |
これで、コピー元アカウントの設定は完了し、定期的なスナップショット作成とコピー先アカウントへの共有が開始されます。
この設定で作成されるスナップショットのタグと説明は以下となります。


説明には、以下のようにライフサイクルポリシーIDとスケジュール名が記載されます。 このスナップショットの説明は、コピー先アカウントの設定時に利用します。
- Created for policy: policy-xxxxxxxxxxxxxxx schedule: everyday
- Created for policy: policy-xxxxxxxxxxxxxxx schedule: everymonth
コピー先アカウントの設定
続いて、コピー先アカウントでの設定をします。 上記で共有されたスナップショットのコピー設定をしますが、日次と月次の2つのライフサイクルポリシーを 作成する必要があります。
マネージメントコンソール > EC2ダッシュボード > ライフサイクルマネージャー で ライフサイクルポリシーを作成 をクリックします。

「アカウント間コピーのイベントポリシー」を選択します。
今回、2つのポリシーは以下のように設定しました。
| 設定項目 | 日時バックアップ | 月次バックアップ |
|---|---|---|
| ポリシーの説明 | Copy Daily Snapshot | Copy Monthly Snapshot |
| アカウントの共有 | コピー元アカウントのID | コピー元アカウントのID |
| 頻度 | 毎日/毎24時間 | 毎月1日 |
| このスナップショットの説明があるスナップショットをコピー | Created for policy: policy-xxxxxxxx schedule: everyday | Created for policy: policy-xxxxxxxx schedule: monthly |
| リージョン1 | ap-northeast-1 | ap-northeast-1 |
| 期限 | 7日作成後 | 3日作成後 |
「このスナップショットの説明があるスナップショットをコピー」が重要で、ここで入力した正規表現とスナップショットの説明がマッチすると、このポリシーの対象となります。説明には、コピー元アカウントで設定した時のポリシーIDとスケジュール名が入っています。正規表現で工夫できるかもしれませんが、今回のように説明をそのままコピー&ペーストしても問題ありません。
コピーされたスナップショットには、以下のような説明やタグがつきます。


少し困ったこととして、1つのライフサイクルポリシーで複数インスタンスを対象とすると、どのスナップショットがどのインスタンスのものか判別するのが難しいというのがあります。 説明にあるEBSボリュームIDしか判別材料がありません。
コピー元アカウントでライフサイクルポリシーをインスタンスごとに作成することも考えられますが、どちらにしても目視ですぐに確認するのは難しいと感じました。
とはいえ、ひとまずこれで完成です。
まとめ
Amazon Data Lifecycle Manager でクロスアカウントのスナップショットコピーを設定しました。 EC2インスタンスのクロスアカウントバックアップの選択肢の1つにはなります。 AWS Backupのクロスアカウントバックアップが諸事情で使えない場合は検討いただければと思います。
渡辺 信秀(記事一覧)
2017年入社 / 地味な内容を丁寧に書きたい