Edited at

Amazonの各データベースサービスやストレージのバックアップについて (Amazon RDS, ElastiCache for Redisバックアップ設定 + S3バージョニングやクロスレプリケーション設定)

More than 1 year has passed since last update.


はじめに

株式会社ネクストでインフラエンジニアを担当している @na0AaooQ と申します。

この記事は 株式会社ネクスト(Lifull) Advent Calendar 2016 の19日目の記事になります。

AWS(Amazon Web Services)には便利なサービスが多々ありますが、その中には、マネージドデータベースサービス というものがあります。

これらのマネージドデータベースサービスは優れたスケーラビリティや耐障害性を持っております。

しかし、マネージドデータベースサービスを利用する場合でも、何らかの操作ミスやプログラム誤動作といった要因によって、保存していたデータが消えてしまう可能性がありますので、定期的にデータをバックアップする事が大切と考えております。

本日はAWSのデータベースサービスやストレージサービスのうち一部サービスについて、バックアップの設定や方法についてお話させて頂きたいと思います。

 ・Amazon RDS

 ・Amazon ElastiCache for Redis

 ・Amazon S3


参考資料

以下の資料を参考にさせて頂きました。

Amazon APIリファレンス類

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/RDS.html#createDBSnapshot-property

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElastiCache.html#createSnapshot-property

http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/Snapshots.html

http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBSnapshot.html


リレーショナルデータベースのバックアップについて

オンプレミスでデータベースサーバを構築・運用していた時代、私は以下のようなDBMS用のバックアップコマンドを利用して、データのバックアップを行っておりました。

DBMS
バックアップコマンドの例

Oracle
rmanコマンド, expコマンド, expdpコマンド

MySQL
mysqldumpコマンド, xtrabackupコマンド

PostgreSQL
pg_dumpコマンド, pg_dumpallコマンド

これらのバックアップコマンドを定期的に自動実行する事で、データベースサーバ以外のストレージにバックアップデータを保存しておりました。実際に何度かデータを復元した事があり、バックアップは心強い存在でした。

しかし、バックアップの設定やデータ復元には、DBMSや各コマンド等の知識が必要であり、データベースをもっと簡単にバックアップ出来る方法はないか探しておりました。

前置き長くなりましたが、Amazon RDSには標準的なバックアップ機能(DBスナップショット取得機能)が備わっており、容易に自動バックアップを設定出来るようになりました。


Amazon RDSのバックアップについて


(1) Amazon RDSインスタンス作成時の自動バックアップ設定

Amazon RDSはデータを自動バックアップする設定が可能です。

自動バックアップを設定すると、Amazon RDSインスタンスのDBスナップショットが自動的に作成されて、RDSインスタンスに保存したデータがバックアップされるようになります。


(1-1) AWSマネジメントコンソールにログインして「RDS」をクリックします。

スクリーンショット 2016-12-18 19.57.01.png


(1-2)「RDSダッシュボード」の「DBインスタンスの起動」をクリックして、Amazon RDSインスタンスを作成します。

スクリーンショット 2016-12-18 19.57.47.png


(1-3)「MySQL」の「選択」をクリックします。

スクリーンショット 2016-12-18 19.58.40.png


(1-4)「開発/テスト」の「MySQL」を選択して「次のステップ」をクリックします。

e67ca612-2acc-7601-015d-1dd666b820ae.png


(1-5) 作成するAmazon RDSインスタンスの設定を入力して「次のステップ」をクリックします。

debb5276-88ea-a710-f112-67ed1211d890.png

スクリーンショット 2016-12-18 20.01.42.png


(1-6)「バックアップの保存期間」を設定します。

「バックアップ」の「バックアップの保存期間」を0から1日以上に変更する事で、自動的にAmazon RDSインスタンスのバックアップが実行されるようになります。

スクリーンショット 2016-12-18 20.02.47.png

スクリーンショット 2016-12-18 20.06.27.png


(2) 稼働中のAmazon RDSインスタンスの自動バックアップ設定

稼働中のAmazon RDSインスタンスに対しても、自動バックアップを設定したり、バックアップ保存期間を変更可能です。


(2-1) AWSマネジメントコンソールにログインして「RDS」をクリックします。

スクリーンショット 2016-12-18 20.07.55.png


(2-2)「RDSダッシュボード」からバックアップ設定を変更したいAmazon RDSインスタンスを選択して「変更」をクリックします。

スクリーンショット 2016-12-18 20.10.01.png


(2-3) RDSインスタンスの設定変更画面が表示されます。

スクリーンショット 2016-12-18 20.10.28.png


(2-4)「バックアップの保存期間」を設定します。

