建立對象FC存取點通過GetObject請求觸發函數
您可以在Object Storage Service中建立對象FC存取點,實現OSS和Function Compute FC整合。通過對象FC存取點,OSS的GetObject事件能自動觸發函數執行,並將結果返回給應用程式,實現自動化資料處理和商務程序。
方案概覽
對象FC存取點的調用原理如下圖所示:
建立對象FC存取點,根據業務需求編寫特定的FC函數,將該函數與OSS的對象FC存取點關聯。
Bucket會根據預設配置自動構建對象FC存取點。
使用者向對象FC存取點發出GETObject請求時,OSS將自動調用相應的FC函數,並將處理後的資料返回給使用者。
使用限制
限制項 | 說明 |
建立方式 | 支援通過OSS控制台和API的方式建立對象FC存取點。不支援通過SDK、ossutil等方式建立對象FC存取點。 |
數量 |
|
修改規則 | 建立對象FC存取點後,僅支援修改存取點策略,不支援修改存取點基礎資訊,例如存取點名稱、存取點別名等。 |
訪問方式 | 不支援匿名訪問。 |
前提條件
-
Object Storage Service
建立OSS Bucket,並在Bucket所在地區TEST3_H1有值_標題為空白。
-
Function Compute FC
-
建立服務關聯角色AliyunServiceRoleForFC。首次登入Function Compute3.0控制台的使用者,需根據介面提示完成建立。
-
建立FC函數。本文以事件函數為例。支援通過Java、Python、Go SDK調用GetObject介面時觸發Function Compute,通過這幾種語言SDK部署函數代碼時,您需要建立符合運行環境要求的函數。
-
通過Java SDK部署函數代碼時,需要建立运行环境為Java 11的函數。
-
通過Python SDK部署函數代碼時,需要建立运行环境為Python 3.10的函數。
-
通過Go SDK部署函數代碼時,需要建立运行环境為Go 1的函數。
-
-
為已建立的FC函數綁定角色,角色需授予
oss:WriteGetObjectResponse許可權。具體步驟,請參見管理RAM角色的許可權。權限原則內容如下:{ "Statement": [ { "Action": "oss:WriteGetObjectResponse", "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
-
操作步驟
步驟一:建立對象FC存取點
-
登入OSS管理主控台,在左側導覽列,單擊對象FC存取點列表。
-
在對象FC存取點列表頁面,單擊建立對象FC存取點,然後在建立對象FC存取點面板,設定以下參數,最後單擊确定。
配置項
說明
地域
選擇需要關聯的存取點所在地區,同時也是OSS Bucket所在地區。
對象FC存取點名稱
為對象FC存取點命名。
支援的存取點
選擇已建立的存取點。
OSS API
選中GetObject。
調用 FC 函數
選擇目標FC函數,並勾選FC 函數支援使用 Range GetObject 請求複選框。
FC 函數版本
選擇已建立函數對應的版本,預設使用LATEST版本。
-
完成角色授權。
重要首次使用對象 FC 存取點功能的使用者,單擊存取點許可權委派完成角色授權,否則無法通過對象FC存取點訪問函數。
對象 FC 存取點進入建立中狀態,預計10分鐘左右生效,狀態變為建立成功後才能正常使用。單擊前往 RAM 授權完成授權,然後單擊完成。
僅當通過對象FC存取點別名訪問GetObject介面時會觸發Function Compute。當使用對象FC存取點別名訪問非GetObject介面時,後台將自動切換為OSS存取點,並遵循OSS存取點的權限原則。
步驟二:編寫函數代碼
-
登入Function Compute控制台,在左側導覽列,選擇。
-
在頂部功能表列,選擇地區,然後在函数列表頁面,單擊目標函數。
-
選擇,在代碼編輯器中修改
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' -
在代码頁簽,選擇,開啟終端視窗,執行以下命令更新OSS Python SDK版本。
pip install oss2 "pyopenssl>=23.0.0" "urllib3==1.26.15" "charset-normalizer==2.1.1" -t . -
單擊部署代码。
步驟三:使用對象FC存取點
對象FC存取點建立完成後,OSS會自動產生對象FC存取點別名,您可以使用對象FC存取點別名調用GetObject介面。
-
登入OSS管理主控台,在左側導覽列,單擊對象FC存取點列表。
-
在對象FC存取點列表,找到目標對象FC存取點,在對象FC存取點別名列中擷取對應的別名。
-
使用以下方式通過對象FC存取點別名調用
GetObject介面,測試是否能自動觸發函數執行。使用SDK
-
安裝OSS Python SDK。僅Python SDK 2.18.3及以上版本支援通過對象FC存取點別名的方式訪問OSS資源。
pip3 install oss -
在本地運行以下Python樣本指令碼。
請先按照實際替換以下樣本中的
endpoint、bucketname和bucket.get_object_to_file欄位內容。-
endpoint:OSS的存取點名稱。 -
bucketname:您上一步擷取的目標對象FC存取點別名。 -
bucket.get_object_to_file:yourObjectName替換為您的OSS Bucket中的對象名稱,yourLocalFile替換為您本地要擷取的對象的檔案路徑。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_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 -