☃️

RDS for SQL Server のネイティブバックアップを実行する

2025/02/06に公開

Amazon RDS for SQL Server のネイティブバックアップ機能を活用し、S3 を経由してバックアップ・復元を行う手順と注意点を紹介します。

概要

対象タスク

  1. RDS for SQL Server データベースのネイティブバックアップファイル(.bak)を Amazon S3 に保存
  2. 同じ RDS DB インスタンスにバックアップを復元

本手順では暗号化されていないデータベースを対象とします。暗号化されたデータベースを利用する場合は、SQL ステートメントが異なるため、AWS 公式ドキュメントをご確認ください。
🔗 AWS 公式ガイド: SQL Server のネイティブバックアップ

準備

同じ RDS DB インスタンスにバックアップを復元するため、復元作業後にストレージが容量不足にならないことを調べます。

1️⃣ 現時点のデータベースサイズの確認

最低限必要なストレージサイズを確認
下記のSQLクエリで 現時点のデータベースの総サイズの値(database_size)を確認します。

USE <detabase_name>;
EXEC sp_spaceused;
SQL Server Management Studio (SSMS) で確認する方法
  1. 「Databases」→ バックアップ対象のデータベースを右クリックし、「プロパティ」を選択する。
  2. 「サイズ」の値を確認する

2️⃣ 空きストレージを確認

現在のストレージサイズのまま復元して影響が無いかを確認
AWS RDS を使用している場合 は、CloudWatch メトリクス FreeStorageSpace で空きストレージを確認できます。データ増加の余裕を考えた空きストレージが残っていれば🆗です。

⚠️ 拡張する時の注意点
RDSのストレージ容量を増やすと、後から減らすことはできません。どうしても減らしたい場合は、dumpを取ってから別のRDSインスタンスを作る必要があります。

📍空きストレージが少ない場合
運用体制にあわせてRDSのストレージ増加を検討してください🚀

データベースのバックアップを開始する

以下の SQL ステートメントを実行し、データベースのバックアップを開始します。

exec msdb.dbo.rds_backup_database
    @source_db_name='<backup_database_name>', 
    @s3_arn_to_backup_to='arn:aws:s3:::<bucket_name>/<file_name_and_extension>'

引数の説明

  • <backup_database_name> : バックアップ元のデータベース名
  • <file_name_and_extension> : ファイルパス+ファイル名(例:testdb/testdb-backup-yyyymmdd.bak)

実行後、<task_id> が返ってくるので、以下の SQL で進捗を確認できます。

exec msdb.dbo.rds_task_status
    @task_id=<task_id>;

バックアップまたは復元ステートメントを実行した後に取得でき、完了したタスクと保留中のタスクをすべて識別できます。

データベースを復元する

バックアップ完了後、S3 バケットのバックアップファイルからデータベースを復元します。

exec msdb.dbo.rds_restore_database
	@restore_db_name='<restore_database_name>',
	@s3_arn_to_restore_from='arn:aws:s3:::<bucket_name>/<file_name_and_extension>';

引数の説明

  • <restore_database_name> : 復元される新しいデータベース名
  • <file_name_and_extension> : バックアップ元のファイルパス+ファイル名

復元完了です! 🎉

🔴 発生したエラーと対処法

私がバックアップを開始しようとした際に発生したエラーと、対処法として調べた内容をまとめました。

発生したエラーは以下の内容です。

エラーメッセージ

Error: Aborted the task because of a task failure or an overlap with your preferred backup window for RDS automated backup.
Error making request with Error Code Forbidden and Http Status Code Forbidden.

🔍 考えられる原因と対処法の一覧

原因 説明 確認方法 & 対処法
1️⃣ IAM ポリシーの権限不足 RDS の IAM ロールが S3 への書き込み権限を持っていない aws iam get-role-policy でポリシー確認
s3:PutObjects3:GetObject を付与
2️⃣ S3 バケットのパス間違い arn:aws:s3:::<バケット名>/<ファイル名> の形式が間違っている aws s3 ls s3://<bucket_name> で確認
3️⃣ S3 のリージョンが一致しない S3 のリージョンが RDS のリージョンと異なるとアクセス拒否 aws s3api get-bucket-location でリージョン確認
4️⃣ S3 のパブリックアクセスブロック S3 の ACL やバケットポリシーでアクセスがブロックされている aws s3api get-bucket-policy で確認
5️⃣ RDS の自動バックアップウィンドウと競合 RDS の自動バックアップ中は手動バックアップができない ✅ RDS のバックアップウィンドウを確認 (aws rds describe-db-instances)
6️⃣ S3 オブジェクト名に使用できない文字が含まれている <backup_file_name> に特殊文字が入っている可能性 _- 以外の特殊文字を使っていないかチェック
参考:1️⃣ IAM ポリシーの権限不足について

以下のポリシー例を参考にしてください。

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

注: arn:aws:s3:::<bucket_name> は、実際の S3 バケットの ARN に置き換えます。

私の場合は、「IAM ポリシー」に設定していた「S3 バケットのパス」とは異なる S3 にバックアップを取ろうとしてしまいエラーが発生していたというオチでした🙈⚡️

以上、どなたかの参考になれば幸いです。
えみり〜でした|ωΦ)ฅ

参考

https://repost.aws/ja/knowledge-center/rds-sql-server-fix-native-backup-restore

Discussion