「バックアップ」の「バックアップの保存期間」を変更する事で、0から1日以上に変更する事で、自動的にAmazon RDSインスタンスのバックアップが実行されるようになります。

また、バックアップ保存期間は1日〜35日の間で選択出来ます。

スクリーンショット 2016-12-18 20.10.46.png

スクリーンショット 2016-12-18 20.11.15.png


(2-5) バックアップ設定変更を適用する場合は「すぐに適用」にチェックをつけて「次へ」をクリックします。

スクリーンショット 2016-12-18 20.14.10.png


(3) Amazon LambdaによるAmazon RDSの自動バックアップ

前述の設定により、毎日Amazon RDSの自動バックアップが作成されるようになります。

この自動バックアップの保存期間は最大35日間という制限があり、古いバックアップは自動的に削除されます。

しかし、例えば、毎月1日といった特定の間隔で自動バックアップを取得したい、35日経過してもバックアップを残しておきたいといった事があるかもしれません。

そのような場合、Amazon Lambdaファンクションで、Amazon RDSインスタンスのDBスナップショットを作成するようスケジュール設定する事で、毎月1日といった特定の間隔で自動バックアップを取得する事が可能です。


(3-1) Amazon Lambdaファンクション用のIAMロールを作成します。

IAMロール「example-rds-backup」を作成します。

スクリーンショット 2016-12-18 20.28.45.png

スクリーンショット 2016-12-18 20.30.06.png

スクリーンショット 2016-12-18 20.31.04.png

スクリーンショット 2016-12-18 20.31.49.png

スクリーンショット 2016-12-18 20.32.06.png

スクリーンショット 2016-12-18 20.32.53.png


(3-2) Amazon RDSバックアップ用Amazon Lambdaファンクションを作成します。

「Create Lambda Functions」をクリックします。

スクリーンショット 2016-12-18 20.33.59.png

「Select blueprint」では「hello world」をクリックして選択します。

スクリーンショット 2016-12-18 20.35.41.png

「Next」をクリックします。

スクリーンショット 2016-12-18 20.36.07.png

「Configure function」で以下のように入力して、Lambdaファンクション「example-rds-backup」を作成します。

設定項目
選択 または 入力する内容

Name
example-rds-backup

Description
example-rds-backup

Runtime
Node.js 4.3

Code entry type
Edit code inline

Environment variables
RDS_DBINSTANCE_IDENTIFIER とRDS_DBSNAPSHOT_IDENTIFIER の2つの環境変数を設定する。環境変数の値は example-rds-backup と設定する。

Handler
index.handler

Role
Choose an existing role

Exitsing Role
example-rds-backup

Memory
128 MB

Timeout
0 min 3 sec

VPC
No VPC

KMS Key
(default) aws/lambda

「Code」に入力するLambdaファンクションのコードは以下になります。


example-rds-backup.js

'use strict';

// http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/RDS.html#createDBSnapshot-property
var AWS = require('aws-sdk'), rds = new AWS.RDS({ apiVersion: '2014-10-31' });

exports.handler = (event, context) => {

console.log('Start Amazon RDS Database Snapshot Backup');

var dbInstanceIdentifier = process.env.RDS_DBINSTANCE_IDENTIFIER;
var dbSnapshotIdentifier = process.env.RDS_DBSNAPSHOT_IDENTIFIER;

// Add timedate to description
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hour = date.getHours();
var minutes = date.getMinutes();
if ( day < 10 ) {
day = '0' + day;
}
// UTC to JST
hour += 9;
if ( hour < 10 ) {
hour = '0' + hour;
}
if ( minutes < 10 ) {
minutes = '0' + minutes;
}
var backupRunDate = '-' + year.toString() + month.toString() + day.toString() + '-' + hour.toString() + minutes.toString();

var params = {
DBInstanceIdentifier: dbInstanceIdentifier,
DBSnapshotIdentifier: dbSnapshotIdentifier + backupRunDate
};

console.log(params);

rds.createDBSnapshot(params, function(err, data) {
if (err) context.done(err, err.stack);
else context.done(null, data);
});

};


スクリーンショット 2016-12-18 20.39.21.png

スクリーンショット 2016-12-18 20.43.18.png

「Next」をクリックします。

スクリーンショット 2016-12-18 20.55.34.png

「Create function」をクリックします。

スクリーンショット 2016-12-18 21.11.12.png

スクリーンショット 2016-12-18 21.11.17.png


(3-3) Amazon RDSバックアップ用Amazon Lambdaファンクションを実行します。

「Test」をクリックして、Lambdaを実行します。

