EFSのレプリケーション機能を利用して複数リージョンでバックアップを取得してみた
こんにちは、AWS事業本部のニシヤマです。
上記のブログでEFSに別リージョンへのレプリケーション機能が追加されましたがこちらの機能でレプリケーションしつつ、予期せぬ削除ミスなどのためにAWS Backupを利用したバックアップを取得する構成を試してみたのでご紹介します。
構成はこのようになります。
また、EFSのバックアップ方法に関しては上記ブログで、EFSの作成時にチェックボックスで簡単に設定可能な自動バックアップ機能が紹介されていますが、レプリケーション機能を利用するとセカンダリリージョン側のEFSは自動で作成されてしまいます。 そのため、自動バックアップ機能を設定するタイミングがないため以下ブログに記載のAWS Backupを設定するCloudFormationテンプレートを利用します。
やってみる
ではやっていきます。構成図にある両方のリージョンでのVPC環境と必要なセキュリティグループ、EFSマウント用EC2(Amazon Linux 2)が作成された状態から始めます。
まずはEFSのレプリケーション構成を作成します。
プライマリリージョンでEFSを作成
ではプライマリリージョンの東京リージョンでEFSを作成します。
ファイルシステムの作成
をクリックします。
ここでファイルシステム名と、作成するVPCを指定したらカスタマイズ
をクリックします。
ファイルシステムの設定画面が表示されるので、自動バックアップを有効化
のチェックを外して次へをクリックします。
ネットワークアクセス画面ではマウントターゲットの指定と、EFS用のセキュリティグループを指定して次へをクリックします。
ファイルシステムポリシーはそのままで次へをクリックします。
確認してEFSファイルシステムを作成します。
EFSファイルシステムが作成できました。
では東京リージョンのEFSマウント用EC2からマウントして適当なファイルを作成します。
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でのバックアップ設定を実施します。
バックアップ設定
プライマリリージョンのバックアップ設定
まずは東京リージョンから設定していきます。設定方法は上記のブログを参照してください。
実行時間は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ファイルシステムが変わっても継続してバックアップ取得することができました。
以上、この記事がどなたかの参考になれば幸いです。