EFSのレプリケーション機能を利用して複数リージョンでバックアップを取得してみた

レプリケーション機能でリージョン冗長化したEFSのバックアップを両方のリージョンで取得してみました。ついでにレプリケーションを削除してから昇格したEFSを元にまたレプリケーションしてバックアップが取れるか確認しました。

こんにちは、AWS事業本部のニシヤマです。

EFSのレプリケーション機能を使って東京リージョンから大阪リージョンへレプリケートする

上記のブログでEFSに別リージョンへのレプリケーション機能が追加されましたがこちらの機能でレプリケーションしつつ、予期せぬ削除ミスなどのためにAWS Backupを利用したバックアップを取得する構成を試してみたのでご紹介します。

構成はこのようになります。

Amazon EFSのバックアップ方法はどれを選べば良い?

また、EFSのバックアップ方法に関しては上記ブログで、EFSの作成時にチェックボックスで簡単に設定可能な自動バックアップ機能が紹介されていますが、レプリケーション機能を利用するとセカンダリリージョン側のEFSは自動で作成されてしまいます。 そのため、自動バックアップ機能を設定するタイミングがないため以下ブログに記載のAWS Backupを設定するCloudFormationテンプレートを利用します。

[小ネタ]任意のタグを持つリソースをAWS Backupで取得するCloudFormationテンプレート

やってみる

ではやっていきます。構成図にある両方のリージョンでのVPC環境と必要なセキュリティグループ、EFSマウント用EC2(Amazon Linux 2)が作成された状態から始めます。

まずはEFSのレプリケーション構成を作成します。

プライマリリージョンでEFSを作成

ではプライマリリージョンの東京リージョンでEFSを作成します。

ファイルシステムの作成をクリックします。

ここでファイルシステム名と、作成するVPCを指定したらカスタマイズをクリックします。

ファイルシステムの設定画面が表示されるので、自動バックアップを有効化のチェックを外して次へをクリックします。

ネットワークアクセス画面ではマウントターゲットの指定と、EFS用のセキュリティグループを指定して次へをクリックします。

ファイルシステムポリシーはそのままで次へをクリックします。

確認してEFSファイルシステムを作成します。

EFSファイルシステムが作成できました。

では東京リージョンのEFSマウント用EC2からマウントして適当なファイルを作成します。

EC2からのEFSマウントについては以下ブログを参考にして下さい。

(初心者向け)EC2インスタンスにEFSをマウントしてみた

$ curl -w'\n' http://169.254.169.254/latest/meta-data/placement/availability-zone
ap-northeast-1c
$ mkdir ~/efs-mount-point
$ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-0801d43eb8a0a82a9.efs.ap-northeast-1.amazonaws.com:/   ~/efs-mount-point
$ df -h
Filesystem                                               Size  Used Avail Use% Mounted on
devtmpfs                                                 474M     0  474M   0% /dev
tmpfs                                                    483M     0  483M   0% /dev/shm
tmpfs                                                    483M  440K  482M   1% /run
tmpfs                                                    483M     0  483M   0% /sys/fs/cgroup
/dev/xvda1                                               8.0G  1.6G  6.5G  20% /
tmpfs                                                     97M     0   97M   0% /run/user/0
fs-0801d43eb8a0a82a9.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /home/ec2-user/efs-mount-point
$ sudo mkdir /home/ec2-user/efs-mount-point/test_dir
$ sudo chown ec2-user:ec2-user /home/ec2-user/efs-mount-point/test_dir
$ ls -ld /home/ec2-user/efs-mount-point/test_dir
drwxr-xr-x 2 ec2-user ec2-user 6144 Jun 26 15:10 /home/ec2-user/efs-mount-point/test_dir

適当にファイルを作成

$ ls -l /home/ec2-user/efs-mount-point/test_dir/
total 20
-rw-rw-r-- 1 ec2-user ec2-user 10 Jun 26 15:13 test_1.txt
-rw-rw-r-- 1 ec2-user ec2-user 20 Jun 26 15:13 test_2.txt
-rw-rw-r-- 1 ec2-user ec2-user 30 Jun 26 15:13 test_3.txt
-rw-rw-r-- 1 ec2-user ec2-user 40 Jun 26 15:13 test_4.txt
-rw-rw-r-- 1 ec2-user ec2-user 50 Jun 26 15:13 test_5.txt

