全部產品
Search
文件中心

Function Compute:配置OSSObject Storage Service

更新時間:Jul 19, 2024

Object Storage Service (OSS)是一款海量、安全、低成本、高可靠的雲端儲存體服務。您可以通過為Function Compute配置OSS掛載,讓函數使用OSS可以實作類別似本地檔案系統的操作體驗,從而簡化資源訪問和資料處理流程。

使用限制

  • Function Compute在同一地區下的一個函數最多支援配置5個NAS掛載點和5個OSS掛載點。

  • NAS掛載點和OSS掛載點設定的函數運行環境中的本地目錄不能衝突。

    關於配置NAS掛載點的更多資訊,請參見配置NAS檔案系統

前提條件

操作步驟

步驟一:配置OSS掛載

  1. 登入Function Compute控制台,在左側導覽列,單擊函數

  2. 在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。

  3. 在函數詳情頁面,選擇配置頁簽,然後在左側導覽列選擇儲存頁簽,在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掛載目錄下的檔案。

  1. 在函數詳情頁面,單擊代碼頁簽,在代碼編輯器中編寫代碼,然後單擊部署代碼

    本文以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目錄下實際存在的檔案名稱。

  2. 代碼部署成功後,單擊代碼頁簽的測試函數

    執行完成後,您可以在代碼頁簽的下方查看執行結果。在日誌輸出頁簽下可以看到讀取的OSS目錄下example.txt檔案的內容,同時在OSS控制台對應的掛載目錄下可以看到寫入的output.txt檔案內容。

常見問題

提示OSS掛載失敗,報錯資訊為bucket not found

請確認OSS訪問地址、Bucket名稱是否填寫準確。

提示OSS掛載失敗,報錯資訊為host resolv errordeadline exceeded

請確認Endpoint地址是否填寫準確。

  • Endpoint地址中的網域名稱解析失敗會導致host resolv error報錯。

  • 內網Endpoint不可跨地區使用。使用其他地區的內網Endpoint作為訪問地址時,會出現連線逾時,導致deadline exceeded報錯。

掛載失敗,報錯資訊為invalid credentials

請確認您為函數配置的RAM角色是否具備訪問OSS的許可權,許可權資訊如下所示。更多資訊,請參見授予Function Compute訪問其他雲端服務的許可權

  • 唯讀:包括oss:ListObjectsoss:GetObject策略。

  • 讀寫:包括oss:ListObjectsoss:GetObjectoss:PutObjectoss:DeleteObjectoss:ListPartsoss:AbortMultipartUpload

說明

oss:ListObjects為Bucket層級操作。因此,當您為特定的Bucket開啟訪問時,權限原則中需要包含Bucket層級的資源指示,例如acs:oss:*:*:bucketName。更多資訊,請參見OSS Resource說明

讀取掛載的檔案時,報錯資訊為Input/output error

請確認您配置的OSS Bucket的儲存類型,其中儲存類型為Archive Storage和冷Archive Storage時,存放到該Bucket的檔案都是凍結狀態,這類檔案要解凍後才能正常訪問。建議您配置的OSS Bucket儲存類型為標準儲存。

如何查看自己配置的函數本地目錄下的檔案?

  1. 您可以在函數詳情頁面,單擊執行個體查看執行個體狀態為運行中的列表,選擇一個執行個體,單擊該執行個體操作列的登入執行個體

    image

  2. 登入執行個體成功後,您就可以通過命令查看配置的函數本地目錄下的檔案資訊。樣本如下:

    image

函數執行個體內訪問掛載點出現Transport endpoint is not connected

如果函數執行個體記憶體規格較低、記憶體用量較大等,可能導致OSS掛載功能因記憶體不足而不可用,產生上述錯誤。請根據業務情況調高函數記憶體規格,建議使用OSS掛載點時函數記憶體規格不低於512 MB。

函數目錄下寫入的資料能持久儲存嗎?

函數執行個體被銷毀的時候,在函數目錄下寫入的資料也會被刪除。如果您希望資料可以持久儲存,建議您配置掛載。配置NAS檔案系統掛載或者配置OSS掛載均可以讓資料持久儲存。具體操作請參見配置NAS檔案系統配置OSSObject Storage Service

如何通過權限原則僅允許唯讀訪問指定Bucket?

展開查看權限原則描述樣本。請將樣本中bucketName替換為指定的Bucket名稱。更多資訊,請參見RAM Policy

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListObjects",
        "oss:GetObject"
      ],
      "Resource": [
        "acs:oss:*:*:bucketName",
        "acs:oss:*:*:bucketName/*"
      ],
      "Effect": "Allow"
    }
  ]
}

如何通過權限原則允許讀寫訪問指定Bucket?

展開查看權限原則描述樣本。請將樣本中bucketName替換為指定的Bucket名稱。更多資訊,請參見RAM Policy

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListObjects",
        "oss:GetObject",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:AbortMultipartUpload",
        "oss:ListParts"
      ],
      "Resource": [
        "acs:oss:*:*:bucketName",
        "acs:oss:*:*:bucketName/*"
      ],
      "Effect": "Allow"
    }
  ]
}

如何通過權限原則僅允許唯讀訪問指定Bucket的子目錄?

展開查看權限原則描述樣本。請將樣本中bucketName替換為指定的Bucket名稱,bucketPath替換為指定的Bucket子目錄。更多資訊,請參見RAM Policy

{
  "Version": "1",
  "Statement": [
    {
      "Action": "oss:ListObjects",
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName"
      ],
      "Condition": {
        "StringLike": {
          "oss:Prefix": [
            "bucketPath/*"
          ]
        }
      }
    },
    {
      "Action": [
        "oss:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName/bucketPath/*"
      ]
    }
  ]
}

如何通過權限原則允許讀寫訪問指定Bucket的子目錄?

展開查看權限原則描述樣本。請將樣本中bucketName替換為指定的Bucket名稱,bucketPath替換為指定的Bucket子目錄。更多資訊,請參見RAM Policy

{
  "Version": "1",
  "Statement": [
    {
      "Action": "oss:ListObjects",
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName"
      ],
      "Condition": {
        "StringLike": {
          "oss:Prefix": [
            "bucketPath/*"
          ]
        }
      }
    },
    {
      "Action": [
        "oss:GetObject",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:AbortMultipartUpload",
        "oss:ListParts"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName/bucketPath/*"
      ]
    }
  ]
}

通過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中可能無法即時查詢到該檔案。