建立對象FC存取點通過GetObject請求觸發函數

更新時間:
Copy as MD

您可以在Object Storage Service中建立對象FC存取點,實現OSSFunction Compute FC整合。通過對象FC存取點,OSSGetObject事件能自動觸發函數執行,並將結果返回給應用程式,實現自動化資料處理和商務程序。

方案概覽

對象FC存取點的調用原理如下圖所示:

  1. 建立對象FC存取點,根據業務需求編寫特定的FC函數,將該函數與OSS的對象FC存取點關聯。

  2. Bucket會根據預設配置自動構建對象FC存取點。

  3. 使用者向對象FC存取點發出GETObject請求時,OSS將自動調用相應的FC函數,並將處理後的資料返回給使用者。

使用限制

限制項

說明

建立方式

支援通過OSS控制台和API的方式建立對象FC存取點。不支援通過SDK、ossutil等方式建立對象FC存取點。

數量

  • 單個阿里雲帳號支援建立1000個對象FC存取點。

  • 單個Bucket支援建立100個對象FC存取點。

修改規則

建立對象FC存取點後,僅支援修改存取點策略,不支援修改存取點基礎資訊,例如存取點名稱、存取點別名等。

訪問方式

不支援匿名訪問。

前提條件

  • Object Storage Service

    建立OSS Bucket,並在Bucket所在地區TEST3_H1有值_標題為空白

  • Function Compute FC

    1. 建立服務關聯角色AliyunServiceRoleForFC。首次登入Function Compute3.0控制台的使用者,需根據介面提示完成建立。

    2. 建立FC函數。本文以事件函數為例。支援通過Java、Python、Go SDK調用GetObject介面時觸發Function Compute,通過這幾種語言SDK部署函數代碼時,您需要建立符合運行環境要求的函數。

      • 通過Java SDK部署函數代碼時,需要建立运行环境Java 11的函數。

      • 通過Python SDK部署函數代碼時,需要建立运行环境Python 3.10的函數。

      • 通過Go SDK部署函數代碼時,需要建立运行环境Go 1的函數。

    3. 為已建立的FC函數綁定角色,角色需授予oss:WriteGetObjectResponse許可權。具體步驟,請參見管理RAM角色的許可權。權限原則內容如下:

      {
        "Statement": [
          {
            "Action": "oss:WriteGetObjectResponse",
            "Effect": "Allow",
            "Resource": "*"
          }
        ],
        "Version": "1"
      }

操作步驟

步驟一:建立對象FC存取點

  1. 登入OSS管理主控台,在左側導覽列,單擊對象FC存取點列表

  2. 對象FC存取點列表頁面,單擊建立對象FC存取點,然後在建立對象FC存取點面板,設定以下參數,最後單擊确定

    配置項

    說明

    地域

    選擇需要關聯的存取點所在地區,同時也是OSS Bucket所在地區。

    對象FC存取點名稱

    為對象FC存取點命名。

    支援的存取點

    選擇已建立的存取點。

    OSS API

    選中GetObject

    調用 FC 函數

    選擇目標FC函數,並勾選FC 函數支援使用 Range GetObject 請求複選框。

    FC 函數版本

    選擇已建立函數對應的版本,預設使用LATEST版本。

  3. 完成角色授權。

    重要

    首次使用對象 FC 存取點功能的使用者,單擊存取點許可權委派完成角色授權,否則無法通過對象FC存取點訪問函數。

    對象 FC 存取點進入建立中狀態,預計10分鐘左右生效,狀態變為建立成功後才能正常使用。單擊前往 RAM 授權完成授權,然後單擊完成

重要

僅當通過對象FC存取點別名訪問GetObject介面時會觸發Function Compute。當使用對象FC存取點別名訪問非GetObject介面時,後台將自動切換為OSS存取點,並遵循OSS存取點的權限原則。

