天天看點

利用S3fs在Amazon EC2 Linux執行個體上挂載S3存儲桶

文章連結

https://cnsre.cn/posts/210409164113

amazon s3是網際網路存儲解決方案,能讓所有開發人員通路同一個具備可擴充性、可靠性、安全性和快速價廉的資料存儲基礎設施。amazon s3 提供了一個簡單 web 服務接口,可用于随時在 網際網路上的任何位置存儲和檢索任何數量的資料。開發人員可以利用amazon提供的rest api接口,指令行接口或者支援不同語言的sdk通路s3服務。

對于原來使用本地目錄通路資料的應用程式,比如使用本地磁盤或網絡共享盤儲存資料的應用系統,如果使用者希望把資料放到s3上,則需要修改資料的通路方式,比如修改為使用aws sdk 或cli通路s3中存儲的資料。為了讓使用者原來的應用系統能在不做修改的情況下直接使用amazon s3服務,需要把s3存儲桶作為目錄挂載到使用者伺服器的本地作業系統上。常用的挂載工具有s3fs和subcloud等。本文主要介紹如何利用s3fs将s3存儲桶挂載到amazon ec2 linux執行個體上。

s3fs是基于fuse的檔案系統,允許linux和mac os x 挂載s3的存儲桶在本地檔案系統,s3fs能夠保持對象原來的格式。關于s3fs的詳細介紹,請參見:https://github.com/s3fs-fuse/s3fs-fuse

關于如何建立iam使用者,請參見:http://docs.aws.amazon.com/zh_cn/iam/latest/userguide/id_users_create.html#id_users_create_console

關于如何為iam使用者建立通路密鑰,請參見:http://docs.aws.amazon.com/zh_cn/iam/latest/userguide/id_credentials_access-keys.html

關于如何為iam使用者設定權限政策,請參見:http://docs.aws.amazon.com/zh_cn/iam/latest/userguide/access_policies_create.html

https://aws.amazon.com/cn/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/

具體過程請參見:http://docs.aws.amazon.com/zh_cn/awsec2/latest/userguide/launching-instance.html

安裝必要的軟體包

下載下傳,編譯并安裝s3fs

檢查s3fs是否安裝成功

iam使用者通路密鑰内容可以寫入目前使用者預設密鑰檔案比如<code>/home/ec2-user/.passwd-s3fs</code>或者使用者自己建立的檔案。

指令格式:<code>echo [iam使用者通路密鑰id]:[ iam使用者通路密鑰] &amp;gt;[密鑰檔案名]</code>

指令舉例:下面的例子将在目前使用者預設路徑建立密鑰檔案

請注意:通路海外aws s3服務和中國 s3服務使用的是不同的iam賬号,對應不同的密鑰。

指令格式:chmod 600 [密鑰檔案名]

指令舉例:下面的例子将設定密鑰檔案隻能被目前使用者通路

s3fs挂載存儲桶使用的指令是s3fs

s3fs的指令格式是:

s3fs bucket mountpoint [option]…

s3fs [s3存儲桶名] [本地目錄名] [option]

option是可選項,格式是 –o &lt;option_name&gt;=&lt;option_value&gt;,常用的options有:

名稱

含義

預設值

passwd_file

指定挂載的密鑰檔案

connect_timeout

設定逾時連接配接等待的時間,機關秒

300

url

設定通路s3的url

http://s3.amazonaws.com

endpoint

設定s3存儲桶的endpoint

us-east-1

allow_other

設定allow_other允許所有使用者通路挂載點目錄,設定這個選項需要在 /etc/fuse.conf 檔案添加user_allow_other選項

手動挂載aws海外區域s3存儲桶

指令格式:<code>s3fs [s3存儲桶名] [本地目錄名] -o passwd_file=[密鑰檔案名] -o endpoint=[區域名]</code>

指令舉例:下面的例子将名為<code>s3fs-mount-bucket</code>的新加坡區域s3存儲桶挂載到指定的本地目錄<code>/home/ec2-user/s3mnt</code>。

手動挂載aws中國北京區域s3存儲桶

指令格式:<code>s3fs [s3存儲桶名] [本地目錄名] -o passwd_file=[密鑰檔案名] -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1</code>

指令舉例:下面的例子将名為<code>s3fs-mount-bucket</code>的北京區域s3存儲桶挂載到本地目錄<code>/home/ec2-user/s3mnt</code>。

檢查挂載結果

