AWS サーバ構築（ファイルサーバ）その２ DFS レプリケーション

[前回][file-server-1] EC2(AWS Linux2) 2台と EFS で高可用性、高耐用性のファイルサーバーを考えましたが、構築を進めていくと問題が発生しました。

Linux 側には Samba(var4.1) を立てて、既存の Active Directory(以下 AD )には SSSD やケルベロス認証、その他いろいろな技術で参加することができました。

[Amazon LinuxでオンプレミスADのユーザ情報を使ってログインする][sssd]

Active Directory 関連の技術は理解しようとすると難しいですが、AWS 公式ドキュメントとリンク先の方のおかげですんなり行きました。が、ファイルの ACL を AD のユーザーで設定できないという問題が発生しました。
Linux で Windows の ACL を実現するには Samba の拡張の POSIX ACL という機能を使えばできるようですが、 EFS のファイルシステムの NFSv4.x ではサポートしていないようです。

> サポートされていない NFSv4 機能
Amazon Elastic File System は、NFSv2 または NFSv3 をサポートしていませんが、Amazon EFS は、以下の機能を除き NFSv4.1 と NFSv4.0 の両方をサポートしています。
> ...
> ・アクセスコントロールリスト (ACL)
> ・Kerberos ベースのセキュリティ

[サポートされていない NFSv4 機能][nfs4]

```bash
# fstab に user_xattr と acl というオプションを追加します。
$ cat /etc/fstab 
#
UUID=14f29b03-ef11-4612-9892-cb913c423cff / xfs defaults,noatime  1   1
fs-29551b72:/ /mnt/efs efs defaults,_netdev,user_xattr,acl 0 0 1 2

# 不正なオプションとなり、マウントできません。
$ sudo mount -a
mount.nfs4: an incorrect mount option was specified
```

# FSx for Windows File Serverを使う

EFSを諦めて、Windows にナチュラルに対応しており、標準で SMB プロトコルで接続できる FSx を使うことにしました。Windows ACL にも対応しています。

> Q: Amazon FSx にはどのようなアクセスコントロール機能がありますか?
>
> A: Amazon FSx では、ファイルとフォルダに対する標準的な Windows 権限を提供しています (Windows ACL をフルサポート)。

[Amazon FSx for Windows File Server のよくある質問][fsx-caution]

## FSx の作成時の注意点

- Directory Service で AD が必須。Standard でも Enterprise でも可。[^1]
- 作成後セキュリティグループを後で変更できない。
- スループットキャパシティを後で変更できない。
- 容量を後で変更できない。
- シングルAZ。
- 周1回メンテナンスで最長30分くらい止まるので、要件によってはオプションで時間指定が必要。

[^1]: AD はオンプレミスや EC2 上の AD には対応していません。また、 AD Connector も使用できません。

# レプリケーション

EFS と違い、FSx はマルチAZに配置されません。AZ1つだと心臓に悪いので、今回はマルチ構成にしました。
AWS で全部やってくれる PowerShell がダウンロードできるのでそれを実行するとレプリケーションができます。パワーシェル実行用の Windows の EC2 が1台必要ですが、セットアップが完了すれば、このマシンは起動している必要はありません。

[Setting Up DFS Replication][fsx-replication]

1. Windows Server インスタンスを作って AD に参加します。AD に参加するには DNS を AD の ip に変更します。
1. Windows Server に AD DS 及び AD LDS ツールと DFS 管理ツール、 DNS をインストールします。
1. デフォルトユーザー(domain名￥Admin でよいと思います)を AWS Delegated FSx Administrators グループに追加します。
1. FSx-DFSr-Setup.ps1 をダウンロードします。
1. 実行します。group の myfiles は任意の名前で結構です。folder と path は下の値を設定してください。primary, secondly には FSx の DNS名をセットしてください。

