はじめに
Redshiftには、スナップショット機能(自動/手動)があり、これを使うことでバックアップや復元などが簡単に行えます。
また、この機能はクラスター間の移行にも使うことができますが、タイトルの条件の場合に少しハマったので記事にしておきます。
今回は、アカウントAからアカウントBにデータを移行する場合を考えます。
前提条件
- 移行元
- アカウントA
- Redshift Privisioned
- DC2タイプ
- 暗号化なし
- 移行先
- アカウントB
- Redshift Serverless
実施方法
アカウントAのクラスターのスナップショットを取得
ここは、通常の手動スナップショット取得手順でOKです。
クラスター詳細画面から、右上「アクション」→「スナップショットを作成」をクリックし、識別子と保持期間を入力して作成をクリックします。
スナップショットをアカウントBに共有
ここが注意ポイントです。
まずは、左メニューから「クラスター>スナップショット」をクリックして一覧を表示させ、先ほど取得したスナップショットにチェックを入れます。
その後、右上の「アクション」→「サーバーレスアカウントへのアクセス許可」をクリックし、共有したいアカウントIDを入力、「変更を保存」をクリックします。
これで、別のAWSアカウントのRedshift Serverlessへのスナップショットの共有ができました。
アカウントBのServerlessに復元
ここも一般的な手順でOKです。
アカウントBの方にログインしなおして、Redshift Serverlessのコンソールの「データバックアップ」に先ほど共有したスナップショットが表示されていることを確認します。
その後、そのスナップショットをクリックして、右上の「アクション」→「サーバーレス名前空間への復元」をクリックし、名前空間を選択して「復元」をクリックで完了です。
注意
- 今回の手順がそのまま使えるのは、暗号化なしの場合です。暗号化している場合は、暗号化に使われているKMSキーも別アカウントに共有しないといけません
- 共有=キーポリシーで許可するということなので、CMK(カスタマーマネージドキー)でのみ可能となります。AWSマネージドキーを使っている場合はキーポリシーの編集ができないため、スナップショットの共有ができません
- 今回、スナップショットの共有の際に「サーバーレスアカウントへのアクセス許可」を実施しました。共有の方法は、これ以外にも「手動スナップショットの設定」から「アクセスを管理」でアカウント追加もできますが、この方法だとサーバーレスに復元することが出来ません
- 以下のようなエラーが出ます
AccessDeniedException
Cannot find resource policy for snapshot: arn:aws:redshift:ap-northeast-1:999999999999:snapshot:test-dc2-2/snapshot-dc2-20241201
- 復元するとき、名前空間すべてを上書きしてしまうので、必要なデータがある場合は退避させておきましょう
おわりに
スナップショットの共有と復元ですが、意外とやってみると詰まることが多かったです。パターンも結構ある(暗号化あり/なし、プロビジョンド/サーバーレスなど)ので、ご自身のパターンで一度試しておくことをお勧めします。