スクリーンショット 2016-12-18 21.11.55.png

「Save & Test」をクリックします。

スクリーンショット 2016-12-18 21.13.42.png

スクリーンショット 2016-12-18 21.13.14.png


(3-4) Amazon LambdaファンクションによりAmazon RDSのバックアップが開始されます。

スクリーンショット 2016-12-18 21.15.16.png

スクリーンショット 2016-12-18 21.16.17.png

スクリーンショット 2016-12-18 21.14.26.png


(3-5) Amazon Lambdaファンクションを定期的に実行するよう設定します。

Amazon Lambdaファンクションを定期的に実行するよう設定し、Amazon RDSの自動バックアップを設定します。

Amazon Lambdaファンクションの実行スケジュールを設定する手順については、以下を参考にしてみて下さい。

http://qiita.com/na0AaooQ/items/3c60f8eb85bdde1c7f64


Redisのバックアップについて

オンプレミスでRedisサーバを構築・運用していた時代、Redisをマスターとスレーブの2台構成とし、マスターの変更をスレーブへレプリケーションするよう設定していました。

そして、Redisスレーブサーバのrdbファイルをバックアップ用ストレージへコピーする事で、 Redisのデータをバックアップしておりました。


Amazon ElastiCache(Amazon ElastiCache for Redis)のバックアップについて


(4) Amazon ElastiCacheクラスタ作成時の自動バックアップ設定

Amazon ElastiCacheのRedisはデータを自動バックアップする設定が可能です。


(4-1) AWSマネジメントコンソールにログインして「ElastiCache」をクリックします。

スクリーンショット 2016-12-18 21.30.55.png


(4-2)「ElastiCacheダッシュボード」の「Redis」の「Create」をクリックして、Amazon ElastiCacheクラスタ(Redisクラスタ)を作成します。

スクリーンショット 2016-12-18 21.30.13.png


(4-3) Amazon ElastiCacheクラスタの自動バックアップを設定します。

Amazon ElastiCacheクラスタ(Redis)作成時に「Backup」の「Enable automatic backups」にチェックをつける事で、Amazon ElastiCacheクラスタ(Redis)に保存したデータを自動バックアップするよう設定出来ます。

スクリーンショット 2016-12-18 21.26.41.png

スクリーンショット 2016-12-18 21.28.11.png


(5) 稼働中のAmazon RDSインスタンスの自動バックアップ設定

稼働中のAmazon ElastiCacheクラスタ(Redis)に対しても、自動バックアップを設定可能です。


(5-1) AWSマネジメントコンソールにログインして「ElastiCache」をクリックします。


(5-2)「ElastiCacheダッシュボード」から自動バックアップを設定したいRedisクラスタの「Modify」をクリックします。

スクリーンショット 2016-12-18 21.37.08.png


(5-3)「Enable Automatic Backups」を設定します。

「Enable Automatic Backups」を「Yes」と選択する事で、Amazon ElastiCacheクラスタ(Redis)の自動バックアップを設定出来ます。

また「Backup Retention Period」を変更する事で、バックアップ保存期間は1日〜35日の間で選択出来ます。

スクリーンショット 2016-12-18 21.37.44.png

スクリーンショット 2016-12-18 21.39.22.png


(6) Amazon LambdaによるAmazon ElastiCache(Redis)の自動バックアップ

前述の設定により、毎日Amazon ElastiCache(Redis)の自動バックアップが作成されるようになります。

この自動バックアップの保存期間は最大35日間という制限があり、古いバックアップは自動的に削除されます。

しかし、例えば、毎月1日といった特定の間隔で自動バックアップを取得したい、35日経過してもバックアップを残しておきたいといった事があるかもしれません。

そのような場合、Amazon Lambdaファンクションで、Amazon ElastiCache(Redis)クラスタのスナップショットを作成するようスケジュール設定する事で、毎月1日といった特定の間隔で自動バックアップを取得する事が可能です。

設定自体は前述の「Amazon LambdaによるAmazon RDSの自動バックアップ」とほとんど変わりません。

作成するAmazon LambdaファンクションのコードをAmazon ElastiCache(Redis)用に少し修正するだけで、バックアップを行う事が可能です。


(6-1) Amazon Lambdaファンクション用のIAMロールを作成します。

IAMロール「example-elasticache-redis-backup」を作成します。

スクリーンショット 2016-12-18 21.45.06.png


(6-2) Amazon ElastiCache(Redis)バックアップ用Amazon Lambdaファンクションを作成します。

「Create Lambda Functions」をクリックします。

「Select blueprint」では「hello world」をクリックして選択します。

「Next」をクリックします。

