Azure BlobFuse2を使う。

駆け出しアーキテクトのやまぱんです。

先週 GA(General Available= 一般提供) になった BlobFuse の改良版である 新機能の BlobFuse2 環境を今回構築しましたので手順をメモします。

>BlobFuse は Azure Blob Storage 用の仮想ファイル システム ドライバーです。 BlobFuse を使用して、Linux ファイル システムで既存の Azure ブロック BLOB データにアクセスします。

>BlobFuse2 は、libfuse オープンソース ライブラリ (fuse3) を使用して Linux FUSE カーネル モジュールと通信するオープンソース プロジェクトです。 BlobFuse2 では、Azure Storage REST API を使用してファイル システム操作を実装します。


なお、今回は Azure VM 上の Linux (Ubuntu) VM を用いて環境を作成しましたが、 Azure 環境上のLinux以外でも可能なはずです。

2022/12/05 現在 日本語版のページは反映が遅れているためプレビュー表記のままです。
(そのうちきっと外れるはずッ！)


日本語版 https://learn.microsoft.com/ja-JP/azure/storage/blobs/blobfuse2-what-is
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7bdd9c78-6db7-eaf6-b14b-e129c984eca9.png)
英語版 https://learn.microsoft.com/en-US/azure/storage/blobs/blobfuse2-what-is
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/93006349-4828-9f65-05ed-58b0c296fe64.png)


**今回利用した参考まとめページ**

https://learn.microsoft.com/ja-JP/azure/storage/blobs/blobfuse2-what-is

https://github.com/Azure/azure-storage-fuse/tree/main

### 機能強化ポイント
下記 URL より抄訳
https://github.com/Azure/azure-storage-fuse/blob/main/README.md#blobfuse2-performance-compared-to-blobfusev1xx
>+ git clone」操作が25%高速化（vscodeレポのクローニングでテスト済み）
>+ ResNet50の画像分類が7～8％高速化（130万画像でテスト）。
>+ 通常のファイルアップロードが10%高速化
>+ ディレクトリ内の10億ファイルのリストアップを検証（v1.xでは未対応）。

### 準備
#### ストレージ アカウントの準備
##### ストレージ アカウントの作成
下記の設定でストレージ アカウントを作成
今回は blob を利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/5dba41dd-e4c2-5e7e-1797-65b8a73a0066.png)

##### ストレージ アカウント情報メモ
下記 をメモしておきます。
+ ストレージ アカウント名
+ コンテナー名
+ エンドポイント URL 
+ アクセスキー

エンドポイント URL は下記から確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/bebe5b7b-7d1f-e11d-11d2-8685541c72fb.png)




アクセスキーは下記から確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/2d5254fd-3ca4-be2a-ed97-e08f4fa53dc6.png)




##### ストレージ アカウントのコンテナーの作成
マウントするコンテナー : **fusetest** を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a2b452f3-949a-3986-5210-2707744040e2.png)

####  Linux OS の Azure VM を作成
今回は Ubuntu 20.04 にて作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d13eb5ec-3e06-738e-81e0-20fac2b3d60a.png)

#### ディレクトリ構成
”/home/test-admin” 配下ですべて作業。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/10d66da6-2c7a-026f-a89d-6bf4159a0997.png)

下記 2 点はBlobFuse2 のインストール関連 (インストールすれば作成される)
+ azure-storage-fuse
+ blobfuse2-2.0.0-preview.3-Ubuntu-22.04-x86-64.deb(.1) 

下記はそれぞれ作成する
+ fuse_temp　：キャッシュ用のディレクトリを作成する　mkdir ~/fuse_temp
+ fusecontainer：マウントするディレクトリを作成する　mkdir ~/fusecontainer
+ config.yaml　：構成ファイル(中身は後ほど記述する)　touch ~/config.yaml


###  BlobFuse2 環境の構築
#### BlobFuse2 のインストール
**root 権限** で下記のURLを参考にコマンドを実行する。
https://learn.microsoft.com/ja-jp/azure/storage/blobs/blobfuse2-how-to-deploy#install-blobfuse2

