Amazon Data Lifecycle Managerを使ってクロスアカウントスナップショットコピーを試してみた

2022.11.19

前回のブログでAWS Backupを利用したクロスアカウントバックアップを設定してみました。
EC2ならAmazon Data Lifecycle Managerでもクロスアカウントバックアップが可能だったのでやってみました。

構成

簡単な構成図ですが以下のような環境で検証しました。

大まかに以下の4点を行うための設定をします。
1. Data Lifecycle Managerで特定のタグが付いたEC2のスナップショットをアカウントAで取得
2. 取得したスナップショットをアカウントBに共有
2. アカウントBでアカウントAから共有されたスナップショットをコピーする
3. アカウントBでEC2を復旧

設定

公式ドキュメントの手順は以下になります。
クロスアカウントのスナップショットコピーの自動化

スナップショットポリシー作成

スナップショットポリシー作成は以下の公式ドキュメントが参考手順です。
スナップショットのライフサイクルの自動化

アカウントAにアクセスしてEC2ダッシュボードへ移動します。
移動したら画面左の項目から「ライフサイクルマネージャー」をクリックします。

画面が遷移したら「EBSスナップショットポリシー」を選択して「次のステップ」をクリックします。
すでにポリシーを作成したことがある場合は画面が違う可能性があります。

画面が遷移したら「ターゲットリソース」欄で「ターゲットリソースタイプ」と「ターゲットリソースタグ」を設定します。
ターゲットリソースタグの設定はEC2に設定するタグなので環境によって変更してください。
今回は以下のように設定しました。

設定をしたら下にスクロールして「説明」欄の「ポリシーの説明」を入力します。

入力したら下にスクロールして「IAMロール」欄で使用するIAMロールを選択します。
今回はデフォルトロールを選択しています。

使用するIAMロールを選択したら下にスクロールして「ポリシーのステータス」欄で「有効」を選択して「次へ」をクリックします。
ルートボリュームの除外などは今回設定しないので選択不要です。

画面が遷移したら「スケジュールの詳細」欄で以下の項目を設定します。

  • スケジュール名:任意の名前
  • 頻度:スナップショットを作成する頻度
  • 毎:何時間おきにスナップショットを作成するか
  • 開始時刻:スケジュールの開始時刻
  • 保持タイプ:何回分スナップショットを残すかなどの設定

今回は以下の画像のように設定しました。

設定したら下にスクロールして「クロスアカウント共有」のトグルを開きます。
開いたら「このスケジュールのクロスアカウント共有を有効化する」にチェックをつけて「アカウントを追加」をクリックします。

クリックしたら共有先のアカウントIDを入力します。
入力したら「ポリシーの確認」をクリックします。
確認画面で特に問題が無ければ「ポリシーを作成」をクリックします。

カスタマー管理キー共有設定

ここの設定はEBS暗号化に使用しているカスタマー管理キーに設定を追加します。
EBS暗号化を利用していない場合は設定不要です。
KMSキーの作成は以下の公式ドキュメントの通り作成しています。
対称暗号化 KMS キーの作成

アカウントAでKMSダッシュボードへ移動します。
移動したら左の項目から「カスタマー管理型のキー」をクリックします。

画面が遷移したらEBSの暗号化に使用しているKMSキーをクリックして詳細画面を下にスクロールし、「別の AWS アカウント」欄の「別の AWS アカウントを追加」をクリックします。
クリックするとAWSアカウントIDが入力できるので、コピー先のAWSアカウントIDを入力して「変更の保存」をクリックします。

アカウントIDの追加ができたら「キーユーザー」欄で「追加」をクリックして上記項目で設定したIAMロールを追加します。
ここの設定を行わないと以下のエラーが発生してスナップショットの共有に失敗します。

Not authorized to use key arn:アカウントAのKMSキーARN

クロスアカウントコピーイベントポリシーの作成

ここの設定ではスナップショットコピー先アカウントでコピー元アカウント (アカウントA) から共有されたスナップショットをコピーする設定を行います。
アカウントBにアクセスしてEC2ダッシュボードへ移動します。
移動したら画面左の項目から「ライフサイクルマネージャー」をクリックします。

画面が遷移したら「アカウント間のコピーのイベントポリシー」を選択して「次のステップ」をクリックします。
すでにポリシーを作成したことがある場合は画面が違う可能性があります。

画面が遷移したら「説明」欄の「ポリシーの説明」を入力します。

入力したら下にスクロールして「イベント設定」欄で「アカウントの共有」の「アカウントを追加」をクリックしてコピー元のアカウントIDを入力します。
「このスナップショットの説明があるスナップショットをコピー」には「.」と入力します。
ここはスナップショットの説明と一致するものに対してコピーを行う設定になります。
今回はすべてコピーをするので「.
」にしています。

入力したら下にスクロールして「IAM ロール」欄で使用するIAMロールを選択します。
今回はデフォルトロールを選択しています。

選択したら下にスクロールして「アクションをコピー」欄で「名前」、「リージョン」などを設定します。

設定が完了したら下にスクロールして「ポリシーを作成」をクリックします。

IAM ロールに必要な KMS キー の使用を許可する

ここの設定ではコピー元アカウントのKMSキーを使用できるように上記項目で設定したIAMロールに設定を行います。
暗号化していない場合は設定不要です。

アカウントBでIAMダッシュボードへ移動します。
移動したら左の項目から「ロール」をクリックします。

画面が遷移したら上記項目で設定したIAMロールをクリックして「許可を追加」の「インラインポリシーを作成」をクリックします。

追加するポリシーは以下のものになります。

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:RevokeGrant",
                "kms:CreateGrant",
                "kms:ListGrants"
            ],
            "Resource": [
                "アカウントAのKMSキーARN",
                "アカウントBのKMSキーARN"     
            ],
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": [
                "アカウントAのKMSキーARN",
                "アカウントBのKMSキーARN"
            ]
        }
    ]
}

復元してみる

上記の項目まで設定ができたらコピーアクションが行われるまで待ちます。
コピーアクションが終わるとアカウントBのスナップショットにアカウントAで取得されたスナップショットが出てきます。
アカウントBにアクセスしてEC2ダッシュボードへ移動します。
移動後、左の項目から「スナップショット」をクリックします。

画面が遷移したらコピーされたスナップショットを選択して「アクション」の「スナップショットからイメージの作成」をクリックします。

画面が遷移したら「イメージ名」を入力して「イメージを作成」をクリックします。

クリックしたらAMIの画面へ移動し、作成したAMIを選択して「AMIからインスタンスを起動」をクリックします。

画面が遷移するとEC2の設定画面になるので「インスタンスタイプ」、「セキュリティグループ」、「IAM インスタンスプロフィール」などを設定して「インスタンスを起動」をクリックします。
しばらくするとEC2が実行中になり利用可能になります。

さいごに

前回のAWS Backupの検証もそうでしたが、クロスアカウントでコピーしたりする場合は権限設定が重要なので設定漏れが無いようにしっかり確認する必要があると思いました。