「Configure function」で以下のように入力して、Lambdaファンクション「example-rds-backup」を作成します。

設定項目
選択 または 入力する内容

Name
example-elasticache-redis-backup

Description
example-elasticache-redis-backup

Runtime
Node.js 4.3

Code entry type
Edit code inline

Environment variables
ELASTICACHE_SNAPSHOT_NAME とELASTICACHE_CLUSTER_NAME の2つの環境変数を設定する。環境変数の値は example-redis1-001 と設定する。

Handler
index.handler

Role
Choose an existing role

Exitsing Role
example-elasticache-redis-backup

Memory
128 MB

Timeout
0 min 3 sec

VPC
No VPC

KMS Key
(default) aws/lambda

「Code」に入力するLambdaファンクションのコードは以下になります。


example-elasticache-redis-backup.js

'use strict';

// http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElastiCache.html#createSnapshot-property
var AWS = require('aws-sdk'), elasticache = new AWS.ElastiCache({ apiVersion: '2015-02-02' });

exports.handler = (event, context) => {

console.log('Start Amazon ElastiCache Snapshot Backup');

var elasticacheClusterName = process.env.ELASTICACHE_CLUSTER_NAME;
var elasticacheSnapshotName = process.env.ELASTICACHE_SNAPSHOT_NAME;

// Add timedate to description
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hour = date.getHours();
var minutes = date.getMinutes();
if ( day < 10 ) {
day = '0' + day;
}
// UTC to JST
hour += 9;
if ( hour < 10 ) {
hour = '0' + hour;
}
if ( minutes < 10 ) {
minutes = '0' + minutes;
}
var backupRunDate = '-' + year.toString() + month.toString() + day.toString() + '-' + hour.toString() + minutes.toString();

var params = {
SnapshotName: elasticacheSnapshotName + backupRunDate,
CacheClusterId: elasticacheClusterName
};

console.log(params);

elasticache.createSnapshot(params, function(err, data) {
if (err) context.done(err, err.stack);
else context.done(null, data);
});

};


スクリーンショット 2016-12-18 21.49.39.png

スクリーンショット 2016-12-18 21.51.11.png

スクリーンショット 2016-12-18 21.52.54.png

「Next」をクリックします。

スクリーンショット 2016-12-18 21.52.59.png

「Create function」をクリックします。

スクリーンショット 2016-12-18 21.53.31.png

スクリーンショット 2016-12-18 21.53.33.png


(6-3) Amazon ElastiCache(Redis)バックアップ用Amazon Lambdaファンクションを実行します。

「Test」をクリックして、Lambdaを実行します。

スクリーンショット 2016-12-18 21.54.30.png

「Save & Test」をクリックします。

スクリーンショット 2016-12-18 21.55.05.png

スクリーンショット 2016-12-18 21.55.10.png


(6-4) Amazon LambdaファンクションによりAmazon ElastiCache(Redis)のバックアップが開始されます。

スクリーンショット 2016-12-18 21.56.06.png

スクリーンショット 2016-12-18 21.56.11.png

スクリーンショット 2016-12-18 21.57.55.png

スクリーンショット 2016-12-18 21.58.12.png


(6-5) Amazon Lambdaファンクションを定期的に実行するよう設定します。

Amazon Lambdaファンクションを定期的に実行するよう設定し、Amazon ElastiCache(Redis)の自動バックアップを設定します。

Amazon Lambdaファンクションの実行スケジュールを設定する手順については、以下を参考にしてみて下さい。

http://qiita.com/na0AaooQ/items/3c60f8eb85bdde1c7f64


Amazon S3のバックアップについて


(7) Amazon S3のバックアップ(バージョニング)設定

Amazon S3は 99.99% の可用性を備えた、極めて耐障害性が高いオブジェクトストレージです。

基本的には、ユーザが誤ってS3バケット上に保存したデータ(オブジェクト)を消さない限り、データが消失する可能性は極めて低いと思います。

今回はS3に保存したオブジェクトを誤って消してしまった場合に備えて、オブジェクトをバックアップ(バージョニング)する設定をご説明します。


(7-1) AWSマネジメントコンソールにログインして「S3」をクリックします。

スクリーンショット 2016-12-18 22.12.46.png


(7-2) S3のバックアップ(バージョニング)を設定したいS3バケット名をクリックします。

今回の例では、example-search-crontabバケットをクリックします。

スクリーンショット 2016-12-18 22.15.36.png


(7-3)「バージョニング」の「バージョニングの有効化」をクリックし、S3のオブジェクトについて、全てのバージョンを保持するよう設定します。

「バージョニングの有効化」をクリックします。

