Amazon謹製のEFSバックアップソリューションを使ってみた:バックアップ編

Amazon Elastic File System (EFS)が東京リージョンで一般提供されて約2ヶ月たちました。 みなさん、Amazon EFS をお使いでしょうか?

プロダクションサービスに組み込む場合、どれだけ手離れよく運用できるかは重要なポイントです。

Amazon EFS を運用する上で一点気をつけないといけないのは、Amazon EFS は可用性・耐久性は高いが、ファイルシステムの意図しない変更や削除に対しては別途対策が必要ということです。

このような意図しないオペレーションに対しては、Amazon EFS のユーザーガイドでは EFS-to-EFS バックアップソリューションが推奨されています。

今回は、このバックアップソリューションで実際にバックアップしてみます。

リストアについては、次の記事を参照ください。

Amazon謹製のEFSバックアップソリューションを使ってみた:リストア編

EFS-to-EFS バックアップソリューション概要

EFS-to-EFS バックアップソリューションは、その名の通り、バックアップしたい EFS(source file system) を別の EFS(backup file system) にバックアップするソリューションです。

  • バックアップスケジュール
  • データ保持期間
  • バックアップ対象パス

などを細かく指定できます。

差分バックアップを利用するため、初回バックアップ以降は、処理時間や消費ストレージを軽減できます。

また

  • バックアップ
  • リストア

で個別にデプロイが必要です。

図の引用元 https://aws.amazon.com/answers/infrastructure-management/efs-backup/

運用費

バックアップソリューションの1ヶ月の利用費の概算を求めてみます。

ランニングコストで多くを占めるのは以下の3つです。

  • バックアップ先 EFS
  • バックアップを実行する EC2
  • バックアップ実行結果を記録する DynamoDB

1つ目の EFS に関してはシステムやバックアップの世代管理方針によって大きく異なります。

仮に

  • 変更の発生しないデータが1TB
  • 毎日100GB分のデータが変更され、差分バックアップ対象になる
  • 7 世代バックアップを保持

とすると、(1000 + 7 x 100)GB-Month x $0.36 = $612.0/月 かかります。

2つ目の EC2 に関して、インスタンスタイプにデフォルトの c5.xlarge を利用し、毎日2時間バックアップ処理を行ったとすると、 $0.214/hour x 2 hour x 30(day) = $12.84/月 かかります。

3つ目の DynamoDB に関して、read/write ともに capacity unit を 2 とすると、 ($0.000742 per WCU x 2 WCU + $0.0001484 per RCU x 2 RCU) x 24 hour x 30(day) = $1.28/月 かかります。

上記以外にも、Lambda、EC2 の実行ログ保存に利用する S3、CloudWatch Dashboard、SNS などの費用も発生しますが、多くのケースでは数ドルに収まるでしょう。

運用費のイメージがついたでしょうか?

バックアップソリューションをデプロイする

バックアップソリューションのデプロイには CloudFormation を使います。

次の URL にアクセスすることで、ソリューション用テンプレートを選択した CloudFormation Stack の作成画面に遷移します。

Launch button for EFS backup solution stack

重要なパラメーターを紹介します。

パラメーター 意味
Retain バックアップを保持する世代数
Backup Window バックアップジョブの最大起動時間を分で指定。実際は、terminate時の処理を考慮して、この期間よりも15分だけ短い。
Backup Schedule CloudWatch Ruleで利用するバックアップ起動スケジュール。UTC タイムゾーンで指定

注意が必要なのは EC2 Configuration の Subnet IDsです。

ここで指定したサブネットは

  • バックアップ処理で利用する Auto Scaling Group のサブネット
  • バックアップ先 EFS のマウントターゲット

で利用されます。

現在の CloudFormation テンプレートでは、2個より多いサブネットを指定すると

  • ジョブを実行する Auto Scaling Group には指定したサブネット全部
  • EFS のマウントターゲットにはそのうち2サブネット

だけが利用されます。

結果、バックアップ用 EC2 が EFS マウントターゲットのないサブネットに起動すると、バックアップ処理が失敗します。

2サブネットだけ指定するか、手動で EFS のマウントターゲットを追加してください。個人的には後者をおすすめします。

各パラメーターの説明は次のドキュメントを参照ください

Automated Deployment

SNS の疎通確認

SNS のメール通知を有効にすると、記入したメールアドレスに 「AWS Notification - Subscription Confirmation」という件名の確認メールが届きます。

バックアップ完了時の通知に利用されます。

"Confirm subscription" をクリックして、Confirm してください。

