オンプレSQLServerをRDSにリストアする手順

# はじめに
最近、オンプレ環境のSQL ServerをRDSインスタンスにリストアする機会がありました。
その手順のメモです。


# 環境
* オンプレ（移行前）
    * DB：SQL Server Standard Edition 15.x 
    * Windows：Windows Server 2019
        * SSMS（SQL Server Microsoft Studio）
        * aws cli
* AWS（移行先｜手順の中で作成）
    * RDS：SQL Server Standard Edition 15.x 
    * EC2：Windows Server 2019
        * SSMS（SQL Server Microsoft Studio）

# リストア手順
### 1. オンプレ環境でバックアップを取得
オンプレ環境で、リストアしたいDBのバックアップを取得します。
取得したバックアップファイルは、適当なファイル名で適当な場所に保存しておきます。

### 2. S3バケットを作成
バックアップを一時的に保管する場所としてS3バケットが必要です。
名前は何でもいいので適当に作成します。

### 3. 取得したバックアップをS3に転送
取得したバックアップファイルを、S3バケットに転送します。
S3への転送方法はいくつかありますが、今回はシンプルにaws cliを利用してインターネット経由で転送します。

1.対象S3にPutObjectできる権限を持つIAM Userを作成
2.IAM Userからアクセスキーを取得
3.オンプレWIndowsサーバーでconfig/credentialsを設定

```:~/.aws/config
[profile default]
region = ap-northeast-1
output = json
```
```:~/.aws/credentials
[default]
aws_access_key_id = ?????????
aws_secret_access_key = ????????
```

4.aws cliを実行して転送

```:cmd
aws s3 mv "<先ほど作成したバックアップファイルのpath>" s3://<s3-bucket-name>
```


### 4. リストア用のIAM Roleを作成
SQL Serverのリストアを行うためには、専用のRDSオプション、IAM Role、そしてS3バケットが必要です。
以下のPolicyを持つIAM Roleを作成します。

```json:policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::<s3-buckett-name>"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::<s3-bucket-name>/*"
        }
    ]
}
```
```json:信頼ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
```

### 5. オプショングループを作成&オプションの追加
`sqlserver-se(v 15.00)`のオプショングループを作成し、そこにリストア用のオプションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975289/295bade1-bcf7-0484-15cc-f9a5442e988e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975289/6ce90193-9889-35e5-00ed-51e969100b35.png)

### 6. RDSインスタンスを作成
リストア先となるRDSインスタンスを作成します。
最低限以下の設定を守り、あとは適当な設定にします。

* エンジン：SQL Server Standard Edittion
* バージョン：15.00.4073.23.v1
* オプショングループ：前手順で作成したオプショングループ

注意：バックアップファイルのサイズに合わせてストレージのサイズUPが必要


### 7. Windows ServerのAMIからEC2を作成し、そこにSSMSをインストール
RDSを操作するためには、EC2などのサーバーから接続する必要があります。
セキュリティグループの設定などは、各自でいい感じに設定してください。

### EC2からSSMSを利用してRDSに接続
作成したEC2に接続し、SSMSを起動します。
RDSエンドポイント、RDS作成時に決めたマスタユーザー名/パスワードを入力して接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975289/fbcc0908-d266-93d7-8d51-aa50a79f6794.png)

### 9. リストア用のストアドプロシージャを実行
接続できたら「New Query」でエディタを開き、以下のストアドプロシージャを書いて実行します。
実行タスクが成功すれば、程なくしてDBが作成されます。

```:query
exec msdb.dbo.rds_restore_database 
	@restore_db_name='<作成したいdb名>', 
	@s3_arn_to_restore_from='arn:aws:s3:::<s3-bucket-name>/<backup-file-name>'
```

# 最後に
SQL ServerをRDSにリストアする基本的な流れを残しました。
もっと詳しく知りたい方はAWS公式ページをご覧ください。

# 参考

* [SQL Server のネイティブバックアップおよび復元のサポート](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.SQLServer.Options.BackupRestore.html)
* [SQL Server を実行している Amazon RDS DB インスタンスのネイティブバックアップを実行する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/native-backup-rds-sql-server/)