スクリーンショット 2016-12-18 22.16.52.png

「OK」をクリックします。

スクリーンショット 2016-12-18 22.17.04.png

以下のように「バージョニングは現在、このバケットで有効になっています」と表示されれば、S3のバックアップ(バージョニング)設定は終わりです。

スクリーンショット 2016-12-18 22.17.40.png


(7-4) S3バケットに保存したオブジェクトを削除します。バージョニング有効化により古いバージョン(削除前)のオブジェクトが残るようになったのを確認します。

スクリーンショット 2016-12-18 22.20.18.png

スクリーンショット 2016-12-18 22.21.58.png

「OK」をクリックして、S3に保存しているオブジェクトを削除します。

スクリーンショット 2016-12-18 22.22.39.png

画面上の「バージョン」の「表示」をクリックします。

S3バケットから削除したオブジェクトについて、削除前のオブジェクトが残るようになりました。

スクリーンショット 2016-12-18 22.23.40.png

削除前のオブジェクトをクリックすると、オブジェクトの内容も確認する事が出来ます;。

スクリーンショット 2016-12-18 22.24.51.png


(8) Amazon S3のバックアップ(クロスリージョン レプリケーション)設定

次はどちらかといえばディザスタリカバリ用途で利用されるものと思いますが、Amazon S3のバックアップ(クロスリージョン レプリケーション)設定についてご説明します。

これは、例えばTokyoリージョンのS3バケットに対して、別のリージョンにバックアップ用S3バケットを作成しておく事で、TokyoリージョンのS3バケットにファイルを保存すると、別リージョンのS3バケットへファイルをレプリケーションするというバックアップ設定になります。


(8-1) AWSマネジメントコンソールにログインして「S3」をクリックします。


(8-2) S3のバックアップ(バージョニング)を設定したいS3バケット名をクリックします。

スクリーンショット 2016-12-18 23.18.06.png


(8-3)「クロスリージョン レプリケーション」をクリックします。

スクリーンショット 2016-12-18 23.18.06.png


(8-4)「クロスリージョン レプリケーションを有効化」を行い、S3バケットへファイルを保存した時、別のリージョンのS3バケットへ自動的にバックアップするよう設定します。

「クロスリージョン レプリケーションを有効化」を選択します。

以下のように設定します。

スクリーンショット 2016-12-18 23.19.29.png

スクリーンショット 2016-12-18 23.21.17.png

スクリーンショット 2016-12-18 23.21.48.png

「IAMロールの作成/選択」をクリックします。

スクリーンショット 2016-12-18 23.22.23.png

「詳細を表示」をクリックします。ポリシードキュメントはデフォルトのままで「許可」をクリックします。

スクリーンショット 2016-12-18 23.22.52.png


example-search-crontab-example-search-crontab-backup-s3-repl-rolポリシードキュメント

{

"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetReplicationConfiguration",
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::example-search-crontab"
]
},
{
"Action": [
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::example-search-crontab/*"
]
},
{
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::example-search-crontab-backup/*"
}
]
}

「保存」をクリックします。

スクリーンショット 2016-12-18 23.25.32.png

「このバケットではクロスリージョン レプリケーションは現在有効化されています。」と表示されれば、設定完了です。

スクリーンショット 2016-12-18 23.26.34.png


(8-5) S3バケットへファイルを保存し、別リージョンのS3バケットへ自動的にファイルがバックアップされている事を確認します。

まず、Tokyoリージョンの「クロスリージョン レプリケーション」を有効化したS3バケットに対して、ファイルをアップロードします。

スクリーンショット 2016-12-18 23.31.19.png

スクリーンショット 2016-12-18 23.28.25.png

次にバックアップ先として指定したSingaporeリージョンのS3バケットに対して、TokyoリージョンのS3バケットへアップロードしたファイルがレプリケーションされている事を確認します。

スクリーンショット 2016-12-18 23.34.22.png

TokyoリージョンのS3バケットへアップロードしたファイルについて、SingaporeリージョンのS3バケットへレプリケーションされている事を確認します。これでバックアップ確認完了です。

スクリーンショット 2016-12-18 23.36.08.png


まとめ

Amazon RDS, Amazon ElastiCache for Redis, Amazon S3は簡単な設定で、データをバックアップするよう設定する事が出来ます。

Amazon Lambdaを組み合わせると、バックアップ間隔を細かく制御する事も可能です。

不測のデータ消失に備えて、データのバックアップを行うようにしておきたいですね。


株式会社ネクスト(Lifull) Advent Calendar 2016 の20日目は @wakuteka さんの記事になります。

よろしくお願い致します。