挂載操作執行結束後,可以使用linux <code>df</code>指令檢視挂載是否成功。出現類似下面256t的s3fs檔案系統即表示挂載成功。使用者就可以進入本地挂載目錄去通路存儲在s3存儲桶中的對象。

解除安裝挂載的s3存儲桶

如果不再需要通過挂載方式通路s3存儲桶,可以使用linux “umount”指令解除安裝

[ec2-user@ip-172-31-23-148 ~]$ df -h

檔案系統 容量 已用 可用 已用% 挂載點

devtmpfs 488m 56k 488m 1% /dev

tmpfs 498m 0 498m 0% /dev/shm

/dev/xvda1 7.8g 1.2g 6.6g 15% /

切換linux系統使用者賬号到<code>root</code>使用者,把iam使用者通路密鑰内容寫入/etc/passwd-s3fs檔案中,并限制該檔案的通路權限。<code>/etc/passwd-s3fs</code>檔案是s3fs儲存iam使用者通路密鑰的全局預設路徑。

編輯/etc/fstab檔案,添加後面的自動挂載指令。

自動挂載海外區域s3存儲桶

指令格式:<code>s3fs#[s3存儲桶名] [本地目錄名] fuse _netdev,allow_other,endpoint=[區域名] 0 0</code>

指令舉例:添加下面的語句到/etc/fstab後,linux系統啟動後将自動把名為<code>s3fs-mount-bucket</code>的新加坡區域s3存儲桶挂載到本地目錄<code>/home/ec2-user/s3mnt</code>,并允許其它作業系統使用者(非root使用者)通路。

自動挂載中國北京區域s3存儲桶

指令格式:<code>s3fs#[s3存儲桶名] [本地目錄名] fuse allow_other,url=http://s3.cn-north-1.amazonaws.com.cn,endpoint=cn-north-1 0 0</code>

指令舉例:添加下面的語句到<code>/etc/fsta</code>b後,linux系統啟動将自動把名為<code>s3fs-mount-bucket</code>的北京區域s3存儲桶挂載到本地目錄<code>/home/ec2-user/s3mnt</code>下,并允許其它作業系統使用者(非root使用者)通路。

利用s3fs可以友善的把s3存儲桶挂載在使用者本地作業系統目錄中,但是由于s3fs實際上是依托于amazon s3服務提供的目錄通路接口,是以不能簡單的把s3fs挂載的目錄和本地作業系統目錄等同使用。使用者使用s3f3挂載s3存儲桶和直接通路s3服務有類似的使用場景。适用于對不同大小檔案對象的一次儲存(上傳),多次讀取(下載下傳)。不适用于對已儲存檔案經常做随機修改,因為每次在本地修改并儲存檔案内容都會導緻s3fs上傳新的檔案到amazon s3去替換原來的檔案。從通路性能上來說,通過作業系統目錄方式間接通路amazon s3存儲服務的性能不如直接使用sdk或cli接口通路效率高。以本地配置檔案方式儲存通路密鑰的安全性也不如使用ec2 iam角色方式高。

關于s3fs使用時候需要注意的更多細節,請參考下面s3fs官網内容:

“generally s3 cannot offer the same performance or semantics as a local file system. more specifically:

random writes or appends to files require rewriting the entire file

metadata operations such as listing directories have poor performance due to network latency

eventual consistency can temporarily yield stale data

no atomic renames of files or directories

no coordination between multiple clients mounting the same bucket

no hard links ”

通常s3不能提供與本地檔案系統相同的性能或語義。進一步來說:

随機寫入或追加到檔案需要重寫整個檔案

中繼資料操作比如列出目錄會因為網絡延遲原因導緻性能較差

最終一緻性設計可能臨時導緻過期資料

沒有對檔案或目錄的原子重命名功能

挂載相同存儲桶的多個用戶端之間沒有互相協調機制

不支援硬連結

利用s3fs可以把共享的amazon s3存儲桶直接挂載在使用者伺服器本地目錄下,應用不需要做修改就可以直接使用amazon s3存儲服務,這種方式可以作為臨時解決方案将傳統應用快速遷移到aws平台。

在已經提供了amazon efs(elastic file system)服務的aws區域,建議使用者優先考慮使用amazon efs服務,因為它具有更高的性能。在目前還沒有提供efs服務的aws區域,使用者可以先暫時使用s3fs實作快速業務遷移。然後逐漸調整s3資料通路實作方式,最終修改為使用aws sdk或cli方式高效并更加安全地通路s3存儲服務。

繼續閱讀