Amazon Web Services ブログ
Amazon RDS の手動スナップショットを管理するための通知メカニズムを構築する
ビジネスの規模に関係なく、ビジネスを遂行する上でデータが不可欠な要素であることは隠すまでもないことです。多くの企業は、リレーショナルデータベースを使用してビジネスデータをホストしています。その結果、バックアップとリカバリはビジネスを継続的に実行するための重要な側面になっています。Amazon RDS の顧客は、複数の戦略を活用して、自動スナップショットと手動スナップショットの両方でデータをバックアップします。データベースを削除すると自動スナップショットも削除されるため、Amazon RDS の手動スナップショットを使用して寿命を延ばすことができます。また、アカウント間およびリージョン間での共有機能を備えた災害対策用の手動スナップショットを使用することもできます。Amazon RDS は、単一のスナップショットからデータベース全体をリカバリできるため、さまざまなバックアップニーズに対応します。
この記事では、RDS インスタンスと Aurora クラスターの両方の Amazon RDS 手動スナップショットを管理するためのサーバーレスの通知メカニズムを構築する方法を示します。実行する主なアクティビティは次のとおりです。
- RDS インスタンスと Aurora クラスターのリストを指定されて、定義されたバックアップ間隔で手動スナップショットを作成する
- バックアップの保存期間に基づいて、古い手動スナップショットを削除する
- このアクティビティの最後に、新しく作成された手動スナップショットと古い削除されたスナップショット (存在する場合) のリストが登録しているユーザーに通知される。
詳細については、README.md ファイルを参照し、GitHub リポジトリからソリューションを起動してください。
サーバーレスソリューションのアーキテクチャ
このサーバーレスソリューションは、AWS CloudFormation スクリプトに組み込まれています。このスクリプトは、ユーザー指定のスナップショットバックアップ間隔、バックアップ保持期間、RDS インスタンス名のリスト、通知用の E メールアドレスなどのさまざまな入力を受け取ります。Amazon CloudWatch Events ルールは、スケジュールに従って AWS Step Functions ステートマシンを起動します。このステートマシンは手動スナップショットを作成し、古いスナップショットを削除し、最終的に Amazon SNS に通知を送信します。SNS は、ユーザー提供の E メールアドレスに E メールを送信します。
Amazon RDS 手動スナップショット (RDS インスタンスと Aurora クラスター) を管理するソリューションは、次の AWS のサービスとともに実行されます。
- AWS Step Functions: オーケストレーションを行い、個別の機能を実行する個々のコンポーネントの調整を容易にします。
- AWS Lambda: タスク状態を実装する機能を提供します。Lambda 関数は、Python で実装されています。
- Amazon DynamoDB: スナップショットと通知の管理のためのスナップショット情報を保存します。
- Amazon SNS: サブスクリプションエンドポイントへのスナップショット通知の配信を調整するための柔軟で完全マネージド型の pub/sub メッセージングサービスを提供します。
- Amazon CloudWatch Events: 自動化されたスケジュールで Step Functions をトリガーするために使用されます。
このソリューションにはほとんど制限がありません。
- このソリューションは AWS Step Functions に依存しているため、このソリューションは AWS Step Functions がサポートされている AWS リージョンでのみ使用できます。
- このソリューションは、暗号化された手動スナップショットで動作するようには構築されていません。
次の図は、アーキテクチャを示しています。表示される主なアクティビティは次のとおりです。
- CloudWatch Events のルールが、自動されたスケジュールでステートマシンの実行をトリガーします。
- ステートマシンが、最初の Lambda 関数を呼び出してスナップショットを作成します。
- スナップショット作成 Lambda 機能が、Aurora クラスターを含むすべての RDS インスタンスの手動スナップショットの作成を開始します (提供される場合)。同じ Lambda 関数が、スナップショット情報を DynamoDB テーブルに入力します。
- ステートマシンは 2 つの Lambda 関数を並列に実行します: 古いスナップショットを削除し、スナップショットをチェックします。
- 古いスナップショット削除 Lambda 関数は、DynamoDB から情報を取得し、バックアップ保持期間に基づいてスナップショットを削除します。
- Step Functions ステートマシン内で、スナップショットチェック Lambda 関数は、完了の状態をチェックします。スナップショットが完了するために RDS インスタンスが残っている場合、Lambda 関数は例外を発生させます。ステートマシンはこの例外エラーをキャプチャし、一定期間後に再試行を行います。
- 4 番目の Lambda 関数である E メール通知は、スナップショット情報の DynamoDB でのステータスをチェックします。この Lambda 関数は、2 つの SNS トピックに情報を公開します。
- RDSBackupInfo トピックは、新しく作成されたスナップショットとスケジュールされた実行で削除された古いスナップショットについての情報を通知します。
- Backups_Failed_RDS トピックは、スケジュールされた実行で失敗したバックアップを通知します。
- 最後に、両方の SNS トピックが、提供された E メールアドレスを使って通知を登録しているエンドユーザに送信します。
手動スナップショット処理のワークフローを理解するために、Step Functions ステートマシンの動作を詳しく見てみましょう。
実装前の前提条件
- Amazon RDS: クラウドでの、使いやすいスケーラブルなリレーショナルデータベース。AWS CloudFormation スタックが開始されたのと同じリージョンに、少なくとも 1 つの RDS インスタンスが必要です。
- RDS インスタンス名のリストと、\n で区切られた rds_backup_list.txt という名前のテキストファイル。たとえば、次のスクリーンショットに示すように、ファイルの名前が testinstance であるとします。
- rds_backup_list.txt ファイルが見つからない場合、ステートマシンは失敗し、例外がスローされます。
通知付き Amazon RDS 手動スナップショットを実装する
このアーキテクチャを AWS にデプロイする手順は、以下のステップで構成されています。
ステップ 1 – CloudFormation スクリプト (YAML ファイル) と Lambda 関数 (下記) をダウンロードする
- check_snapshots.zip
- delete_old_snapshots_rds.zip
- email_notification.zip
- take_snapshots_rds.zip
ステップ 2 – Lambda 関数を S3 バケットにアップロードする (ステップ 4 の CodeBucket)
- 次のスクリーンショットに示すように、Lambda 関数 (zip ファイル) を選択した S3 バケットにアップロードします。
- S3 バケットの Lambda 関数は、CloudFormation スクリプトが実行されるのと同じリージョンにある必要があります。
ステップ 3 – CloudFormation スクリプトを実行する
- 選択したリージョンで AWS CloudFormation テンプレートをアップロードします。
- 次のスクリーンショットに示すように、一意のスタック名を指定します。
- S3 バケットの Lambda 関数は、CloudFormation スクリプトが実行されるのと同じリージョンにある必要があります。
ステップ 4 – スタックを起動する
- AWS アカウントで AWS CloudFormation テンプレートを起動します。
- 次のスクリーンショットに示すように、スタックの入力パラメータ値を入力します。
- バックアップ間隔 – 時間単位でのバックアップの間隔。デフォルトは、24 時間に設定されています。
- バックアップスケジュール – CloudWatch Event Cron 形式で提供します。すべての間隔で、少なくとも 1 回実行します。デフォルト値は、UTC の午前 1:00 に 1 回実行です。詳細については、CloudWatch スケジュールイベント式 – AWS ドキュメントを参照してください。
- CodeBucket – デプロイするためにステップ 2 でアップロードされた Lambda 関数を含むバケットの名前。
- DeleteOldSnapshots – TRUE または FALSE を選択できます。TRUE に設定すると、RetentionDays に基づいてスナップショットを削除できます。FALSE に設定すると削除できなくなるので、DynamoDB で履歴情報を使用できます。
- LogLevel – Lambda 関数のログレベル。有効な値は、DEBUG、INFO、WARN、ERROR、CRITICAL のいずれかです。
- NotifyEmail – 通知を送信するために必要な E メールアドレス。SNS によって送信されたサブスクリプションが、E メール通知を受信できることを確認します。
- RetentionDays – 値は、スナップショットを削除するまで保持する日数です。デフォルトは、7 日間です。
ステップ 5 – CloudFormation のオプションとレビュー
- CloudFormation の [Options] 画面で [Next] を選択します。
- [Review] レビューページで、作成されたコンポーネントに基づいて AWS が IAM ロールの作成を処理するようにします。
- [I acknowledge that AWS CloudFormation might create IAM resources with custom names] のボックスにチェックを入れます。
- [Next] を選択して CloudFormation スクリプトを実行します。
ステップ 6 – CloudFormation スクリプトを実行する
- スタックの作成が CREATE_COMPLETE の状態になるまで待ちます。
- 次のスクリーンショットに示されるように、[Outputs] タブを確認します。
- S3SourceListBucketOutput – rds_backup_list.txt ファイルをアップロードできる新しい S3 バケットが作成されます。
- BackupFailedTopic – 失敗したバックアップのアラートを受け取る SNS トピック。
- EmailNotificationTopic – 新しく作成されたスナップショットと削除されたスナップショットの通知を受け取る SNS トピック。
ステップ 7 – rds_backup_list.txt をアップロードする
- rds_backup_list.txt ファイルには、バックアップする RDS DB インスタンスまたは Aurora クラスター名のリストが含まれています。たとえば、blogtest RDS インスタンスが次のスクリーンショットに示されています。
- それぞれの DB インスタンス名は、テキストファイルの別の行に表示されます。下は、サンプルの .txt ファイルのスクリーンショットです。
- CloudFormation スクリプトからの出力として利用可能な新しく作成された S3 バケットに、このファイルを S3SourceListBucketOutput としてアップロードします。結果が、次のスクリーンショットに示されています。
ステップ 8 – ツールをテストする
- Step Functions コンソールに移動し、CloudFormation スクリプトで作成されたステートマシンを選択します。例を次のスクリーンショットに示します。
- [New Execution] を選択して、ツールをテストします。
- 実行名を指定します。たとえば、「BlogTest1」と指定し、[Start Execution] を選択してテストを実行します。
- ステートマシンのさまざまな機能がトリガーされるビジュアルワークフローを参照してください。この例を次のスクリーンショットに示します。
- rds_backup_list.txt ファイルにリストされているデータベース用に、スナップショットの最初のセットが作成されていることが分かります。
- 必要に応じて、CloudWatch ルールをチェックし、バックアップスケジュールがステップ 4 で定義したとおりに作成されているか確認します。また、ステップが完了したときに SNS が送信する E メール通知を確認することもできます。E メールの例をここに示します。
サーバーレススナップショットソリューションの通知機能を振り返る
ビジネスデータを失うことは、時間と金銭の両面で致命的となる可能性があります。データベースのバックアップ戦略を持つこととは別に、監視システムを導入することは、重要なビジネスデータを保存する正しい方向への一歩です。このサーバーレス RDS 手動スナップショットソリューションを構築すると、データベースのバックアップ戦略に関して懸念する項目が少なくなります。
著者について
Suman Koduri は、アマゾン ウェブ サービスの上級テクニカルアカウントマネージャーです。彼は、エンタープライズサポートの顧客と協力し、AWS プラットフォームを最大限に活用するための技術的な指導と支援を提供しています。空き時間には、ハーフマラソンを走り、バイクに乗るのが大好きです。