RDS for SQL Server のネイティブバックアップを実行する
Amazon RDS for SQL Server のネイティブバックアップ機能を活用し、S3 を経由してバックアップ・復元を行う手順と注意点を紹介します。
概要
対象タスク
- RDS for SQL Server データベースのネイティブバックアップファイル(.bak)を Amazon S3 に保存
- 同じ RDS DB インスタンスにバックアップを復元
本手順では暗号化されていないデータベースを対象とします。暗号化されたデータベースを利用する場合は、SQL ステートメントが異なるため、AWS 公式ドキュメントをご確認ください。
🔗 AWS 公式ガイド: SQL Server のネイティブバックアップ
準備
同じ RDS DB インスタンスにバックアップを復元するため、復元作業後にストレージが容量不足にならないことを調べます。
1️⃣ 現時点のデータベースサイズの確認
✅ 最低限必要なストレージサイズを確認
下記のSQLクエリで 現時点のデータベースの総サイズの値(database_size
)を確認します。
USE <detabase_name>;
EXEC sp_spaceused;
SQL Server Management Studio (SSMS) で確認する方法
- 「Databases」→ バックアップ対象のデータベースを右クリックし、「プロパティ」を選択する。
- 「サイズ」の値を確認する
2️⃣ 空きストレージを確認
✅ 現在のストレージサイズのまま復元して影響が無いかを確認
AWS RDS を使用している場合 は、CloudWatch メトリクス FreeStorageSpace
で空きストレージを確認できます。データ増加の余裕を考えた空きストレージが残っていれば🆗です。
⚠️ 拡張する時の注意点
RDSのストレージ容量を増やすと、後から減らすことはできません。どうしても減らしたい場合は、dumpを取ってから別のRDSインスタンスを作る必要があります。
📍空きストレージが少ない場合
運用体制にあわせてRDSのストレージ増加を検討してください🚀
- IaC でインフラを管理している場合など:手動でストレージ容量を増やす
- RDSのストレージ自動スケーリング機能を適用している場合:自動スケーリングで対応する
🔗 Classmethod: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:PutObject や s3: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 にバックアップを取ろうとしてしまいエラーが発生していたというオチでした🙈⚡️
以上、どなたかの参考になれば幸いです。
えみり〜でした|ωΦ)ฅ
参考
Discussion