s3fs 是透過 Linux FUSE 界面來與 AWS S3 服務串接,這樣就可以 mount 一個容量幾乎是無限大的 device。
雖然官方文件的 README 很簡單,事實上照著做一定會遇到一堆問題。踩雷以後建議按照以下步驟來規劃並設定 s3fs 的參數:
- AWS 設定
- 建立 S3 bucket
- 建立 IAM 的存取政策 (policy)
- server 設定
- 建立暫存路徑
- s3fs mount 參數設定、測試
- fstab 設定
AWS 設定
先建立一個 bucket 作為 s3fs 要掛載用的儲存容器。
再來去 IAM 建立 policy 供存取專用,以下用 JSON 來表示:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::bucket-for-s3fs", "arn:aws:s3:::bucket-for-s3fs/*" ] } ] }
建立 credential 以後記得將 token 和 secret key 記下來,在 s3fs 連線前要建立設定檔。
s3fs 連線設定檔
設定檔的格式為 ACCESS_KEY:SECRET_KEY
,設定檔建立完成以後記得調整權限:
echo 'ACCESS_KEY:SECRET_KEY' > /etc/cred_s3fs chmod 600 /etc/cred_s3fs
建立 cache dir
雖然不一定要開啟 cache,但如果機器不在 EC2 或 AWS 內部網路,建議開啟 cache_dir 讓操作上順暢一些。檔案很大的話,記得加上 ensure_diskfree
避免暫存檔把空間用光。
# 小檔案可以考慮就放 tmpfs,這邊另外建立目錄存放暫存檔 sudo mkdir -p /var/cache/s3fs-mount-name
測試 s3fs 設定
先以下所有操作都需要使用 root
。
第一步驟先開啟 debug ouptut 來確認連線是正常的,執行時加上 -o dbglevel=info -f -o curldbg
參數:
sudo s3fs bucket-for-s3fs /mefia/s3fs \ -o "passwd_file=/etc/cred_s3fs" \ -o "use_cache=/var/cache/s3fs-mount-name" \ -o dbglevel=info -f -o curldbg
如果 AWS 權限設定正確、s3fs 參數也正確,應該可以看到輸出最後一行顯示 HTTP 200:
[INF] curl.cpp:RequestPerform(2416): HTTP response code 200
另外也可以透過 df
確認目錄已經被正確掛載:
df -h Filesystem Size Used Avail Use% Mounted on udev 3.8G 0 3.8G 0% /dev tmpfs 782M 3.3M 778M 1% /run /dev/mmcblk0p1 59G 5.6G 51G 10% / s3fs 16E 0 16E 0% /mefia/s3fs
256EB 耶,有沒有很爽? (看到帳單可能就沒有那麼爽了 XD)
調整 mount options
上面的步驟只有 root 才可以看到正確的結果,如果沒有 root
權限或是透過 sudo
來執行指令的話,都會出現權限相關的錯誤訊息。
所以在掛載時可以再加上一個 allow_other
的參數,讓其他使用者可以檢視 (能否寫入要看 uid / gid):
sudo s3fs bucket-for-s3fs /mefia/s3fs \ -o "passwd_file=/etc/cred_s3fs" \ -o "use_cache=/var/cache/s3fs-mount-name" \ -o allow_other \ -o dbglevel=info -f -o curldbg
確認可以正常運作以後,就可以把最後一行的 debug info 刪掉。
s3fs in fstab
在 fstab 中使用 s3fs 只有一點需要注意的,就是在 mount options 要加上 _netdev
,表示這個是網路相關裝置,需要在網路啟動以後才 mount。
把原本接在 -o
後面的參數,串到 mount option 即可:
bucket-for-s3fs /media/s3fs fuse.s3fs _netdev,passwd_file=/etc/cred_s3fs,use_cache=/var/cache/s3fs-mount-name,allow_other 0 0
記錄幾個錯誤訊息。
There is no enough disk space for used as cache(or temporary) directory by s3fs.
表示 tmpfs
的空間不夠用,或是 use_cache
的路徑有問題無法存取等。ensure_diskfree
設定錯誤也會出現這個錯誤訊息。
3fs.cpp:s3fs_check_service(3898): invalid credentials(host=https://s3.amazonaws.com) - result of checking service.
這個原因不明,但是可以依照自己使用的 region 來調整 URL,例如:-o "url=https://s3-ap-northeast-1.amazonaws.com"