レプリケーションの作成

準備できたのでEFSのレプリケーションの設定をします。レプリケーションを作成をクリックします。

セカンダリリージョンの大阪を選択してレプリケーションを作成をクリックします。

少し待つと先ほど指定した大阪リージョンに読み取り専用のEFSファイルシステムが作成されました。

とりあえず、レプリケーション機能で作成された読み取り専用のEFSファイルシステムでレプリケーションがされているか確認します。大阪リージョンのEFSマウント用EC2でEFSをマウントして確認したいと思います。

まずは読み取り専用のEFSファイルシステム側でマウントターゲットの作成が必要です。ネットワークのマウントターゲットを作成をクリックします。

アベイラビリティーゾーンの設定でマウントターゲットを作成するアベイラビリティーゾーンと、EFS用のセキュリティグループを指定して保存をクリックします。

少し待ってマウントターゲットが作成されたことを確認したら大阪リージョンのEFSマウント用EC2からファイルシステムを確認してみます。

$ curl -w'\n' http://169.254.169.254/latest/meta-data/placement/availability-zone
ap-northeast-3c
$ mkdir ~/osaka_efs-mount-point

$ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-02260a31fcf2131b1.efs.ap-northeast-3.amazonaws.com:/   ~/osaka_efs-mount-point
$ df -h
Filesystem                                               Size  Used Avail Use% Mounted on
devtmpfs                                                 462M     0  462M   0% /dev
tmpfs                                                    470M     0  470M   0% /dev/shm
tmpfs                                                    470M  404K  470M   1% /run
tmpfs                                                    470M     0  470M   0% /sys/fs/cgroup
/dev/nvme0n1p1                                           8.0G  1.6G  6.5G  20% /
tmpfs                                                     94M     0   94M   0% /run/user/0
fs-02260a31fcf2131b1.efs.ap-northeast-3.amazonaws.com:/  8.0E     0  8.0E   0% /home/ec2-user/osaka_efs-mount-point
$ ls -l /home/ec2-user/osaka_efs-mount-point
total 4
drwxr-xr-x 2 ec2-user ec2-user 6144 Jun 26 15:13 test_dir
$ ls -l /home/ec2-user/osaka_efs-mount-point/test_dir/
total 20
-rw-rw-r-- 1 ec2-user ec2-user 10 Jun 26 15:13 test_1.txt
-rw-rw-r-- 1 ec2-user ec2-user 20 Jun 26 15:13 test_2.txt
-rw-rw-r-- 1 ec2-user ec2-user 30 Jun 26 15:13 test_3.txt
-rw-rw-r-- 1 ec2-user ec2-user 40 Jun 26 15:13 test_4.txt
-rw-rw-r-- 1 ec2-user ec2-user 50 Jun 26 15:13 test_5.txt

書き込んでみるけどエラー

$ touch /home/ec2-user/osaka_efs-mount-point/test_dir/osaka_file.txt
touch: cannot touch ‘/home/ec2-user/osaka_efs-mount-point/test_dir/osaka_file.txt’: Read-only file system

ファイルが確認できました。また、読み取り専用のEFSファイルシステムのため書き込み処理はエラーになってます。

ではEFSファイルシステムのレプリケーション構成は完了しました。

この時セカンダリリージョンの大阪側のEFSファイルシステム作成時にプライマリリージョンでEFSファイルシステムを作成した時の様に自動バックアップに関して設定するタイミングがありませんでした。ということで別途AWS Backupでのバックアップ設定を実施します。

バックアップ設定

[小ネタ]任意のタグを持つリソースをAWS Backupで取得するCloudFormationテンプレート

プライマリリージョンのバックアップ設定

まずは東京リージョンから設定していきます。設定方法は上記のブログを参照してください。

実行時間はJST 02:00(UTC 17:00)、バックアップ対象のタグはタグ名「cfnbackup」、値「true」で設定します。あとはCloudFormationを実行します。

