[AWS]RDSスナップショットの本番→テスト環境移行(別アカウント間)

実際にやる機会があったので、SS撮りながら備忘録を残しておく。

**注意**

- なお、このスナップショットを使った移行とは、DBダンプのリストア、、、というわけではなく、新しくRDSインスタンスを作る点に注意。
  - ストレージ容量は本番RDSから増やすことはできても減らすことはできない
  - DB名やマスターユーザー名はAWSコンソール上からは変更不可能。psqlを使って無理やり変更可能だが、RDS上では変更されていないように見えてしまう。

**前提**

- 本番RDSでは1日1回スナップショットを自動で残しており、過去7日間分のスナップショットが存在する形になっている。
- DBエンジンは本番,テスト環境ともPostgreSQL 9.4.7
- 本番RDSとテストRDSはAWSアカウントが別。


参考：

- https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-snapshots-share-account/
- https://fukatsu.tech/migration-rds
- https://qiita.com/ossy0319/items/d1154eac7268ed9a6ed1

# 1. 移行対象の本番環境RDSの自動スナップショットをコピー
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-snapshots-share-account/
に以下の記述があり、本番環境RDSの自動スナップショットはそのままテスト環境RDSへ移行することはできないらしいのでやる必要がある。

> Amazon RDS の自動スナップショットを、AWS の他のアカウントと共有することはできません。自動スナップショットを共有する場合は、スナップショットをコピーして手動バージョンを作成してから、そのコピーを共有します。

１. Amazon RDSのコンソール(本番側)へアクセス
2. スナップショット > システムタブ > 目的のスナップショットを選択
<img width="1395" alt="RDS_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/7abcf138-7446-458c-f7b5-563a5664147d.png">
3. アクションドロップダウンで「スナップショットをコピー」を選択
<img width="1109" alt="スクリーンショット 2020-02-26 11.57.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/89237f73-7604-ca74-b4c9-cc745bc310b4.png">
4. 以下の項目を入力して「スナップショットをコピーする」を押下
  →コピー元のスナップショットの画面に戻される

項目|説明|当時入力した値
---|---|---
送信先リージョン|infoを押下すると別のリージョンにしてね！とあるが、別に災害対策用のスナップショットでもないので元スナップショットのリージョンと同じでいいはず|Asia Pacific (Tokyo)
新しいDBスナップショット識別子|コピーしたことがわかる名前をつけてあげる|handcopy-production-yymmdd
タグをコピー|そもそそもタグがよくわかっていないが、infoを押下すると共有のDBスナップショットではサポートされませんとあるしいらんのじゃないかな。|チェックなし
暗号化|元々のスナップショットが暗号化されている場合は暗号を有効化一択みたい|暗号化を無効にする(元々暗号化されてなかったので)

<img width="664" alt="スクリーンショット 2020-02-26 12.07.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/18a23cba-05c4-9df8-960d-90eb9baee5af.png">
5. スナップショット > 手動タブ
→コピーが追加されていることが確認できる。進行状況が100%になるまで待つこと。

<img width="390" alt="スクリーンショット 2020-02-26 12.20.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/79574ae3-5b54-6d4e-10c8-7df3e50a76f8.png">

# 2. テスト環境RDSが所属するAWSアカウントへスナップショットを共有
1. 引き続いてコピーしたスナップショット名を選択
<img width="390" alt="スクリーンショット 2020-02-26 12.20.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/79574ae3-5b54-6d4e-10c8-7df3e50a76f8.png">

2. アクションドロップダウンで「スナップショットの共有」を選択
<img width="1191" alt="スクリーンショット 2020-02-26 12.26.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/68b86343-6c35-b1bc-63f9-a2b4e1d00d73.png">

3. 以下の項目を入力して追加を押下

項目|説明|当時入力した値
---|---|---
DBスナップショット|移行元のスナップショット名|移行元のスナップショット名であればOK
DBスナップショットの可視性||プライベート
AWSアカウントID|移行先のAWSアカウントID|テスト環境のID

<img width="658" alt="スクリーンショット 2020-02-26 12.29.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/c1c59195-1cdd-08cf-23e5-28da0d1f774e.png">
  →下の「AWSアカウントID」に移行先のAWSアカウントID表示されたらOK
<img width="663" alt="スクリーンショット 2020-02-26 12.33.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/07d1187e-ad5e-767b-11ab-2f2c2f603777.png">
4. 保存を押下

このとき、スナップショットの作成時刻やDBスナップショット名をメモっておくこと。