バックアップの確認

バックアップのSNS通知

バックアップ処理が終了すると、成功・失敗にかかわらず、SNS 経由で「EFS Backup Status」という件名でメール通知されます。

{
    "BackupId": "d94f2b28", 
    "BackupPrefix": "/", 
    "BackupStartTime": "2018-08-09T13:00:38", 
    "BackupStatus": "Success", 
    "BackupStopTime": "2018-08-09T13:02:49", 
    "BackupWindow": "180", 
    "CreateHardlinksStartTime": "2018-08-09T13:02:30", 
    "CreateHardlinksStopTime": "2018-08-09T13:02:32", 
    "DestinationEfsId": "fs-AAA", 
    "DestinationEfsSize": 98304, 
    "DestinationPerformanceMode": "generalPurpose", 
    "EC2Logs": "https://s3.amazonaws.com/YOUR-BUCKET-NAME/ec2-logs/efs-backup-backup-20180809-1302.log", 
    "ExpireItem": "1541595636", 
    "InstanceType": "c5.xlarge", 
    "IntervalTag": "daily", 
    "Message": "The EFS was backed up successfully", 
    "NumberOfFiles": 6, 
    "NumberOfFilesTransferred": 0, 
    "RemoveSnapshotStartTime": "2018-08-09T13:02:30", 
    "RemoveSnapshotStopTime": "2018-08-09T13:02:30", 
    "RetainPeriod": "7", 
    "RsyncDeleteStartTime": "2018-08-09T13:02:33", 
    "RsyncDeleteStopTime": "2018-08-09T13:02:33", 
    "S3BucketSize": 762430, 
    "SourceBurstCreditBalance": 2308974418330, 
    "SourceBurstCreditBalancePostBackup": 2308974418330, 
    "SourceEfsId": "fs-XXX", 
    "SourceEfsSize": 36864, 
    "SourcePerformanceMode": "generalPurpose", 
    "SourcePermittedThroughput": 104857600, 
    "TotalFileSize": 38, 
    "TotalTransferredFileSize": 0
}

"Message": "The EFS was backed up successfully" からバックアップジョブは成功したことがわかります。

バックアップデータの確認

初回の呼び出し後に、バックアップ先の EFS を確認します。

バックアップ先の EFS は「efs-backup-<CloudFormationのスタック名>」という名前で作成されます。

実際にバックアップされていることを確認します。

# バックアップ先 EFS をマウント
$ sudo mkdir backup
$ sudo mount -t efs fs-123:/ backup
# バックアップ一覧を確認
$ sudo ls -1 backup/efs-backup/
daily.0 # ← 最新
daily.1
daily.2
daily.3
daily.4
daily.5 # ← 最古
# ファイル一覧を確認
$ sudo tree backup/efs-backup/daily.0
backup/efs-backup/daily.0
...

DynamoDB の実行ログの確認

「efs-backup-<CloudFormationのスタック名>」という名前の DynamoDB テーブルが作成され、バックアップ時のログが記録されます。

以下の情報が記録されます。

  • BackupId
  • BackupPrefix
  • BackupStartTime
  • BackupStatus
  • BackupStopTime
  • BackupWindow
  • CreateHardlinksStartTime
  • CreateHardlinksStopTime
  • DestinationEfsId
  • DestinationEfsSize
  • DestinationPerformanceMode
  • EC2Logs
  • ExpireItem
  • InstanceType
  • IntervalTag
  • NumberOfFiles
  • NumberOfFilesTransferred
  • RemoveSnapshotStartTime
  • RemoveSnapshotStopTime
  • RetainPeriod
  • RsyncDeleteStartTime
  • RsyncDeleteStopTime
  • S3BucketSize
  • SourceBurstCreditBalance
  • SourceBurstCreditBalancePostBackup
  • SourceEfsId
  • SourceEfsSize
  • SourcePerformanceMode
  • SourcePermittedThroughput
  • TotalFileSize
  • TotalTransferredFileSize

EC2のバックアップ処理のログを確認

このソリューションでは、バックアップごとに Auto Scaling 経由で EC2 インスタンスが起動&Terminateされます。

バックアップ処理時に EC2 ログは「<CloudFormationのスタック名>efslogbucket-<ランダム文字列>」という名前の S3 バケットに保存されます。

処理ごとにプリフィックスを分けてログ出力されます。