CloudFormationの実行が完了したら、AWS BackupでVault、プランが作成されていることを確認します。バックアッププランのリソースの割り当てを確認するとタグが設定されています。

あとはEFSにタグ名「cfnbackup」、値「true」のタグを設定します。

セカンダリリージョンのバックアップ設定

次に大阪リージョンでも同じ様にCloudFormationを実行します。

最後にレプリケーションされたEFSですが、タグ自体がコピーされていないのでバックアップ用のタグ名「cfnbackup」、値「true」のタグと、その他Nameタグなどを設定します。

タグ設定後は以下の様になりました。

あとはAWS Backupが実行されてバックアップが作成されるのを待ちます。

結果、東京リージョンのバックアップボールトにバックアップが作成されました!画像は2日経過しているので2世代取得された状態です。

大阪リージョンのバックアップボールトにもバックアップが作成されています!こちらも2世代取得です。

レプリケーションの削除して再度EFSレプリケーションしてみる

レプリケーションを削除

ここでバックアップが完了しているのですが、EFSレプリケーションしているのでせっかくなら、レプリケーションの削除と、再度EFSレプリケーション構成にして継続してバックアップが取得されることを確認してみます。

大阪リージョンにある読み取り専用のEFSファイルシステム側からレプリケーションを削除します。レプリケーションタブのレプリケーションを削除をクリックします。

削除確認のテキストを入力して、レプリケーションを削除をクリックします。

大体10分ぐらいで削除が完了しました。念の為、大阪側でもEFSに書き込みができるか確認してみます。

$ curl -w'\n' http://169.254.169.254/latest/meta-data/placement/availability-zone
ap-northeast-3c
$ ls -l ~/osaka_efs-mount-point
total 8
drw--w---- 3 root     root     6144 Jun 28 00:40 efs-replication-lost+found-fs-0801d43eb8a0a82a9-1656376831212
drwxr-xr-x 2 ec2-user ec2-user 6144 Jun 26 15:13 test_dir
$ ls -l /home/ec2-user/osaka_efs-mount-point/test_dir/
total 20
-rw-rw-r-- 1 ec2-user ec2-user 10 Jun 26 15:13 test_1.txt
-rw-rw-r-- 1 ec2-user ec2-user 20 Jun 26 15:13 test_2.txt
-rw-rw-r-- 1 ec2-user ec2-user 30 Jun 26 15:13 test_3.txt
-rw-rw-r-- 1 ec2-user ec2-user 40 Jun 26 15:13 test_4.txt
-rw-rw-r-- 1 ec2-user ec2-user 50 Jun 26 15:13 test_5.txt

$ echo osaka > /home/ec2-user/osaka_efs-mount-point/test_dir/osaka.txt
$ ls -l /home/ec2-user/osaka_efs-mount-point/test_dir/
total 24
-rw-rw-r-- 1 ec2-user ec2-user  6 Jun 28 14:01 osaka.txt
-rw-rw-r-- 1 ec2-user ec2-user 10 Jun 26 15:13 test_1.txt
-rw-rw-r-- 1 ec2-user ec2-user 20 Jun 26 15:13 test_2.txt
-rw-rw-r-- 1 ec2-user ec2-user 30 Jun 26 15:13 test_3.txt
-rw-rw-r-- 1 ec2-user ec2-user 40 Jun 26 15:13 test_4.txt
-rw-rw-r-- 1 ec2-user ec2-user 50 Jun 26 15:13 test_5.txt

はい、東京リージョンのEFSのファイル構成を維持したまま、大阪リージョンのEFSにファイル書き込みも出来ました。せっかくなのでファイルの構成もガラッと変えておきます。

