AlibabaCloudでFUSEとSambaを使ってオブジェクトストレージベースのファイルサーバー構築

頻繁にアクセスしないファイルについて、安価なオブジェクトストレージをサーバーにマウントして、ファイルサーバーを構築すればコスト削減できるというニーズがあります。その場合、FUSE(Filesystem in Userspace)を使います。今回は、AlibabaCloudを例としてFUSE＋Sambaで構築していきたいと思います。

### 目次
1. AlibabaCloudのストレージ種類一覧
2. FUSEとは
3. AlibabaCloudのFUSEベースのツール  
4. 実装する手順
5. さいごに

### 1. AlibabaCloudのストレージ種類一覧
まずはAlibabaCloudのストレージをまとめて、レイテンシー順で並んでいます。
オブジェクトストレージレイテンシーが一番高いですが、料金は最も低価格で利用できます。
今回はこのオブジェクトストレージを仮想サーバーにマウントして、ファイルサーバーを構築していきます。
1. ローカルストレージ: ECSのローカルディスク
2. ブロックストレージ: ブロックストレージ
3. ファイルストレージ: NAS
4. オブジェクトストレージ: OSS

### 2. FUSEとは
オブジェクトストレージの特徴は、シンプルなキーバリューの構造で、安価なストレージとして提供しています。コンテンツ配信、ビッグデータ処理などに最適ですが、頻繁に更新するデータには向いていないという特徴があります。アクセスのレイテンシーは、ローカルストレージ、ブロックストレージやファイルストレージより高いため、仮想サーバーのストレージとしてマウントして使うのは向いていません。

ただし、何らかの理由でオジェクトストレージをサーバーにマウントしたいときには、FUSEが役に立ちます。
![280px-FUSE_structure.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738909/35eaa6d8-0e76-254f-2fcd-6e0c78bbec05.png)
※画像出所：wikipedia
FUSE(Filesystem in Userspace)とは、、その名の通りユーザー空間にあるファイルシステムです。
OSは、セキュリティと安定性のために、メモリ領域である仮想アドレス空間をカーネル空間とユーザー空間に分離されています。通常、Linuxのファイルシステムはカーネル空間にあります。つまりファイルシステムに関するソースコードは、全部全てLinuxのカーネル空間にあります。FUSEの特徴は、ファイルシステムのロジック部分がユーザー空間にあることです。

##### メリット：
1. 修正する際に、Linuxカーネルを更新する必要がありません
2. 修正の自由度が高いです
##### デメリット:
1. パフォーマンスが悪い

### 3. AlibabaCloudのFUSEベースのツール
AlibabaCloudはossfsというツールを提供しています。それを使えばオブジェクトストレージを仮想サーバーにマウントできるようになります。
https://github.com/aliyun/ossfs

それ以外にAlibabaCloudにはCloud Storage Gatewayエージェントというのがあります。まだベータ版ですが、Azure Blobfuse2のようにサーバー上のエージェントでキャッシュ機能を持ちます。

### 4. 実装する手順
ゴール：FUSEでオブジェクトストレージを仮想サーバーにマウントして、Samba経由でフォルダをシェアします。
例として手順を書いていきます。

##### 手順1：FUSEのインストール
```
wget https://gosspublic.alicdn.com/ossfs/ossfs_1.80.7_ubuntu20.04_amd64.deb
sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi ossfs_1.80.6_ubuntu16.04_amd64.deb

```

##### 手順2：オブジェクトストレージバケットの作成
以下のバケットを作成

管理コンソールから以下のバケットを作成します。
fuse-samba-bucket

##### 手順3：バケットへのアクセス権限付与
バケットへのアクセス権限を持つロールを作成し、仮想サーバーにアタッチします。
RoleFuse

##### 手順4：バケットのマウント
ディレクトリを作成します。
```
mkdir /mnt/sharefuse
```
一時利用なら、コマンドでマウントできますが、サーバーを再起動したら毎回マウントし直す必要があります。
```
ossfs fuse-samba-bucket /mnt/sharefuse -o url=http://oss-ap-northeast-1.aliyuncs.com -oram_role=http://100.100.100.200/latest/meta-data/ram/security-credentials/RoleFuse -oallow_other
```
恒久敵に利用する場合、fstabに登録しておけば、サーバー再起動後も自動的にマウントされます。
AlibabaCloudの場合、fstabに登録するとRAMロールの認証が使えなくなります。AccessKeyIDとAccessKeySecretを設定ファイル/etc/passwd-ossfsに設定する必要があります。
```
ossfs#fuse-samba-bucket /mnt/sharefuse fuse _netdev,url=http://oss-ap-northeast-1.aliyuncs.com,allow_other 0 0
```

##### 手順5：Sambaのインストール
```
sudo apt install samba
```
###### 手順6：Sambaの設定
設定ファイルを開きます。
sudo vi /etc/samba/smb.conf

設定ファイルの最後に追加
```
[sharefuse]
comment = share folder
browseable = yes
path = /mnt/sharefuse/
create mask = 0755
directory mask = 0755
public = yes
available = yes
writable = yes
```

sambaの再起動
sudo service smbd restart

##### 手順7：動作確認
セキュリティグループの以下のポートを自宅のIPアドレスに開けます。
tcp:139, 445
udp:137, 138

WindowsPCのエクスプローラからシェアフォルダにアクセスできることを確認します。

簡単な確認ならこのようにセキュリティグループを開ける形で確認します。SMBはバージョン2以降暗号化はしていますが、インターネット前提で設計したものではないため、本格的な利用の場合は、専用線、Site-To-Site VPNなどのセキュリティ環境でアクセスする必要があります。
また本格利用の場合、認証情報としてSambaとActive Directryの連携が必要になってくる場合があります

### 5. さいごに
オブジェクトストレージはレイテンシーがあるものの、費用対効果が優れているストレージです。一般的ではないですが、ニーズに合えばサーバー上にマウントして利用できます。またサーバー上によくアクセスするファイルをキャッシュしておけば、パフォーマンスがある程度改善されます。