$ aws s3 ls --recursive s3://test00-efs2efs-efslogbucket-k8scfhpd8qhs
# cloud-init ログ
2018-08-09 13:02:48      72958 ec2-logs/efs-backup-backup-20180809-1302.log
# コピーログ
2018-08-09 13:02:48        917 efs-backup-logs/efs-backup-backup-fpsync-20180809-1302.log
2018-08-09 13:02:49        123 efs-backup-logs/efs-backup-backup-rsync-delete-20180809-1302.log
# ssm run command経由の操作ログ
2018-08-09 13:02:50        688 ssm-logs/7ba50a6a-ae33-49ec-8ecc-e84f1af8257a/i-0e6e0cb5a4aaf3a5b/awsrunShellScript/0.awsrunShellScript/stderr
2018-08-09 13:02:50       1780 ssm-logs/7ba50a6a-ae33-49ec-8ecc-e84f1af8257a/i-0e6e0cb5a4aaf3a5b/awsrunShellScript/0.awsrunShellScript/stdout

参考 https://docs.aws.amazon.com/solutions/latest/efs-to-efs-backup/appendix-b.html

ソリューションのカスタマイズ

バックアップを繰り返すうちに、各種パラメーターをカスタマイズしたいことがあるかと思います。

カスタマイズ方法をいくつか紹介します。

バックアップ実行するインスタンスタイプを変える

バックアップ用 EC2 は Auto Scaling 経由で起動されます。

ソリューションデプロイ時に「<CloudFormationのスタック名>-BackupInstanceLaunchConfig-XXX」というLanuch Configurations が作成されるため、この Instance Type を変更してください。

デフォルトのインスタンスタイプは「c5.xlarge」です。

実行スケジュールを変更

バックアップは CloudWatch Events の Rule 経由で実行されます。

ソリューションデプロイ時に「<CloudFormationのスタック名>-EFSBackupStartEvent-XXX」というルールが作成されるため、このルールのスケジュールを変更してください。

バックアップウィンドウを変更する

バックアップ用 EC2 インスタンスは

  • バックアップ処理が終了
  • バックアップウィンドウが終了

のいずれかを満たすと、Terminate されます。

バックアップがウィンドウ時間内に終了しない場合は、この時間を延長してください。(他に、スケールアップ、バックアップ粒度を細かくする、なども有力です)

ソリューションデプロイ時に「<CloudFormationのスタック名>-EFS2EFS」というLambda関数が作成されます。

バックアップがウィンドウを変えるには、この関数の環境変数 backup_window_period を変更します。 この値の単位は「分」です。

ソリューション利用状況を AWS に送信したくない

デフォルトの CloudFormation テンプレートを利用してデプロイすると、ソリューションの利用状況が AWS に送信されます。

ソリューションデプロイ時に「<CloudFormationのスタック名>-EFS2EFS」というLambda関数が作成されます。 この関数の環境変数 send_anonymous_data で送信の有無をコントロールしています。

オプトアウトしたい場合は、この値を「No」に変えてください。

EFS のマウントターゲットを増やす

ソリューション構築時に作成されるバックアップ先の EFS は、マウントターゲットが 2 AZ 分しか作成されません。

管理コンソールから EFS 作成時には

We recommend creating a mount target in each of your VPC's Availability Zones so that EC2 instances across your VPC can access the file system.

というメッセージが表示されることですし、マウントターゲットが作成されなかった AZ に対しては、手動でマウントターゲットを追加しておきましょう。

放置しておくと、マウントターゲットが存在しないインスタンスからアクセスできません。

注意事項

本ソリューションを利用する上での注意・検討事項を列挙します。

詳細は、次のドキュメントを参照ください。

Design Considerations

初回実行時は潤沢なリソースで実行

このソリューションは差分バックアップを採用しています。

そのため、初回と2回目以降で、要求されるコンピューティングリソースが大きく異なります。

初回実行時はインスタンスタイプやバックアップウィンドウを余裕をもって設定し、2回目以降は各種メトリクスを確認しながらサイジングしてください。

バックアップの粒度を分ける

EFS のパスによって、データの更新頻度や重要度が異なることもあるかと思います。 その場合は、このソリューションを複数デプロイしてください。

まとめ

意図しないファイルシステム操作に備えて、EFS を別の EFS にバックアップするソリューションを紹介しました。

差分バックアップを採用し、バックアップ用コンピューティングリソースはバックアップ処理時だけ起動するため、バックアップに伴うコストを低く抑えられます。

CloudFormation を使ってソリューション提供されており、簡単にデプロイ可能なため、Amazon EFS のバックアップ方法を検討中の場合は、一度お試しください。

参考