AWS RDS for SQL Server2019でbakファイルからデータベース復元する方法

## はじめに
RDS(SQLServer 2019)にbakファイルからデータベース復元を行う記事となります。
通常であればSQLServer Management Studioからデータベース復元が簡単にできますが、
RDSの場合はS3経由でbakファイルを読み込ませる必要があるのでローカルファイルの指定はできません。

**当記事で使用するRDS情報:**
RDS for SQLServer2019 Express Edition
エンジンバージョン:15.00.4415.2.v1

## 全体の流れ

1. RDS構築
2. S3構築
3. S3にbakファイルアップロード
4. IAMロール作成(RDSからS3アクセス用) 
5. オプショングループ作成
6. オプション追加
7. RDSにオプショングループ設定  
8. データベース復元を行うSQL実行

**※当記事では1(RDS構築)については説明は行わない**

## S3構築

特別設定が必要な項目は無いので最低「バケット名」のみ指定して作成しましょう。
但しパブリックアクセスについては全てブロックしましょう。
**※第三者からURLアクセスが不要である為**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/c3b262fb-50fa-822f-59ea-544cfbc5825d.png)


## S3にbakファイルアップロード

作成したバケットを選択してアップロードボタンを押してbakファイルをアップロードしましょう。
ここで注意する点としてはS3にファイルをアップロードするということは、
従量課金の対象となるのでbakが不要になったら削除することをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/c82e70f4-0dff-6b05-bab8-570a8997aee1.png)

アップロードができたら、ARNを控えておきましょう。
データベース復元するSQLを実行する際に必要となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/c5e25588-ab85-d589-4128-69fe95bfc892.png)

## IAMロール作成(RDSからS3アクセス用)
bakファイルをS3経由で読み込む際の権限が必要なので、IAMロールを作成する必要があります。
**IAM>ロール>ロールを作成**と進み
エンティティタイプ：AWSのサービス
ユースケース：RDSとRDS-Add Role to Database
次の画面ではロールを「AmazonS3ReadOnlyAccess」にチェックを入れて作成します。

**※S3にbakファイル作成しアップロードする場合は追加で書き込み用のロールも必要ですが、今回はbakファイル作成のことは考えずデータベース復元のみにフォーカスしているので読み込み用ロールのみ指定します**

## オプショングループ作成
RDSは通常、構築した際に特に何も設定しなければデータベースの復元は許されていません。
許可する為にはオプションとオプショングループを設定します。

まずは、オプショングループを作成します。
**RDS>オプショングループ**からグループ作成ボタンを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/eb3c4531-6e13-7834-9913-05d1fdd50c1d.png)

エンジン：sqlserver-ex
メジャーエンジンバージョン：15.00

上記のパラメーターですが、RDS構築した際の設定により異なりますので各自確認が必要です。
確認方法として**RDS>データベース>作成したデータベース**から設定タブを選択し「DBインスタンスパラメータグループ」を確認するとexpress, 15.00であることがわかります。
後は同じ設定タブ内にエンジンとエンジンバージョンも個別に記述されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/b9eb79b3-9079-a2e6-26d2-1bb550b1a5b5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/a14c5fa8-8f3d-170c-6deb-50c00808a563.png)

## オプション追加
オプショングループの作成ができたら次はオプションを追加します。
作成したオプショングループを選択(チェック)し「オプションの追加」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/71268111-3315-82f6-a583-11abc4801d4e.png)

オプションの追加では、「SQLSERVER_BACKUP_RESTORE」を選択する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/30f3c4b0-0bbc-28f9-657a-e6dac32d22d0.png)

そして、IAMロールの指定では先ほど作った読み込み用のロールを指定します。
S3に対して書き込みは行わないので読み込み用のロールで問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/61c9dc90-79c2-9066-e9bb-b79e499ae3c2.png)

最後のスケジューリング設定ですが、すぐに反映させたい場合は「今すぐ」を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/5a57f182-e913-67a5-ee4f-a463cd963984.png)

これでオプショングループとオプションの作成が完了しました。

## RDSにオプショングループ設定

RDS画面からデータベースを選択して変更ボタンを押してインスタンスの変更画面を開きます。
追加設定のアコーディオンを展開しオプショングループで先ほど作成したオプショングループを選択して変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/ed04cf69-7a32-2d8f-2011-932add7eb3d6.png)

これでデータベース復元の為の準備は全て整いました。


## データベース復元の実行

SQLServer Management Studio等のSQLクライアントから下記SQLを実行します。
RDSが持っているデータベース復元処理を行うストアドプロシージャーを実行しています。
```sql:データベース復元
exec msdb.dbo.rds_restore_database 
    @restore_db_name='データベース名※要変更', 
    @s3_arn_to_restore_from='arn:aws:s3:::XXX/XXX.bak※要変更(S3にアップロードしたbakファイルのARNを指定)';
```

非同期でデータベース復元処理が実行されるのでバックグラウンドタスクとして動きます。
現在の復元処理進捗状況を確認する場合は下記を実行します。

```sql:タスク確認
exec msdb.dbo.rds_task_status 
    @db_name='データベース名※要変更';
```

%completeとlifecycleを確認して復元処理が完了したかどうか判断できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535228/f3a743b1-a698-0ccb-b584-2be8dabd7183.png)


## 余談
・RDSからS3にbakファイルを参照するにあたりRDSに対して直接IAMロールを適用する必要があると思いましたが、オプションに適用したIAMロールだけで十分の様でした。
・セキュリティを強固にする場合は、S3バケットのポリシー定義を検討してください。
・S3にbakファイルが存在し続けるとお金が掛かりますので復元終わったらファイル削除することを検討しましょう。S3バケット自体やIAMロールは次回同じことをやる時に楽になるので残したままで良いと思います。

誤った情報を書いている場合がありますので、その際はご指摘頂けると助かります。

参考文献:
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html