通過rclone結合阿里雲OSS或者AWS S3發佈和上線代碼

在進行項目的開發時,在多數測試和上線操作的場景中,我們總是需要把代碼或者打包好的代碼部署到一箇中間的服務器或者存儲上。在不同給的情況下,尤其是在很多人合作的情形下,我們就會或多或少的遇到下面的問題:

  • 如果大家都在同一個辦公場地,代碼部署到一個內部的服務器中會很方便(或者以專用網絡的形式的訪問公司的數據中心),但是在遠程辦公的條件下(比如在疫情期間),就會存在很多安全性的問題。而且,在家辦公的場景中,因爲每個人的網絡條件不一樣,網絡訪問的便捷性也很成問題。
  • 不同的開發和運維人員需要設置不同的權限,需要有一個統一的授權系統來管理權限和授權,而且授權機制的管理最好可以和持續集成的服務可以很好地結合。
  • 爲了方便版本回滾和問題排查,需要解決歷史版本的代碼或者軟件包的保存問題。而且歷史版本都保存的話,也會需要可以擴展,廉價且有冗餘保障的存儲空間。
  • 使用git等代碼庫存放需要打包的代碼,會造成代碼庫的體積過大的,每一次fetch或者pull都非常的慢,消耗大量的時間。
  • 直接使用服務器作爲這個代碼中轉很容易受到服務器故障的影響,如果是公司內網的服務器甚至還會受到停電等問題的影響。

我們再這篇文章裏介紹一下rclone結合阿里雲OSSAWS S3來說明一個方法,對於上述問題都可以提供更好的幫助。首先我們來看一下配置和使用方法。

rclone的安裝與實用

rclone是一個類似於rsync的文件系統的命令行同步工具,區別在於,rclone是針對各種的雲存儲開發的,而且可以完成本地與雲存儲,以及不同的雲存儲之間的文件操作。

安裝rclone最簡單的方法就是直接執行遠程的安裝腳本(當然也可以根據具體發行版參考文檔進行安裝):

curl https://rclone.org/install.sh | sudo bash

在Linux上完成安裝之後,rclone會默認從配置文件~/.config/rclone/rclone.conf中獲取rclone的配置。我們既可以通過rclone的config命令來交互式修改這個配置,也可以直接編輯這個配置文件。

首先,我們來看一個阿里雲OSS的配置(可以粘貼在rclone.conf中):

[oss-beijing]
type = s3
provider = Alibaba
env_auth = false
access_key_id = <YOUR_ACCESS_KEY_ID>
secret_access_key = <YOUR_SECRET_ACCESS_KEY>
endpoint = <YOUR_REGION>.aliyuncs.com
acl = private
storage_class = Standard

這裏需要需要解釋一下,其中[oss-beijing]是一個本地給阿里雲OSS某一個區域的別名,在命令行中用來當做前綴使用,比如oss-beijing:my-bucket-name就是這個區域下面叫做my-bucket-name的桶(Bucket),而endpoint也要指定爲對應的區域EndPoint(這個值可以在阿里雲控制檯查看到)。access_key_id和secret_access_key需要替換成權限適合的密鑰對。

AWS S3的rclone的配置則更爲簡單:

[s3-beijing]
type = s3
provider = AWS
env_auth = true
region = cn-north-1
endpoint = https://s3.cn-north-1.amazonaws.com.cn

在這裏指定endpointhttps://s3.cn-north-1.amazonaws.com.cn是爲了rclone能夠在AWS中國區的cn-north-1工作(寧夏區則需要另外一個地址)。而env_auth被指定爲true,則是可以避免在rclone.conf中寫上AWS的key和secret,而是直接使用~/.aws/中的配置。當然後,如果在環境中配置AWS使用了named profile時,也可以在運行rclone時,通過指定環境變量AWS_PROFILE=<your_profile_name>來使用某一個profile。

這個時候就可以使用一些命令來訪問某些桶了:

# 列出my-bucket-name下的目錄
rclone lsd oss-beijing:my-bucket-name
rclone lsd s3-beijing:my-bucket-name

# 以json形式列出my-bucket-name下的目錄和文件
rclone lsjson oss-beijing:my-bucket-name
rclone lsjson s3-beijing:my-bucket-name

# 以json形式遞歸的列出my-bucket-name下目錄和文件
# 這裏的所謂遞歸其實並不是準確的描述,主要還是指列出Bucket下面全部的item
rclone lsjson oss-beijing:my-bucket-name -R
rclone lsjson s3-beijing:my-bucket-name -R

那麼,在打包完成時,需要做的事情就是把本地的對應的目錄同步到阿里雲OSS或者S3中即可:

rclone sync <LOCAL_PATH> oss-beijing:my-bucket-name/target-path/
rclone sync <LOCAL_PATH> s3-beijing:my-bucket-name/target-path/

而在其他的主機上,也很方便將阿里雲OSS或者S3中的對應目錄同步回來:

rclone sync oss-beijing:my-bucket-name/target-path/ <LOCAL_PATH>
rclone sync s3-beijing:my-bucket-name/target-path/ <LOCAL_PATH>

注意sync命令會將目標路徑完全同步爲和本地一致的結構。

有關rclone具體使用方法,大家可以繼續參考其官方文檔。

一些需要注意的地方

回到一開始考慮的各種問題,在這裏我們來補充一些需要注意的地方

  • 對於版本問題,建議在打包和同步的時候,把代碼的版本號作爲目錄名同步到遠端的存儲中,這樣在阿里雲OSS或者S3就可以保存全部的代碼包的歷史。需要進行歷史的冗餘備份時,可以直接通過每個雲服務商自己提供的機制來進行桶的複製,甚至還可以通過rclone來進行跨雲服務商備份。如果不需要保存歷史比較久的版本,也可以設置自動過期的機制。
  • 在權限管理方便,可以通過[阿里雲的RAM]()和AWS的IAM爲每一個參與建立單獨的賬號,並且可以在可以訪問的Bucket的層面賦予權限。這樣,每個賬戶可以通過自己的key/secret來進行訪問。
  • 在rclone的lsjson命令中訪問的數據中,有文件或者目錄的創建時間等元信息,在同一個桶的路徑下,可以通過這些來區分出最新同步的版本。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章