# 3. テスト環境AWSアカウントへ本番環境RDSのスナップショットからRDSインスタンスを作成
１. Amazon RDSのコンソール(テスト環境側)へアクセス
2. スナップショット > 「自分と共有」タブ > スナップショットの作成時刻が前工程でメモっておいたものと一致するスナップショット名を選択(メモったスナップショット名で検索してもよい)
<img width="1060" alt="スクリーンショット 2020-02-26 12.40.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/5e0ed255-11c1-e6d9-7aa2-74dcaabf78da.png">
3. アクションドロップダウンでスナップショットの復元を選択
<img width="1165" alt="スクリーンショット 2020-02-26 12.41.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/07523268-4d53-5eeb-92f6-80396d9d5518.png">
4. 以下の項目を入力してDBインスタンスの復元を押下
(元々のテスト環境RDSの設定に合わせればいい。いずれもRDSコンソール上で確認できる。)
→対象インスタンスのステータスが利用可能になるまで待つ。

項目|実際の入力値
---|---
DBエンジン|元々のテスト環境RDSの値
ライセンスモデル|元々のテスト環境RDSの値
DBインスタンスのクラス|元々のテスト環境RDSの値
マルチAZ配置|元々のテスト環境RDSの値
ストレージタイプ|元々のテスト環境RDSの値
DBインスタンス識別子|<元々のテスト環境RDSのDBインスタンスID>-<移行元のスナップショット名>
Virtual Private Cloud(VPC)|元々のテスト環境RDSの値
サブネットグループ|元々のテスト環境RDSの値
パブリックアクセシビリティ|元々のテスト環境RDSの値
アベイラビリティゾーン|元々のテスト環境RDSの値
VPCセキュリティグループ|元々のテスト環境RDSの値
データベースのポート|元々のテスト環境RDSの値
パラメータグループ|元々のテスト環境RDSの値
バックアップ|元々のテスト環境RDSの値
マイナーバージョン自動アップグレード|元々のテスト環境RDSの値

![スクリーンショット 2020-02-26 13.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/5a60f2b0-2633-008a-af27-06dfe4e928de.png)


# 4. スナップショットから復元したRDSの諸々の設定を変更する。
本番環境とテスト環境では、DBのマスターユーザー名、パスワード、DB名、ストレージ容量なんかも異なることが多いハズ。適宜変更したいところ。

・・・残念ながらストレージ容量の減少は仕様上できない模様。

DBのマスターユーザー名、パスワード、DB名の変更は以下の手順。
で変更できた(Postgres向け＆RDS接続サーバにpsqlがインストールされていること前提)。
※なお、AWS(RDS)コンソール上では見かけ上変化なしなので、以降コンソール上の設定値は当てにできないことに注意。


1. テスト環境のRDSへ接続するサーバへログイン

2. 以下の通りコマンド実行

```
# テスト環境のRDSへ接続
psql -h <新テスト環境RDSのエンドポイントURL> -U <新テスト環境RDSのマスターユーザ名> -d <新テスト環境RDSのDB名> -W
→新テスト環境RDSのマスターユーザーパスワードを入力。※現時点で何もいじっていないため、マスターユーザ名、DB名、パスワードは本番環境と同じはず。新テスト環境のRDSのエンドポイントURLは、テスト環境のRDSコンソールの「接続とセキュリティ」で確認できる

# カレントDB変更(psqlコンソールで。カレントDBがリネーム対象だとリネームできないので)
\c template1

# DB名変更(psqlコンソールで。)
ALTER DATABASE <新テスト環境RDSのDB名(現在)> RENAME TO <新テスト環境RDSのDB名(変更後)>;

# マスターユーザー名変更用のユーザーを作成(psqlコンソールで)
CREATE ROLE <変更用ユーザー名> WITH CREATEROLE LOGIN PASSWORD '<変更用ユーザーのパスワード>';
※適当な名前、パスワードでいい

# psql切断
\q

psql -h <新テスト環境RDSのエンドポイントURL> -U <変更用ユーザー名> -d <新テスト環境RDSのDB名(変更後)> -W
※パスワードは<変更用ユーザーのパスワード>を入力

# マスターユーザー名を変更(psqlコンソールで)
ALTER ROLE <新テスト環境RDSのマスターユーザ名(現在)> RENAME TO <新テスト環境RDSのマスターユーザ名(変更後)>;
→NOTICE:  MD5 password cleared because of role rename　(リネームによりパスワード消失したよ警告)

# 新テスト環境RDSのマスターユーザ(変更後)にパスワードを設定(psqlコンソールで)
ALTER ROLE <新テスト環境RDSのマスターユーザ名(変更後)> WITH PASSWORD '<新テスト環境RDSマスターユーザのパスワード(変更後)>';

# psql切断
\q

# 接続確認
psql -h <新テスト環境RDSのエンドポイントURL> -U <新テスト環境RDSのマスターユーザ名(変更後)> -d <新テスト環境RDSのDB名(変更後)> -W
→新テスト環境RDSのマスターユーザーパスワード(変更後)を入力して接続できれば成功。

# マスターユーザー名変更用のユーザーを削除(psqlコンソールで)
DROP ROLE <変更用ユーザー名>;

```