$ rm -f /home/ec2-user/osaka_efs-mount-point/test_dir/*
$ ls -l /home/ec2-user/osaka_efs-mount-point/test_dir/
total 0

大阪リージョンのEFSで適当にファイルを作成

 ls -l /home/ec2-user/osaka_efs-mount-point/test_dir/
total 24
-rw-rw-r-- 1 ec2-user ec2-user 15 Jun 28 14:17 osaka_test_1.txt
-rw-rw-r-- 1 ec2-user ec2-user 25 Jun 28 14:17 osaka_test_2.txt
-rw-rw-r-- 1 ec2-user ec2-user 35 Jun 28 14:17 osaka_test_3.txt
-rw-rw-r-- 1 ec2-user ec2-user 45 Jun 28 14:17 osaka_test_4.txt
-rw-rw-r-- 1 ec2-user ec2-user 55 Jun 28 14:17 osaka_test_5.txt
-rw-rw-r-- 1 ec2-user ec2-user 65 Jun 28 14:18 osaka_test_6.txt

プライマリリージョンのEFS(レプリケーションの元)を削除

では今度は書き込みができる様になった大阪リージョンのEFSを元にEFSレプリケーションを行なっていきますが、その前に元々書き込み用だった東京リージョンのEFSを削除しておきます。

これで東京リージョンにはEFSがなくなりました。

再度EFSレプリケーションの作成

では、大阪リージョンのEFSを元にEFSレプリケーションを設定します。

今度は送信先のAWSリージョンに「東京リージョン」を指定

バックアップ用のタグ名「cfnbackup」も含めてタグを設定。今度はタグ「Region」、値「Tokyo」にしています。

マウントターゲットも作成

念の為、EFSをマウントして中身を確認します。

$ curl -w'\n' http://169.254.169.254/latest/meta-data/placement/availability-zone
ap-northeast-1c
$ ls -d ~/efs-mount-point
/home/ec2-user/efs-mount-point
$ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-057d07c1016925d61.efs.ap-northeast-3.amazonaws.com:/   ~/efs-mount-point
mount.nfs: Failed to resolve server fs-057d07c1016925d61.efs.ap-northeast-3.amazonaws.com: Name or service not known
mount.nfs: Operation already in progress
$ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-057d07c1016925d61.efs.ap-northeast-1.amazonaws.com:/   ~/efs-mount-point
$ ls -l /home/ec2-user/efs-mount-point
total 8
drw--w---- 3 root     root     6144 Jun 28 00:40 efs-replication-lost+found-fs-0801d43eb8a0a82a9-1656376831212
drwxr-xr-x 2 ec2-user ec2-user 6144 Jun 28 14:03 test_dir
$ ls -l /home/ec2-user/efs-mount-point/test_dir/
total 24
-rw-rw-r-- 1 ec2-user ec2-user 15 Jun 28 14:17 osaka_test_1.txt
-rw-rw-r-- 1 ec2-user ec2-user 25 Jun 28 14:17 osaka_test_2.txt
-rw-rw-r-- 1 ec2-user ec2-user 35 Jun 28 14:17 osaka_test_3.txt
-rw-rw-r-- 1 ec2-user ec2-user 45 Jun 28 14:17 osaka_test_4.txt
-rw-rw-r-- 1 ec2-user ec2-user 55 Jun 28 14:17 osaka_test_5.txt
-rw-rw-r-- 1 ec2-user ec2-user 65 Jun 28 14:18 osaka_test_6.txt

大阪リージョンで書き込んだファイル群が見れる

今度は東京リージョンで書き込んでみるけどエラー

$ touch /home/ec2-user/efs-mount-point/test_dir/osaka_file.txt
touch: cannot touch ‘/home/ec2-user/efs-mount-point/test_dir/osaka_file.txt’: Read-only file system

バックアップが取得されるか確認

これで次のAWS Backupの実行を待って、バックアップファイルが作成されるのを待ちます。

AWS Backupの実行後にボールトを確認すると、バックアップが取得されていました。

大阪リージョン

東京リージョン

東京リージョンに関してはEFSファイルシステムIDが変わってバックアップが取得されています。

まとめ

いかがでしたでしょうか。EFSのレプリケーション機能により簡単に別のリージョンにEFSの複製して読み取りを行うことができる様になりましたが、削除のオペレーションもレプリケートされてしまいます。 万が一間違って削除してしまった時や、リージョン障害などでバックアップが使いたい時に利用できない時のために双方のリージョンでバックアップの取得がおすすめですが、バックアップターゲット用のタグを付与することでバックアップ設定自体を変更することなくマスターのEFSファイルシステムが変わっても継続してバックアップ取得することができました。

以上、この記事がどなたかの参考になれば幸いです。

参考URL