步驟二:編寫函數代碼

  1. 登入Function Compute控制台,在左側導覽列,選擇函数管理 > 函数列表

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

  3. 選擇函数详情 > 代码,在代碼編輯器中修改index.py檔案的代碼為以下範例程式碼,本文以建立的運行環境為Python 3.10的函數為例,更多範例程式碼,請參見編寫請求函數

    # -*- coding: utf-8 -*-
    import io
    from PIL import Image
    import oss2
    import json
    # Endpoint以華北1(青島)為例。
    endpoint = 'http://oss-cn-qingdao.aliyuncs.com'
    fwd_status = '200'
    # Fc function entry
    def handler(event, context):
        evt = json.loads(event)
        creds = context.credentials
        # do not forget security_token
        auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
        headers = dict()    
        event_ctx = evt["getObjectContext"]
        route = event_ctx["outputRoute"]
        token = event_ctx["outputToken"]
        print(evt)
        endpoint = route
        service = oss2.Service(auth, endpoint)
        # 通過調用Image方法建立200*200像素的對象,並為該對象繪製紅色的矩形框。
        # 完成以上調整後,將內容寫入write_get_object_response請求的主體中。
        image = Image.new('RGB', (200, 200), color=(255, 0, 0))
        transformed = io.BytesIO()
        image.save(transformed, "png")
        resp = service.write_get_object_response(route, token, fwd_status, transformed.getvalue(), headers)
        print('status: {0}'.format(resp.status))
        print(resp.headers)
        return 'success'
  4. 代码頁簽,選擇,開啟終端視窗,執行以下命令更新OSS Python SDK版本。

    pip install oss2 "pyopenssl>=23.0.0" "urllib3==1.26.15" "charset-normalizer==2.1.1"  -t .
  5. 單擊部署代码

步驟三:使用對象FC存取點

對象FC存取點建立完成後,OSS會自動產生對象FC存取點別名,您可以使用對象FC存取點別名調用GetObject介面。

  1. 登入OSS管理主控台,在左側導覽列,單擊對象FC存取點列表

  2. 在對象FC存取點列表,找到目標對象FC存取點,在對象FC存取點別名列中擷取對應的別名。

  3. 使用以下方式通過對象FC存取點別名調用GetObject介面,測試是否能自動觸發函數執行。

    使用SDK

    1. 安裝OSS Python SDK。僅Python SDK 2.18.3及以上版本支援通過對象FC存取點別名的方式訪問OSS資源。

      pip3 install oss
    2. 在本地運行以下Python樣本指令碼。

      請先按照實際替換以下樣本中的endpointbucketnamebucket.get_object_to_file欄位內容。

      • endpoint:OSS的存取點名稱。

      • bucketname:您上一步擷取的目標對象FC存取點別名。

      • bucket.get_object_to_fileyourObjectName替換為您的OSS Bucket中的對象名稱,yourLocalFile替換為您本地要擷取的對象的檔案路徑。

      # -*- coding: utf-8 -*-
      import oss2
      from oss2.credentials import EnvironmentVariableCredentialsProvider
      # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
      auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
      # 使用對象FC存取點的外網Endpoint進行訪問。
      endpoint = "https://oss-cn-qingdao.aliyuncs.com"
      # 使用對象FC存取點的內網Endpoint進行訪問。
      # endpoint = "https://oss-cn-qingdao-internal.aliyuncs.com"
      # 填寫對象FC存取點別名。
      bucket_name = "****-d54843759613953fe5b17b6f16d7****-opapalias"
      bucket = oss2.Bucket(auth, endpoint=endpoint, bucket_name=bucket_name)
      # yourObjectName填寫Object完整路徑,完整路徑中不包含Bucket名稱。
      # yourLocalFile填寫本地檔案路徑。如果指定的本地檔案存在會覆蓋,不存在則建立。
      bucket.get_object_to_file('yourObjectName', 'yourLocalFile')

    使用命令列工具ossutil

    安裝ossutil,然後執行以下命令進行測試。

    ossutil cp oss://****-d54843759613953fe5b17b6f16d7****-opapalias/demo.txt /Users/demo/Desktop/demo.txt

    使用REST API

    通過GetObject請求OSS資源時,您需要在Host中使用上一步擷取的對象FC存取點別名,樣本如下:

    GET /ObjectName HTTP/1.1
    Host: fc-ap-01-3b00521f653d2b3223680ec39dbbe2****-opapalias.oss-cn-qingdao.aliyuncs.com
    Date: GMT Date
    Authorization: SignatureValue