對象存儲OSS支持函數計算服務,您可以借助函數計算快速構建任何類型的應用和函數,本文將介紹如何使用函數計算將對象存儲OSS上多個文件(Object)打包下載到本地。
前提條件
已開通函數計算。
您可以在函數計算產品詳情頁開通函數計算。
已授權函數計算訪問OSS。
具體步驟,請參見授予函數計算訪問其他云服務的權限。
OSS創建的bucket和應用函數需在同一個 region。
已在某個Bucket的指定目錄下上傳多個文件。本教程以在華東1(杭州)地域的examplebucket下的dir目錄中上傳多個文件為例。具體步驟,請參見簡單上傳。
方案概述
當您從OSS中批量下載Object時可能會遇到批量下載不方便、小文件較多時下載緩慢等問題。通過調用函數計算,可以將OSS上的Object先打包,然后將壓縮包下載到本地后再解壓,實現快速下載批量文件的目的。使用函數計算打包下載OSS文件的工作流程如下圖所示。
用戶調用函數,并指定存儲空間及待壓縮的文件。
函數計算從OSS中下載指定文件,并生成一個隨機名稱的ZIP壓縮包。
函數計算將壓縮包上傳至OSS。
函數計算將ZIP包的下載地址返回給用戶。
用戶使用返回的長期有效的下載地址從OSS中下載文件。
使用說明
函數運行環境的磁盤空間是有限的,所以采用流式下載和上傳的方式,只在內存中緩存少量的數據。
為了加快速度,函數計算在生成ZIP文件的同時將文件上傳到OSS。
上傳ZIP文件到OSS時,利用OSS分片上傳的特性,多線程并發上傳。
使用函數計算壓縮文件時,最大處理時間是24小時(實驗數據為57個文件,總大小1.06 GB,處理時間為63s)。
操作步驟
以下以通過函數計算將華東1(杭州)地域examplebucket中dir/目錄下的多個文件打包下載到本地為例。
部署應用并獲取對外公網域名。
使用資源編排ROS一鍵部署
您可以使用一鍵部署通過ROS快速部署函數計算應用。部署完成后,單擊輸出頁簽獲取對外公網域名。
使用Serverless應用中心一鍵部署
通過Serverless應用中心一鍵部署應用模板start-zip-oss。
其中,部署類型選擇直接部署,應用模板所在地域與Bucket所在地域保持一致,其他選項保留默認配置。配置詳情如下圖所示。
獲取對外公網域名。
單擊結果頁簽。
在triggers字段獲取對外公網域名(urlInternet)。
使用Serverless Devs命令行工具手動部署
安裝Serverless Devs。
curl -o- -L http://cli.so/install.sh | bash
驗證是否安裝成功。
s -v
成功安裝后的執行結果:
@serverless-devs/s: 2.1.1, s-home: /root/.s, linux-x64, node-v14.19.3
配置Serverless Devs。
s config add --AccessKeyID LTAI******** --AccessKeySecret KZo1******** --access fc-access
參數說明如下:
參數
說明
--AccessKeyID
訪問函數計算服務的AccessKey ID。
--AccessKeySecret
訪問函數計算服務的AccessKey Secret。
--Access
自定義密鑰別名。
部署應用模板start-zip-oss。
初始化項目。
參考以下示例值完成各個配置項。
進入項目。
部署項目。
記錄輸出結果中返回的system_url。
s init start-zip-oss -d start-zip-oss
配置項
示例值
應用所在的地域
cn-hangzhou
應用所屬的函數計算服務
start-zip-oss
應用的函數名稱
zip-oss-func
應用所屬的函數計算服務配置的RAM角色ARN
acs:ram::137918634953****:role/test-role
cd start-zip-oss
s deploy -y
fc-zip-oss-service: region: cn-hangzhou service: name: start-zip-oss function: name: zip-oss-func runtime: python2.7 handler: main.main_handler memorySize: 3072 timeout: 1800 url: system_url: https://zip-oss-func-start-zip-oss-ayouye****.cn-hangzhou.fcapp.run triggers: - type: http name: http-test
在您自己的服務器或阿里云ECS上執行以下命令生成event.json文件,并在文件中指定Bucket名稱以及待下載的文件所在目錄。
cat <<EOF > event.json { "bucket": "examplebucket", "source-dir": "dir/" } EOF
說明source-dir僅支持指定為Bucket下的某個目錄,不支持指定為Bucket根目錄。
請求示例如下。
curl -v -L -o oss.zip -d @./event.json https://zip-oss-func-zip-oss-ayouye****.cn-hangzhou.fcapp.run
/test/oss.zip:用于存放dir/目錄下所有文件的本地路徑。
https://zip-oss-func-zip-oss-ayouye****.cn-hangzhou.fcapp.run:表示start-zip-oss應用的對外公網域名。
說明如果您需要將以上示例中的匿名非鑒權HTTP函數修改為鑒權HTTP函數,您可以通過以下任意一種語言的SDK進行調用:
常見問題
是否支持通過函數計算打包下載文件時對文件添加水???
通過函數計算打包下載文件時是否支持生成帶有時效性的文件下載地址?
更多參考
關于函數計算與OSS交互模板和應用的更多信息,請參見示例代碼。
更多OSS使用函數計算的操作示例,請參見使用函數計算實現OSS壓縮文件的自動解壓。