RDS for SQL Server へのインポート

## はじめに
オンプレの SQL Server のバックアップから RDS for SQL Server にデータをインポートするときの手順。
[ここ](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html)に全部書いてあることなので、難しいことはない。ただ、制限事項がいくつかあるので、注意すること。

## だいたいの流れ

- bak ファイルを S3 に置く
- DB インスタンスにオプショングループ(SQLSERVER_BACKUP_RESTORE)を追加する
- S3 にアクセスする IAM Role を作る
- rds_restore_database ストアドプロシージャを呼び出して復元

## 実際にやってみた
### bak ファイルを S3 に置く
割愛

### DB インスタンスにオプショングループ(SQLSERVER_BACKUP_RESTORE)の追加
SQLServer の DB インスタンスはすでに存在している前提で

まず、RDS メニューから**オプショングループ**を選択して、[グループの作成]を押下する
![screen_capture_08-30.png](https://qiita-image-store.s3.amazonaws.com/0/269938/e7882a2a-0158-e55d-cbfb-ed932a8106fa.png)

下記の項目を適当に設定する

- 名前
- 説明
- エンジン
- メジャーエンジンのバージョン
![screen_capture_08-30(0).png](https://qiita-image-store.s3.amazonaws.com/0/269938/26ac49dd-c1d7-2a01-3c34-a42a2e78ba35.png)

グループを作成しただけでは、SQLSERVER_BACKUP_RESTORE は有効になっていないので、[オプションの追加]を押下する
![screen_capture_08-30(1).png](https://qiita-image-store.s3.amazonaws.com/0/269938/806f7329-0c4f-8ca0-011d-0c213e35f663.png)

オプションは **SQLSERVER_BACKUP_RESTORE** しか選択できないので、これを選択する
IAM ロールは作成していないのであれば、ここで作成が可能
![screen_capture_08-30(2).png](https://qiita-image-store.s3.amazonaws.com/0/269938/55145cea-31b5-27d1-be19-330140eb6549.png)

ここで作成されたIAM ロールは下記のようになっている

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::'bucket_name'"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectMetaData",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::'bucket_name'/*"
            ]
        }
    ]
}
```

オプション追加後は下図のようになる
![screen_capture_08-30(3).png](https://qiita-image-store.s3.amazonaws.com/0/269938/6ca71cb7-c010-a386-fa08-643ec7550bd9.png)

このオプショングループを DB インスタンスに反映させる

### 復元
SQL Server Management Studio で接続し、新しいクエリで以下を実行する
database_name と bucket_name、file_name は環境に合わせて変更すること

```sql
exec msdb.dbo.rds_restore_database 
@restore_db_name='database_name', 
@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name';
```
![screen_capture_08-30.png](https://qiita-image-store.s3.amazonaws.com/0/269938/92ba9fe8-80ce-582f-4a52-966d9e44de78.png)

インポートのジョブが動き始めることを確認する
![screen_capture_08-30(0).png](https://qiita-image-store.s3.amazonaws.com/0/269938/e00494bf-4921-bedb-3267-e21155c52c61.png)

ジョブの結果を確認するには、下記のクエリを実行する
database_name は環境に合わせて変更すること

```sql
exec msdb.dbo.rds_task_status @db_name='database_name';
```
![screen_capture_08-30(1).png](https://qiita-image-store.s3.amazonaws.com/0/269938/b865fc37-7cbf-8f00-486c-8d3e3df62cf0.png)

lifecycle が状態を示す。下図の場合は、実行中を示す
![screen_capture_08-30(2).png](https://qiita-image-store.s3.amazonaws.com/0/269938/83f8847a-8eff-ac35-5845-695aae3cb3c1.png)

lifecycle が **SUCCESS** となれば完了
![screen_capture_08-30(3).png](https://qiita-image-store.s3.amazonaws.com/0/269938/e7c1cc42-648d-0c8e-106c-ae8bda67483a.png)

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html