目次
BeeXの榊原です。2025年2月、AWSにとある機能が実装されました。「Systems Managerのオートメーション機能を使用して AWS VSS ソリューションのスナップショットからデータベースを復元できるようになった」というものです。今回はそんな出来立ての機能を実案件で検証&実際に導入する機会があったため、本機能の解説をしていきます。
前提
今回SAPをAWS基盤上で利用しており、SAPに用いるデータベースです。データベースはライセンスの関係でMicrosoft SQL Server 2022でRDSではなくEC2(Dedicated Host)上で稼働しています。また、EC2はSSMからマネージドノードとして認識されています。
基本説明
VSS(ボリュームシャドウコピー)
Windowsの機能の1つです。アプリケーションにVSS Writerが存在する場合、そのアプリケーションをオフラインにせずとも一貫性のあるバックアップが取得可能です。詳細は公式ページをご覧ください。
Systems Manager Automation
Automation は、AWS のサービス (Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Relational Database Service (Amazon RDS)、Amazon Redshift、Amazon Simple Storage Service (Amazon S3) など) でのメンテナンス、デプロイ、および修復に関する一般的なタスクを簡素化するための AWS Systems Manager のツールです。(公式ドキュメントより引用)
Systems Manager ドキュメント
Systems Manager がマネージドインスタンスで実行するアクションを定義します。Systems Manager には、ランタイムでパラメータを指定して使用できる事前設定済みのドキュメントが 100 件以上含まれています。(公式ドキュメントより引用)
オートメーションランブック
直前に記載したSystems Manager ドキュメントのタイプの1つです。(参考)
Systems Manager Automation ランブックでは、オートメーション (Systems Manager がマネージドノードと AWS リソースに対して実行するアクション) を定義します。オートメーションには、いくつかのランブックが事前に定義されており、1 つ以上の Amazon EC2 インスタンスの再起動や、Amazon Machine Image (AMI) の作成といった一般的なタスクを実行する際に使用することができます。独自のランブックを作成することもできます。ランブックは YAML や JSON を使用し、これらにはユーザーが指定するステップおよびパラメータが含まれています。(公式ドキュメントより引用)
重要なのは次の2項目です。
AWSEC2-VssInstallAndSnapshot
Systems Managerのドキュメントの1つでAmazon所有、ドキュメントタイプはCommandです。執筆時点のドキュメントバージョンは3でした。このドキュメントの「SaveVssMetadata」のパラメータをTrueにして実行した場合、OS上の「%PROGRAMDATA%\Amazon\AwsVss\VssMetadata」に下記2つのVSSメタデータファイルが出力されます。
1.スナップショットセットID-timestamp-BCD.xml (BCDとはBackupComponentDocumentを指します。参考)
2.スナップショットセットID-timestamp-SqlServerWriter.xml
上記メタデータファイルはAWS VSS ソリューション ベースの EBS スナップショットから SQL Server データベースを復元する前提条件となっており、スナップショットが取得されるたび生成されます。なのでリストアする場合、戻したい時点のスナップショットとそれに対応したメタデータファイルの両方が必要です。設定パラメータの1つに「ExcludeBootVolume」がありますが、これはスナップショットを取得する際にルートボリュームを含むか含まないかを設定します。ルートボリュームも含めてインスタンスを丸々リストアする場合、インスタンスが壊れたときに備えてCボリュームに格納されたメタデータをS3等に退避させたり、リストア時に退避させたメタデータを再度リストア後のCボリュームに戻すことが必要です。
※なお、AWS Backupを用いてVSSを有効化した状態で取得したバックアップには上記メタデータが含まれませんのでご注意ください。これは、裏で「AWSEC2-CreateVssSnapshot」のRunCommandが動いているのですが、ここで設定するパラメータ「Save Vss Metadata」のデフォルト値が「False」になっているためと考えられます。
AWS Systems Manager を使用して
AWSEC2-VssInstallAndSnapshot
ドキュメントを実行すると、スクリプトは次のステップを実行します。1. このスクリプトは、インスタンスが既にインストールされているかどうかに応じて、最初にインスタンスに
AwsVssComponents
パッケージをインストールまたは更新します。2. このスクリプトは、最初のステップが完了した後に、アプリケーションと整合性のあるスナップショットを作成します。(公式ドキュメントより引用)
また、SQL ServerのトランザクションログのバックアップはSQL Serverの標準機能を使って別途実装が必要なのでご注意ください。
AWSEC2-RestoreSqlServerDatabaseWithVss
Systems Managerのドキュメントの1つでAmazon所有、ドキュメントタイプはAutomationです。執筆時点のドキュメントバージョンは2でした。「RestoreWithNorecovery」をTrueに設定した場合、OS上のSQL Serverがトランザクションログを適用できる状態(Restoring状態)で上がってきます。
AWSEC2-RestoreSqlServerDatabaseWithVss 自動化ドキュメントは、AWS VSS によって取得されたアプリケーション整合性スナップショットを使用して、Windows インスタンス上の SQL Server データベースを復元するために使用されます。
1. ターゲットインスタンスで AWS VSS コンポーネントの最新バージョンを更新またはインストールします。
2. PrepareVssRestore-pitr-test 実行コマンド ドキュメントを使用して、データベースの復元に使用するスナップショット セットに対応する VSS スナップショット セット ID を取得します。
3. スナップショット セットに属する EC2 スナップショットを取得し、そこから新しい EBS ボリュームを作成します。
4. 新しく作成した EBS ボリュームをインスタンスに接続します。
5. RunVssRestoreForSqlDatabase-pitr-test 実行コマンド ドキュメントを使用して、VSS 経由でデータベース復元操作を実行します。(AWSコンソール画面の説明文を自動翻訳)
上記の流れの詳細はAWSコンソール画面では以下のように表示されていました。(AWSコンソールのSSM>ドキュメント>AWSEC2-RestoreSqlServerDatabaseWithVssで確認)
基本説明は以上です。ここで作業の流れを確認します。
作業の流れ
バックアップ取得からリストアまでの流れを記載します。
1.IAM権限の付与
EC2にアタッチしたIAMロールに以下の権限を付与します。IAMユーザの認証情報を使って実行するなど、環境によって追加で必要なものも出てくるので、その場合は追加で権限を付与してください。
・AWSEC2VssSnapshotPolicy
・AWS VSS ソリューションベースのスナップショットから SQL Server データベースを復元するための IAM ポリシー(手動作成。詳細はこちら)
2.SystemsManagerからVssInstallAndSnapshot実行
VSSメタデータを出力し、それに対応したEBSスナップショットを作成します。
3.SystemsManagerからRestoreSqlServerDatabaseWithVss実行
作成されたメタデータとスナップショットを利用してフルバックアップリストアを実行します。このとき、SQL Server データベースのデータは元々ついていたEBSボリュームからは削除され、新規にアタッチされたEBSボリュームに移行されます。その他のボリュームについては既存のEBSボリュームと新しくアタッチされたEBSボリューム、どちらにもデータが残ります。よって後ほど不要なボリュームのデタッチと削除、ドライブレターの書換が必要です。
4.トランザクションログの適用
トランザクションログを適用してロールフォワードを実行します。
5.データベース用EBSボリュームのデタッチ・ドライブレター調整・アタッチ
SQL Serverから一度データベース用EBSボリュームをデタッチして、ドライブレターを元のものに修正し、再度アタッチします。空のEBSボリュームは適当にふるか、デタッチしておきましょう。
6.不要EBSボリュームのデタッチ・削除
動作確認後問題がなければ、不要なEBSボリュームをデタッチして削除しましょう。
最後に
本記事は以上です。EC2上のデータベースのバックアップやリストア機能を実装した経験が今まであまりなかったため、今回の件は非常に勉強になりました。ただ、一回一回手動でバックアップをとってリストアするのは運用上現実的ではないため、実案件ではもう一工夫二工夫加えています。また気が向いたときにそちらも記事化します。ここまでお読みいただきありがとうございました。
- カテゴリー