Object Storage Service (OSS)是一款海量、安全、低成本、高可靠的雲端儲存體服務。您可以通過為Function Compute配置OSS掛載,讓函數使用OSS可以實作類別似本地檔案系統的操作體驗,從而簡化資源訪問和資料處理流程。
使用限制
Function Compute在同一地區下的一個函數最多支援配置5個NAS掛載點和5個OSS掛載點。
NAS掛載點和OSS掛載點設定的函數運行環境中的本地目錄不能衝突。
關於配置NAS掛載點的更多資訊,請參見配置NAS檔案系統。
前提條件
Object Storage Service (OSS)
Function Compute
為函數角色配置許可權。啟用OSS掛載功能時,需要為函數配置訪問OSS的角色。具體操作,請參見授予Function Compute訪問其他雲端服務的許可權。
操作步驟
步驟一:配置OSS掛載
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數詳情頁面,選擇配置頁簽,然後在左側導覽列選擇儲存頁簽,在OSS Object Storage Service地區單擊編輯,在編輯面板中配置以下參數,然後單擊部署。
配置項
說明
樣本
掛載 OSS Object Storage Service
是否啟用OSS檔案系統。取值說明如下。
啟用:啟用OSS檔案系統。
禁用:不啟用OSS檔案系統。
啟用
OSS掛載點:填寫配置OSS掛載點的相關資訊。
Bucket
選擇已建立的儲存空間Bucket。如需建立新的OSS儲存空間,可以單擊下方的建立新的 OSS Bucket跳轉到Object Storage Service控制台手動建立。關於使用OSS儲存涉及的費用問題,請參見OSS計費概述。
example-bucket
Bucket 子目錄
設定Bucket中的子目錄,必須為絕對路徑。留空或設定為/表示掛載Bucket的根目錄。
/files
OSS 訪問地址
選擇Bucket後,預設選擇該Bucket對應的訪問地址。可以根據需要選擇自訂地址,調整訪問地址的值。關於各地區OSS服務的訪問地址,請參見訪問網域名稱和資料中心。
說明如果選擇與Function Compute的函數相同地區的Bucket,建議使用OSS內網Endpoint作為訪問地址。
如果選擇不同地區的Bucket,則必須使用OSS外網Endpoint作為訪問地址,會產生一定的外網流出流量費用。
預設地址
函數本地目錄
設定函數運行環境中的本地目錄,必須為/home、/mnt或/data的子目錄。
說明設定的函數本地目錄不需要您手動建立,直接使用就可以。
/mnt/oss
函數本地目錄許可權
選擇Bucket掛載到函數運行環境中的本地目錄後,該目錄的存取權限。支援設定為唯讀或讀寫許可權。
讀寫
說明OSS掛載功能依賴函數的網路設定。當您的網路設定只允許函數訪問VPC,即設定僅允許指定 VPC 調用函數為是且允許函數預設網卡訪問公網為否時,如需使用OSS外網Endpoint,要求函數能夠通過指定的VPC訪問公網。具體操作,請參見配置固定公網IP地址。
步驟二:訪問OSS掛載的目錄檔案
完成OSS掛載配置後,您可以通過以下步驟訪問OSS掛載的目錄下的檔案內容,即可以用訪問本地檔案的方式訪問OSS掛載目錄下的檔案。
在函數詳情頁面,單擊代碼頁簽,在代碼編輯器中編寫代碼,然後單擊部署代碼。
本文以Python函數代碼為例,範例程式碼如下。
import os def handler(event, context): # 掛載目錄 mount_path = '/mnt/oss' # 列出掛載目錄中的檔案 files = os.listdir(mount_path) print("Files in OSS mount:", files) # 讀取掛載目錄中的某個檔案 file_path = os.path.join(mount_path, 'example.txt') if os.path.exists(file_path): with open(file_path, 'r') as file: content = file.read() print("Content of example.txt:", content) else: print("example.txt does not exist.") # 向掛載目錄中寫入檔案 write_path = os.path.join(mount_path, 'output.txt') with open(write_path, 'w') as file: file.write("Hello, OSS mount!") print("Wrote to output.txt in OSS mount.") return "Function execution completed."
說明在上述代碼中
example.txt
需要修改為您掛載的OSS目錄下實際存在的檔案名稱。代碼部署成功後,單擊代碼頁簽的測試函數。
執行完成後,您可以在代碼頁簽的下方查看執行結果。在日誌輸出頁簽下可以看到讀取的OSS目錄下
example.txt
檔案的內容,同時在OSS控制台對應的掛載目錄下可以看到寫入的output.txt
檔案內容。
常見問題
提示OSS掛載失敗,報錯資訊為bucket not found
。
請確認OSS訪問地址、Bucket名稱是否填寫準確。
提示OSS掛載失敗,報錯資訊為host resolv error
或deadline exceeded
。
請確認Endpoint地址是否填寫準確。
Endpoint地址中的網域名稱解析失敗會導致
host resolv error
報錯。內網Endpoint不可跨地區使用。使用其他地區的內網Endpoint作為訪問地址時,會出現連線逾時,導致
deadline exceeded
報錯。
掛載失敗,報錯資訊為invalid credentials
。
請確認您為函數配置的RAM角色是否具備訪問OSS的許可權,許可權資訊如下所示。更多資訊,請參見授予Function Compute訪問其他雲端服務的許可權。
唯讀:包括
oss:ListObjects
和oss:GetObject
策略。讀寫:包括
oss:ListObjects
、oss:GetObject
、oss:PutObject
、oss:DeleteObject
、oss:ListParts
和oss:AbortMultipartUpload
。
oss:ListObjects
為Bucket層級操作。因此,當您為特定的Bucket開啟訪問時,權限原則中需要包含Bucket層級的資源指示,例如acs:oss:*:*:bucketName
。更多資訊,請參見OSS Resource說明。
讀取掛載的檔案時,報錯資訊為Input/output error
。
請確認您配置的OSS Bucket的儲存類型,其中儲存類型為Archive Storage和冷Archive Storage時,存放到該Bucket的檔案都是凍結狀態,這類檔案要解凍後才能正常訪問。建議您配置的OSS Bucket儲存類型為標準儲存。
如何查看自己配置的函數本地目錄下的檔案?
您可以在函數詳情頁面,單擊執行個體查看執行個體狀態為運行中的列表,選擇一個執行個體,單擊該執行個體操作列的登入執行個體。
登入執行個體成功後,您就可以通過命令查看配置的函數本地目錄下的檔案資訊。樣本如下:
函數執行個體內訪問掛載點出現Transport endpoint is not connected
。
如果函數執行個體記憶體規格較低、記憶體用量較大等,可能導致OSS掛載功能因記憶體不足而不可用,產生上述錯誤。請根據業務情況調高函數記憶體規格,建議使用OSS掛載點時函數記憶體規格不低於512 MB。
函數目錄下寫入的資料能持久儲存嗎?
函數執行個體被銷毀的時候,在函數目錄下寫入的資料也會被刪除。如果您希望資料可以持久儲存,建議您配置掛載。配置NAS檔案系統掛載或者配置OSS掛載均可以讓資料持久儲存。具體操作請參見配置NAS檔案系統和配置OSSObject Storage Service。
如何通過權限原則僅允許唯讀訪問指定Bucket?
如何通過權限原則允許讀寫訪問指定Bucket?
如何通過權限原則僅允許唯讀訪問指定Bucket的子目錄?
如何通過權限原則允許讀寫訪問指定Bucket的子目錄?
通過OSS掛載點寫檔案的過程中,從OSS側觀察檔案為空白。
通過OSS掛載點寫檔案時,一般情況下,系統只在使用者主動調用Flush或者關閉檔案時,才將寫入內容上傳至OSS側。
在OSS掛載點中,執行壓縮、解壓或檔案傳輸等操作時響應較慢。
OSS本身不支援檔案系統API。當您將OSS Bucket掛載為目錄之後,Function Compute會組合封裝OSS API,實現檔案系統API的效果。例如,OSS本身不支援隨機寫,當您需要使用檔案系統API變更OSS掛載點上現有的檔案時,Function Compute會將源檔案從OSS全量下載並改寫後重新上傳到OSS。
當檔案系統API與OSS API功能對應時,例如順序的檔案讀寫,通常操作執行的效能較好。而需要組合封裝OSS API實現的操作,例如壓縮、解壓可能用到的檔案隨機讀寫操作,可能需與OSS進行多次互動,故效能略差於本地檔案系統。
不同函數執行個體之間訪問OSS掛載點會互相協調同步嗎?
不同函數執行個體之間相互獨立,不同執行個體中查詢到的OSS掛載點內容可能不同。例如,通過函數執行個體A在OSS掛載點中建立檔案F後,在函數執行個體B中可能無法即時查詢到該檔案。