みなさんこんにちは。虎の穴ラボのエンジニアNです。
先日、データベースバックアップでAWS コマンドラインインターフェイス (CLI) を利用する機会がありましたので共有します。
やりたいこと
虎の穴ラボで運営しているとあるWebサービスで、インフラとしてAWSを利用しています。データベースはAmazon RDSを利用しており、1日1回、保持期間1日で自動バックアップを行なっていました。
しかし四六時中更新されるサービスでこのサイクルと保持期間ではちょっと心配ということがあります。今回はバックアップサイクルを1日2回、保持期間を8日間に増やしたいと思います。
自動バックアップの限界
Amazon RDSには自動バックアップ機能が用意されており、以下の通り設定ができます。
設定できる自動バックアップの設定は1つのDBインスタンスにつき1種類です。
項目 | デフォルト値 | 設定可能な値 |
---|---|---|
バックアップサイクル | 1回/日 | 設定変更不可 |
バックアップ開始時刻 | リージョンごとに8時間の時間ブロックからランダムに選択される | 「開始時刻」と「期間(0.5〜3時間)」をUTCで指定 |
バックアップ保持期間 | 7日 | 1日〜35日 |
基本的には自動バックアップを設定しておけば何の問題もありませんが、
バックアップサイクルを変更できないという弱点が存在します。
開始時刻と保存期間は設定できるのにバックアップサイクルの設定ができないことに疑問はありますが、Amazonはテクニカルな解決方法を用意してくれていました。
それがAWS コマンドラインインターフェイス (CLI)です。
クラウドサービスを提供している側も利用する側もエンジニアです。
途中までは用意しておくけれど後は自分でやって欲しいということかもしれませんね。
AWS CLIのインストール
早速AWS CLIをインストールします。インストール方法は公式に詳しく書かれています。
RDSスナップショットの作成
1日1回は自動バックアップに任せるとして、2回目のバックアップをAWS CLIを使って作成します。
今回のWebサービスではAmazon RDSとしてAuroraを利用しています。
Amazon Auroraはインスタンスを作成するとDB クラスターが作成されます。DB クラスターは、1 つ以上の DB インスタンスと、これらのインスタンスのデータを管理する 1 つのクラスターボリュームで構成されます。
Amazon Auroraを使用しない場合、DBインスタンスのスナップショットを作成することでDBインスタンス全体のバックアップをすることができますが、Amazon Auroraを使用する場合はDBクラスターのスナップショットを作成する必要があります。
今回はクラスタースナップショットの作成方法をご紹介します。
作成したスナップショット名の後ろに日付と時間を付与することにします。
コマンドは以下のとおりです。
aws rds create-db-cluster-snapshot --db-cluster-identifier クラスター名 --db-cluster-snapshot-identifier スナップショット名-`date "+%Y-%m-%d-%H-%M"`
過去のスナップショットを削除する
これでスナップショットが作成できた!終わり!と行きたいですが、このままでは無限にスナップショットを作成され続けてしまいます。
8日前のスナップショットを削除するコマンドは以下の通りです。
aws rds delete-db-cluster-snapshot --db-cluster-snapshot-identifier スナップショット名-`date "+%Y-%m-%d-%H-%M" -d "8 days ago"`
スケジュール登録
作成するコマンドと削除するコマンドをcrontabに登録します。
8日前の同時刻に作成したスナップショットを削除したいため、「スナップショットの作成」と「過去のスナップショットの削除」は、どちらも同じ時刻に設定します。以下の例は毎日12:30に実施されるようにします。
crontabに設定するとき、dateコマンドの'%'をエスケープすることを忘れないでください。
30 12 * * * /bin/bash -l -c 'aws rds create-db-cluster-snapshot --db-cluster-identifier クラスター名 --db-cluster-snapshot-identifier スナップショット名-`date "+\%Y-\%m-\%d-\%H-\%M"`'
30 12 * * * /bin/bash -l -c 'aws rds delete-db-cluster-snapshot --db-cluster-snapshot-identifier スナップショット名-`date "+\%Y-\%m-\%d-\%H-\%M" -d "8 days ago"`'
スナップショットが作成できていることと、8日前のスナップショットが削除されれば成功です!
もっといい方法があるよという方がいましたらコメントをお願いします。
エンジニア大募集!!
虎の穴ではエンジニアを大募集中です!!JavaやRubyでの開発やAWSやGCPに興味のある方、ぜひご応募ください!