[Amazon FSx for NetApp ONTAP] 指定したディレクトリ配下のみをSnapRestoreしたい

[Amazon FSx for NetApp ONTAP] 指定したディレクトリ配下のみをSnapRestoreしたい

指定したディレクトリ配下のみSnapRestoreするのは一筋縄ではいかない
Clock Icon2024.09.22

指定したディレクトリ配下のみをSnapRestoreしたい

こんにちは、のんピ(@non____97)です。

皆さんはAmazon FSx for NetApp ONTAP(以降FSxN)を使用していて、指定したディレクトリ配下のみをSnapRestoreしたいなと思ったことはありますか? 私はあります。

Snapshotはボリューム単位で取得することになります。この時、用途や非機能要件で適切にボリュームを分割していない場合はSnapshotからリストアするときの影響範囲が広くなります。FSxNにおけるボリュームやSVMなどの各種リソースの分割の考え方は以下記事をご覧ください。

https://dev.classmethod.jp/articles/amazon-fsx-for-netapp-ontap-filesystem-svm-volume-qtree-partitioning/

そこで行いたくなるのはディレクトリ単位でのSnapRestoreです。特定のディレクトリ配下のファイルやディレクトリのみをSnapshot取得したタイミングに戻したいです。

実際にそのようなことが可能なの確認してみます。

いきなりまとめ

  • 単一コマンドで指定したディレクトリ配下のみをSnapRestoreすることはできない
  • 対応策は以下
    • SnapRestoreによるリストアを行う場合 : ファイルのリストを作成してSSHで流すコマンドを組み立て実行する
    • SnapRestoreによるリストアでなくとも良い場合 : cpコマンドやエクスプローラーの以前のバージョン機能を用いる

検証環境

検証環境は以下のとおりです。

以下記事で使用したものを再利用します。

https://dev.classmethod.jp/articles/amazon-fsx-netapp-ontap-close-smb-file-sessions/

検証用に以下のようにファイルおよびディレクトリを作成しています。

> ls -R \\SMB-SERVER.corp.non-97.net\share

    Directory: \\SMB-SERVER.corp.non-97.net\share

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                dir1
-a----         8/30/2024   6:42 AM             18 test.txt

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                dir2
-a----         8/30/2024   6:42 AM              9 test2.txt

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         8/30/2024   6:42 AM              9 test3.txt

---

> cat \\SMB-SERVER.corp.non-97.net\share\test.txt
test.txt

> cat \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
test2.txt

> cat \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
test3.txt

ONTAP CLIでリストア

Snapshotの取得

まずはONTAP CLIでリストアできるか確認します。

Snapshotを取得します。

::> snapshot show -volume vol_ntfs
There are no entries matching your query.

::> snapshot create -vserver svm -volume vol_ntfs -snapshot test.2024-08-30_0648

::> snapshot show -volume vol_ntfs
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
svm      vol_ntfs
                  test.2024-08-30_0648                     132KB     0%   22%

Snapshotからリストアした時にSnapshot取得時点に戻ったことを確認するために、各ファイルに追記を行います。

> echo msg1 >> \\SMB-SERVER.corp.non-97.net\share\test.txt
> echo msg2 >> \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
> echo msg3 >> \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt

> cat \\SMB-SERVER.corp.non-97.net\share\test.txt
test.txt

msg1
> cat \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
test2.txt

 msg2

> cat \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
test3.txt

 msg3

SnapRestore

それではディレクトリを指定してSnapRestoreをします。

コマンドの詳細は以下記事をご覧ください。

https://dev.classmethod.jp/articles/amazon-fsx-for-netapp-ontap-restore-volume-contents-from-a-snapshot-with-ontap-cli/

::> snapshot restore?
  restore                     Restore the volume to a snapshot.
  restore-file                Restore a file from a snapshot

::> snapshot restore-file -vserver svm -volume vol_ntfs -snapshot test.2024-08-30_0648 -path /dir1

Error: command failed: Failed to restore file from Snapshot copy test.2024-08-30_0648 for volume "vol_ntfs" on Vserver "svm". Reason: Inappropriate file type or format.