#### root 権限で行わない場合下記のような Error Message が発生しました。

```
$sudo apt-get install libfuse3-dev fuse3
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package fuse3 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
```

#### 構成ファイル (config.yaml) の作成
下記が必要最低限の記述です。
環境に合わせて適宜変更してください。
また、\# 行はコメントです。
Windows で構成ファイルを作成した場合は、dos2unix コマンドを実行してUnix 形式に変換してください。

> config.yaml
```
azstorage:
#Required
  type: block
  account-name: rgXXXX 　#ストレージ アカウント名
  container: fusetest　　#ストレージ アカウントのコンテナー名
  endpoint: https://rgXXXXX.blob.core.windows.net　#ストレージ アカウントの blob エンドポイント URL
  mode: key　#利用する認証の種類
  account-key: o6XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= #ストレージ アカウントのアクセスキー

#Disk cache related configuration
file_cache:
#Required
  path: /home/test-admin/fuse_temp #キャッシュフォルダのパスを指定
```
```bash:config.yaml
# 必要な設定項目のみを含んだ最小限の設定ファイル

# 共通設定
allow-other: true

# 使用するコンポーネントのリスト
components:
  - libfuse
  - azstorage

# Azure Storageの接続設定
azstorage:
  type: block
  account-name: your_account_name
  account-key: your_account_key
  container: your_container_name
  endpoint: https://your_account_name.blob.core.windows.net

```


構成ファイルに関しての詳細は下記をご覧ください。下記よりデプロイに最低限必要 (required) なものを抽出したものが上記です。
https://github.com/Azure/azure-storage-fuse/blob/main/setup/baseConfig.yaml

ここから先は主に下記のコマンドを利用します。

https://learn.microsoft.com/ja-jp/azure/storage/blobs/blobfuse2-commands

#### 現在マウントされていないことを確認
```
$blobfuse2 mount list
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d89a3af9-e74b-cc78-b62f-47af1f55a85b.png)

#### blob container をマウントする
``` 
$blobfuse2 mount ~/fusecontainer --config-file=~/config.yaml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/5e13763e-f0bf-94a4-f8af-85390eeec0b8.png)

##### すでにマウントされている場合下記のような Error Message がでた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/06658567-2416-5de4-814d-a9d7ec0c7720.png)
```
Mount: error invalid options [argument error: directory is already mounted
```

##### 構成ファイルの書き方がおかしい場合下記のような Error Message がでた。
```
test-admin@VM-Ubuntu:~$ blobfuse2 mount ~/fusecontainer --config-file=~/config.yaml
 blobfuse2: A new version (2.0.1) is available. Consider upgrading to latest version for bug-fixes & new features. 
invalid config file [While parsing config: yaml: unmarshal errors:
  line 1: cannot unmarshal !!str account... into map[string]interface {}
```

#### マウントされたことを確認
```
$blobfuse2 mount list
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/2d05e9e6-c35e-eac1-2e0f-4278150049b1.png)

#### ディレクトリとファイルを作成する
```
$mkdir test
$echo "hello world" > test/blob.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/311fcb22-7ce0-efa1-f9e6-7cf3b328b35e.png)

####  Azure Portal のストレージ アカウント → コンテナーより反映を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/89fd3abd-2512-b970-4078-a4e8bd8afab1.png)

もちろん削除が反映されることも確認済です。

#### マウントされたことを確認
```
$blobfuse2 mount list
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/74140922-41c9-fbba-0ca8-a7125622548a.png)

#### アンマウントし、現在マウントされていないことを確認
```
#アンマウント
sudo blobfuse2 unmount all 
#マウント確認
sudo blobfuse2 mount list  
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d10eebc1-1623-b455-f640-1c939f5f65ba.png)


### 最新版について
blobfuse2-2.0.0 は GA 版ですが、すぐにアップデートがあった模様。
https://github.com/Azure/azure-storage-fuse/releases