```powershell
PS C:\Users\Admin> .\FSx-DFSr-Setup.ps1 -group "myfiles" -folder "C:\DFSRoot\share" -path "D:\Share" -primary fs-042cf80903f4be5a1.domain.local -standby fs-0fe46351ce8a3f0ed.domain.local
 Making a pause for 60 seconds in order to let folder initialize


GroupName              : myfiles
FolderName             : C:\DFSRoot\share
DomainName             : domain.local
Identifier             : 1a98f85e-d4bc-41f2-825b-0a428c114599
Description            :
FileNameToExclude      : {~*, *.bak, *.tmp}
DirectoryNameToExclude : {}
DfsnPath               :
IsDfsnPathPublished    : False
State                  : Normal

GroupName                    : myfiles
ComputerName                 : AMZNFSXXBSXCA1X
DomainName                   : domain.local
Identifier                   : a8b5e250-9c1b-4ea8-9d38-c3d49a764612
Description                  :
DnsName                      : amznfsxxbsxca1x.domain.local
Site                         : Default-First-Site-Name
NumberOfConnections          : 2
NumberOfInboundConnections   : 1
NumberOfOutboundConnections  : 1
NumberOfInterSiteConnections : 0
NumberOfIntraSiteConnections : 2
IsClusterNode                : False
State                        : Normal

GroupName                    : myfiles
ComputerName                 : AMZNFSXSFUAG7QX
DomainName                   : domain.local
Identifier                   : b311346d-5cfc-4472-a536-e0343cff12c9
Description                  :
DnsName                      : amznfsxsfuag7qx.domain.local
Site                         : Default-First-Site-Name
NumberOfConnections          : 2
NumberOfInboundConnections   : 1
NumberOfOutboundConnections  : 1
NumberOfInterSiteConnections : 0
NumberOfIntraSiteConnections : 2
IsClusterNode                : False
State                        : Normal

GroupName               : myfiles
SourceComputerName      : AMZNFSXXBSXCA1X
DestinationComputerName : AMZNFSXSFUAG7QX
DomainName              : domain.local
ConnectionGuid          : af9c2b6f-d657-4115-bec5-1b0d4c65848b
UseUTC                  : False
HoursReplicated         : 168
BandwidthDetail         : レプリケーション グループのスケジュールを使用しています。

GroupName               : myfiles
SourceComputerName      : AMZNFSXSFUAG7QX
DestinationComputerName : AMZNFSXXBSXCA1X
DomainName              : domain.local
ConnectionGuid          : 4b371bf8-286d-48ba-a31f-9c88b06368ad
UseUTC                  : False
HoursReplicated         : 168
BandwidthDetail         : レプリケーション グループのスケジュールを使用しています。

GroupName            : myfiles
DomainName           : domain.local
ReplicationGroupGuid : 49f94ae5-d6b4-4228-a256-ae35bde93fe3
UseUTC               : False
HoursReplicated      : 168
BandwidthDetail      : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                       FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

GroupName                   : myfiles
ComputerName                : AMZNFSXXBSXCA1X
FolderName                  : C:\DFSRoot\share
GroupDomainName             : domain.local
ComputerDomainName          : domain.local
Identifier                  : ef8d679f-fe01-49b8-93a0-8d06f3b6eb24
DistinguishedName           : CN=1a98f85e-d4bc-41f2-825b-0a428c114599,CN=97956d03-661d-468d-9404-48775173f0f2,CN=DFSR-L
                              ocalSettings,CN=AMZNFSXXBSXCA1X,OU=FSx,OU=AWS Reserved,DC=urushibata,DC=local
ContentPath                 : D:\Share
PrimaryMember               : True
StagingPath                 : D:\Share\DfsrPrivate\Staging
StagingPathQuotaInMB        : 32768
MinimumFileStagingSize      : Size256KB
ConflictAndDeletedPath      : D:\Share\DfsrPrivate\ConflictAndDeleted
ConflictAndDeletedQuotaInMB : 4096
ReadOnly                    : False
RemoveDeletedFiles          : False
Enabled                     : True
DfsnPath                    :
State                       : Normal

GroupName                   : myfiles
ComputerName                : AMZNFSXSFUAG7QX
FolderName                  : C:\DFSRoot\share
GroupDomainName             : domain.local
ComputerDomainName          : domain.local
Identifier                  : 347bbc32-1dd9-4552-959f-c5f5c71c9387
DistinguishedName           : CN=1a98f85e-d4bc-41f2-825b-0a428c114599,CN=83a37742-cbfb-4c00-89ed-1d031a988498,CN=DFSR-L
                              ocalSettings,CN=AMZNFSXSFUAG7QX,OU=FSx,OU=AWS Reserved,DC=urushibata,DC=local
ContentPath                 : D:\Share
PrimaryMember               : False
StagingPath                 : D:\Share\DfsrPrivate\Staging
StagingPathQuotaInMB        : 32768
MinimumFileStagingSize      : Size256KB
ConflictAndDeletedPath      : D:\Share\DfsrPrivate\ConflictAndDeleted
ConflictAndDeletedQuotaInMB : 4096
ReadOnly                    : False
RemoveDeletedFiles          : False
Enabled                     : True
DfsnPath                    :
State                       : Normal

```

上手くいくとこんな感じで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/7f5d6564-d9d9-ffa8-a166-09b310d04369.png)


## トラブルシューティング

- FSx の名前解決ができないとき

1. ipconfig で DNS サフィックスを確認します。接続固有の DNS サフィックスがドメイン名になってない場合は DNS サフィックスが原因です。
1. インターネット プロトコル バージョン4(TCP/IPv4)のプロパティ(Windows で任意の IP をセットする画面) > 詳細設定ボタン > DNSタブ > 「プライマリおよび接続専用の DNS サフィックスを追加する」をチェックする。
1. これにより、コンピューター名のみで名前解決する際に自動でドメイン名を付与されるようになり、名前解決できるようになります。

# フェールオーバー

MultiAZ 化したら自動でフェールオーバーしたいと考えるのが普通ですが、まだ構築できていないので、これについては[次回][file-server-3]に。また、別リージョンへのバックアップについても次回以降に記述します。

# まとめ

Windowsでファイルサーバーを構築したい場合、FSxはいい選択だと思いました。というか初めから使えばよかったです…。料金も個人だと厳しいですが、法人ならそれほど掛からないのではないでしょうか。

あと、Windows Server を使っている企業は AWS を選択しない方が幸せな気がしてきました。Windows だと何かと制限があってとてもつらいです。

[sssd]:http://atsuokun.hatenablog.com/entry/2017/02/22/164412
[nfs4]:https://docs.aws.amazon.com/ja_jp/efs/latest/ug/limits.html#nfs4-unsupported-features
[fsx-caution]:https://aws.amazon.com/jp/fsx/windows/faqs/
[fsx-replication]:https://docs.aws.amazon.com/ja_jp/fsx/latest/WindowsGuide/multi-az-deployments.html#set-up-fsx-dfs
[file-server-1]:https://qiita.com/urushibata/items/fa07c6557d19e7513199
[file-server-3]:https://qiita.com/urushibata/items/6f23f87eeeea3cbe985e