::*> snapshot restore-file -vserver svm -volume vol_ntfs -snapshot test.2024-08-30_0648 -path /dir1 -restore-path /dir1

Error: command failed: Failed to restore file from Snapshot copy test.2024-08-30_0648 for volume "vol_ntfs" on Vserver "svm". Reason: Inappropriate file type or format.

はい、リストアできませんでした。不適切なファイルタイプまたはフォーマットと表示されていますね。

これはsnapshot restore-fileの仕様です。

以下NetApp公式ドキュメントのとおり、ディレクトリをリストアしようとするとコマンドが失敗するとされています。

The command also supports restoring normal user-level files with streams. The command fails if you try to restore directories (and their contents).

volume snapshot restore-file

ということで、ONTAP CLIの単一コマンドで指定したディレクトリ配下のファイルやディレクトリをリストアすることはできません。

snapshot restore-fileで大量のファイルをリストアしたい場合は、以下記事で紹介しているようにシェルスクリプトとSSHコマンドを組み合わせて対応することになると考えます。

https://dev.classmethod.jp/articles/amazon-fsx-for-netapp-ontap-loop-processing-without-ontap-rest-api/

PowerShellでSnapshot内のファイルを確認

シェルスクリプトとSSHコマンドを組み合わせるにあたって、そのSnapshot内にどんなファイルがあるかどうか知る必要があります。

Powershellを用いてSnapshotディレクトリにアクセスして、Snapshot内のファイルを確認します。

まず、SMBファイル共有直下の~snapshotにアクセスします。

> ls \\SMB-SERVER.corp.non-97.net\share\~snapshot

    Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:38 AM                test.2024-08-30_0648

> ls -R \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648

    Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                dir1
-a----         8/30/2024   6:42 AM             18 test.txt

    Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648\dir1

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                dir2
-a----         8/30/2024   6:42 AM              9 test2.txt

    Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648\dir1\dir2

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         8/30/2024   6:42 AM              9 test3.txt

はい、各ファイルを確認することができました。

あとはPowershellで頑張ればファイルのリストを取得することができそうです。

実際にやってみましょう。

# ファイル共有配下のファイル一覧を出力
> Get-ChildItem -Path \\SMB-SERVER.corp.non-97.net\share -Recurse -File | Select-Object -ExpandProperty FullName
\\SMB-SERVER.corp.non-97.net\share\test.txt
\\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
\\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt

# ファイル共有配下のファイル一覧を出力
# 出力結果から共有名までを除外
> Get-ChildItem -Path "\\SMB-SERVER.corp.non-97.net\share\" -Recurse  -File | 
    Select-Object -ExpandProperty FullName | 
    ForEach-Object { $_ -replace '\\\\SMB-SERVER\.corp\.non-97\.net\\share\\', '' }
test.txt
dir1\test2.txt
dir1\dir2\test3.txt

問題なくできました。

実際にリストアする際は出力された結果を元にfor文でSSHで流すコマンドを生成しましょう。

続いて、SMBファイル共有のディレクトリ配下の~snapshotにアクセスしてみます。

> ls -R \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                test.2024-08-30_0648

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot\test.2024-08-30_0648

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                dir2
-a----         8/30/2024   6:42 AM              9 test2.txt

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot\test.2024-08-30_0648\dir2

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         8/30/2024   6:42 AM              9 test3.txt
> ls -R \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\~snapshot

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\~snapshot

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                test.2024-08-30_0648

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\~snapshot\test.2024-08-30_0648

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         8/30/2024   6:42 AM              9 test3.txt

こちらも問題なくアクセスできました。SMBファイル共有のトップディレクトリにアクセス権限がなくとも、Snapshotディレクトリにはアクセスできるようですね。

ただし、エクスプローラーからは~snapshotでSnapshotディレクトリにアクセスできませんでした。注意しましょう。

1.エクスプローラー上ではサブディレクトリ内からスナップショットは確認できない.png
2.エクスプローラー上ではサブディレクトリ内からスナップショットは確認できない2.png
3.エクスプローラー上ではサブディレクトリ内からスナップショットは確認できない3.png

エクスプローラーから以前のバージョンでリストア

次に、エクスプローラーから以前のバージョンでリストアを確認します。

dir1配下に移動して、Previous Versionsをクリックします。

すると、Snapshotを取得したタイミングに戻せそうです。

4.Previous Versions.png

OpenをクリックするとエクスプローラーでSnapshot取得時点のファイルを確認することができました。

5.Snapshotwo.png

階層の移動も問題なく行えます。

6.階層を辿る.png

Snapshotディレクトリのパスはファイル共有名\Snapshot取得日時となっていました。

7.階層を辿る2.png

エクスプローラーのアドレスバーに\\SMB-SERVER.corp.non-97.net\share\@GMT-2024.08.30-06.48.54\dir1と入力してもSnapshot取得時のdir1を表示できました。

Previous Versionsからリストアします。

8.Previous Versionsからリストア.png

即リストアが完了したようです。

9.The folder has been successully restored to the previous version.png

Powershellでdir1配下のみSnapshot取得時点に戻ったことを確認します。

> ls -R \\SMB-SERVER.corp.non-97.net\share

    Directory: \\SMB-SERVER.corp.non-97.net\share

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                dir1
-a----         8/30/2024   6:53 AM             38 test.txt

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         8/30/2024   6:39 AM                dir2
-a----         8/30/2024   6:42 AM              9 test2.txt

    Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         8/30/2024   6:42 AM              9 test3.txt

> cat \\SMB-SERVER.corp.non-97.net\share\test.txt
test.txt

msg1

> cat \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
test2.txt

> cat \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
test3.txt

dir1配下のファイルは追記前の状態に戻っていますね。一方でtest.txtは追記後の状態のままです。

FSxNでリストアしたタイミングの管理アクティビティの監査ログを確認します。

::*> security audit log show -fields timestamp, node, application, vserver, username, input, state, message -state Error|Success -timestamp >"Thu Aug 30 07:15:00 2024"
timestamp                  node                      application vserver                username          input                                                                              state message
-------------------------- ------------------------- ----------- ---------------------- ----------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----- ---------------
"Fri Aug 30 07:15:38 2024" FsxId0e64a4f5386f74c87-01 http        FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"} Error duplicate entry
"Fri Aug 30 07:15:39 2024" FsxId0e64a4f5386f74c87-01 http        FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin-readonly/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"}
                                                                              Error duplicate entry
"Fri Aug 30 07:20:38 2024" FsxId0e64a4f5386f74c87-01 http        FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"} Error duplicate entry
"Fri Aug 30 07:20:39 2024" FsxId0e64a4f5386f74c87-01 http        FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin-readonly/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"}
                                                                              Error duplicate entry
"Fri Aug 30 07:21:34 2024" FsxId0e64a4f5386f74c87-01 ssh         FsxId0e64a4f5386f74c87 fsxadmin          Question: Warning: These diagnostic command... : y                                                                              Success
                                                                                    -
"Fri Aug 30 07:21:34 2024" FsxId0e64a4f5386f74c87-01 ssh         FsxId0e64a4f5386f74c87 fsxadmin          set diag                                                                              Success
                                                                                    -
6 entries were displayed.

特にログの記録はされていません。裏側でSnapRestoreのAPIが叩かれているわけではなさそうですね。

指定したディレクトリ配下のみSnapRestoreするのは一筋縄ではいかない

指定したディレクトリ配下のみをSnapRestoreできるかどうか検証してみました。

結論、単一のONTAP CLIコマンドではディレクトリ配下をピンポイントでリストアすることはできないことが分かりました。

どうしてもSnapRestoreで行う場合は、ファイルのリストを作成してSSHで流すコマンドを組み立てる必要があります。

もし、リストア方法にこだわりがないのであれば、cpコマンドやエクスプローラーの以前のバージョン機能を用いてリストアしましょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.