配置原生OSS觸發(fā)器
本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。
您可以在函數(shù)計(jì)算控制臺(tái)創(chuàng)建并配置原生OSS觸發(fā)器,當(dāng)在OSS上發(fā)生特定事件時(shí)會(huì)自動(dòng)觸發(fā)函數(shù)執(zhí)行。這可以讓您輕松響應(yīng)如文件上傳等事件,無需在代碼中增加監(jiān)聽事件邏輯即可快速實(shí)現(xiàn)完整的流程。
示例場(chǎng)景
您可以配置一個(gè)OSS觸發(fā)器,并將其文件前綴設(shè)置為source
。當(dāng)有圖片存入指定的OSS Bucket中的source
目錄下,會(huì)自動(dòng)觸發(fā)函數(shù)執(zhí)行。函數(shù)將圖片進(jìn)行縮放處理后存放到同一個(gè)Bucket的processed
目錄下,即將source/a.png
處理為processed/a.png
。
使用限制
原生OSS觸發(fā)器,一個(gè)Bucket最多支持關(guān)聯(lián)10個(gè)觸發(fā)器。
說明如果您需要在一個(gè)Bucket內(nèi),關(guān)聯(lián)更多的OSS觸發(fā)器,可以選擇創(chuàng)建EventBridge類別的OSS觸發(fā)器。通常情況下,不推薦一個(gè)Bucket關(guān)聯(lián)10個(gè)以上的觸發(fā)器。如需創(chuàng)建,建議您創(chuàng)建新的Bucket,并基于新的Bucket創(chuàng)建觸發(fā)器。
原生OSS觸發(fā)器和EventBridge類別的OSS觸發(fā)器配置的文件前綴和文件后綴都不支持模糊匹配和正則匹配。如果想配置多個(gè)文件前綴和文件后綴,可使用EventBridge類別的OSS觸發(fā)器。
前提條件
函數(shù)計(jì)算
- 說明
在創(chuàng)建服務(wù)時(shí),請(qǐng)配置好服務(wù)角色,函數(shù)會(huì)獲得該角色所擁有的權(quán)限,否則在測(cè)試函數(shù)代碼時(shí)會(huì)報(bào)錯(cuò)。本文示例配置的服務(wù)角色為
AliyunFCDefaultRole
,并在權(quán)限策略中增加AliyunOSSFullAccess
。關(guān)于服務(wù)角色的信息,請(qǐng)參見授予函數(shù)計(jì)算訪問其他云服務(wù)的權(quán)限。
對(duì)象存儲(chǔ)OSS
步驟一:創(chuàng)建OSS觸發(fā)器
- 登錄函數(shù)計(jì)算控制臺(tái),在左側(cè)導(dǎo)航欄,單擊服務(wù)及函數(shù)。
- 在頂部菜單欄,選擇地域,然后在服務(wù)列表頁面,單擊目標(biāo)服務(wù)。
在函數(shù)管理頁面,單擊目標(biāo)函數(shù)名稱。
在函數(shù)詳情頁面,單擊觸發(fā)器管理頁簽,從版本或別名下拉列表選擇要?jiǎng)?chuàng)建觸發(fā)器的版本或別名,然后單擊創(chuàng)建觸發(fā)器。
在創(chuàng)建觸發(fā)器面板,填寫相關(guān)信息。然后單擊確定。
配置項(xiàng)
操作
本文示例
觸發(fā)器類型
選擇對(duì)象存儲(chǔ) OSS。
對(duì)象存儲(chǔ) OSS
名稱
填寫自定義的觸發(fā)器名稱。
oss-trigger
版本或別名
默認(rèn)值為LATEST,如果您需要?jiǎng)?chuàng)建其他版本或別名的觸發(fā)器,需先在函數(shù)詳情頁的版本或別名下拉列表選擇該版本。關(guān)于版本和別名的簡介,請(qǐng)參見管理版本和管理別名。
LATEST
Bucket 名稱
選擇已創(chuàng)建的OSS Bucket。
testbucket
文件前綴
輸入要匹配的文件名稱的前綴。建議您配置文件前綴和后綴,避免觸發(fā)事件嵌套循環(huán)觸發(fā)引起額外費(fèi)用。此外,一個(gè)Bucket的不同觸發(fā)器如果指定了相同的事件類型,則前綴和后綴不能重復(fù)。詳細(xì)信息,請(qǐng)參見OSS觸發(fā)器觸發(fā)規(guī)則。
重要文件前綴不能以
/
開頭,否則會(huì)導(dǎo)致OSS觸發(fā)器無法被觸發(fā)。source
文件后綴
輸入要匹配的文件名稱的后綴。強(qiáng)烈建議您配置前綴和后綴,避免觸發(fā)事件嵌套循環(huán)觸發(fā)引起額外費(fèi)用。另外,一個(gè)Bucket的不同觸發(fā)器如果指定了相同的事件類型,則前綴和后綴不能重復(fù)。詳細(xì)信息,請(qǐng)參見OSS觸發(fā)器觸發(fā)規(guī)則。
png
觸發(fā)事件
選擇一個(gè)或多個(gè)觸發(fā)事件。關(guān)于對(duì)象存儲(chǔ)OSS的事件類型,請(qǐng)參見OSS事件定義。
oss:ObjectCreated:PutObject
,oss:ObjectCreated:PostObject
,oss:ObjectCreated:CompleteMultipartUpload
角色名稱
選擇AliyunOSSEventNotificationRole。
說明如果您第一次創(chuàng)建該類型的觸發(fā)器,則需要在單擊確定后,在彈出的對(duì)話框中選擇立即授權(quán)。
AliyunOSSEventNotificationRole
創(chuàng)建完成后,在觸發(fā)器名稱列表中顯示已創(chuàng)建的觸發(fā)器。如需對(duì)創(chuàng)建的觸發(fā)器進(jìn)行修改或刪除,具體操作,請(qǐng)參見觸發(fā)器管理。
步驟二:配置函數(shù)入口參數(shù)
OSS事件源會(huì)以event的形式作為輸入?yún)?shù)傳遞給函數(shù),您可以手動(dòng)將event傳給函數(shù)模擬觸發(fā)事件。
在函數(shù)詳情頁面,單擊函數(shù)代碼頁簽,然后單擊測(cè)試函數(shù)右側(cè)圖標(biāo),從下拉列表中,選擇配置測(cè)試參數(shù)。
在配置測(cè)試參數(shù)面板,選擇創(chuàng)建新測(cè)試事件或編輯已有測(cè)試事件頁簽,填寫事件名稱和事件內(nèi)容。然后單擊確定。
說明event內(nèi)容請(qǐng)根據(jù)創(chuàng)建觸發(fā)器時(shí)的信息進(jìn)行配置,同時(shí)需要確保配置的Bucket中存在指定的文件(本文示例中是
source/a.png
文件),否則會(huì)無法觸發(fā)函數(shù)執(zhí)行,或者函數(shù)執(zhí)行會(huì)失敗。event是函數(shù)計(jì)算的入口參數(shù),當(dāng)指定的OSS Bucket發(fā)生對(duì)象創(chuàng)建時(shí),會(huì)將事件數(shù)據(jù)以JSON格式發(fā)送給綁定的函數(shù)。具體格式如下所示。
{ "events": [ { "eventName": "ObjectCreated:PutObject", "eventSource": "acs:oss", "eventTime": "2022-08-13T06:45:43.000Z", "eventVersion": "1.0", "oss": { "bucket": { "arn": "acs:oss:cn-hangzhou:123456789:testbucket", "name": "testbucket", "ownerIdentity": "164901546557****" }, "object": { "deltaSize": 122539, "eTag": "688A7BF4F233DC9C88A80BF985AB****", "key": "source/a.png", "size": 122539 }, "ossSchemaVersion": "1.0", "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****" }, "region": "cn-hangzhou", "requestParameters": { "sourceIPAddress": "140.205.XX.XX" }, "responseElements": { "requestId": "58F9FF2D3DF792092E12044C" }, "userIdentity": { "principalId": "164901546557****" } } ] }
event參數(shù)中不同屬性字段的解釋如下表所示。
參數(shù)
類型
示例值
描述
eventName
String
ObjectCreated:PutObject
事件類型。
eventSource
String
acs:oss
事件源,固定為
acs:oss
。eventTime
String
2022-08-13T06:45:43.000Z
事件產(chǎn)生的時(shí)間。使用ISO-8601標(biāo)準(zhǔn)時(shí)間格式。
eventVersion
String
1.0
事件協(xié)議的版本。
oss
Map
OSS事件內(nèi)容。
bucket
Map
bucket參數(shù)內(nèi)容。
name
String
testbucket
Bucket的名稱。
arn
String
acs:oss:cn-hangzhou:123456789:testbucket
Bucket的唯一標(biāo)識(shí)符。
ownerIdentity
String
164901546557****
創(chuàng)建Bucket的用戶ID。
object
Map
object參數(shù)內(nèi)容。
size
Int
122539
object的大小。單位:Byte。
deltaSize
Int
122539
object的大小變化量。單位:Byte。
如果新增一個(gè)文件,此參數(shù)的值表示文件大小。
如果同名覆蓋一個(gè)文件,此參數(shù)的值表示新文件與舊文件的大小差值。
eTag
String
688A7BF4F233DC9C88A80BF985AB****
Object的標(biāo)簽。
key
String
source/a.png
Object的名稱。
ossSchemaVersion
String
1.0
OSS模式的版本號(hào)。
ruleId
String
9adac8e253828f4f7c0466d941fa3db81161****
事件匹配的規(guī)則ID。
region
String
cn-hangzhou
Bucket所在的地域。
requestParameters
Map
請(qǐng)求參數(shù)。
sourceIPAddress
String
140.205.XX.XX
請(qǐng)求的源IP地址。
responseElements
Map
響應(yīng)元素。
requestId
String
58F9FF2D3DF792092E12044C
請(qǐng)求對(duì)應(yīng)的Request ID。
userIdentity
Map
用戶屬性。
principalId
String
164901546557****
請(qǐng)求發(fā)起者的阿里云賬號(hào)ID。
步驟三:編寫函數(shù)代碼并測(cè)試
OSS觸發(fā)器創(chuàng)建完成后,您可以開始編寫函數(shù)代碼并測(cè)試,以驗(yàn)證代碼的正確性。在實(shí)際操作過程中,發(fā)生OSS事件時(shí),函數(shù)會(huì)自動(dòng)被觸發(fā)執(zhí)行。
代碼中一定要避免循環(huán)觸發(fā)。一個(gè)典型的循環(huán)觸發(fā)場(chǎng)景是OSS的某個(gè)Bucket上傳文件事件觸發(fā)函數(shù)執(zhí)行,此函數(shù)執(zhí)行完成后又生成了一個(gè)或多個(gè)文件再寫回到OSS的Bucket里,這個(gè)寫入動(dòng)作又觸發(fā)了函數(shù)執(zhí)行,形成了鏈狀循環(huán)。更多信息,請(qǐng)參見OSS觸發(fā)器觸發(fā)規(guī)則。
在函數(shù)詳情頁面,單擊函數(shù)代碼頁簽,在代碼編輯器中編寫代碼,然后單擊部署代碼。
支持在線編輯代碼的運(yùn)行環(huán)境的示例代碼如下。
說明如果您要在您的函數(shù)中讀寫OSS資源,建議使用OSS內(nèi)網(wǎng)服務(wù)地址進(jìn)行訪問,避免使用公網(wǎng)訪問,產(chǎn)生公網(wǎng)費(fèi)用。關(guān)于OSS內(nèi)網(wǎng)服務(wù)地址的格式,請(qǐng)參見訪問域名和數(shù)據(jù)中心。
"use strict"; /* 本代碼樣例主要實(shí)現(xiàn)以下功能: * 1. 從event中解析出OSS事件觸發(fā)相關(guān)信息。 * 2. 根據(jù)以上獲取的信息,初始化OSS客戶端。 * 3. 將源圖片resize后持久化到OSS bucket下指定的目標(biāo)圖片路徑,從而實(shí)現(xiàn)圖片備份。 This code sample mainly implements the following functions: * 1. Parse the OSS event trigger related information from the event. * 2. According to the above information, initialize the OSS client. * 3. Resize the source image and then store the processed image into the same bucket's copy folder to backup the image. */ const OSS = require("ali-oss"); exports.handler = async function(event, context, callback) { console.log("The content in context entity is: \n"); console.dir(context); const {accessKeyId, accessKeySecret, securityToken} = context.credentials; const events = JSON.parse(event.toString()).events; console.log("The content in event entity is: \n"); console.dir(events); let objectName = events[0].oss.object.key; let region = events[0].region; let bucketName = events[0].oss.bucket.name; // 連接目標(biāo)OSS。 // Connect to the target OSS const client = new OSS({ region: region, accessKeyId: accessKeyId, accessKeySecret: accessKeySecret, stsToken: securityToken, bucket: bucketName, endpoint: "https://oss-" + region + "-internal.aliyuncs.com" }); console.log("The client entity is: \n"); console.dir(events); const targetImage = objectName.replace("source/", "processed/") // 將圖片縮放為固定寬高128 px。 const processStr = "image/resize,m_fixed,w_128,h_128" // 將源圖片resize后再存儲(chǔ)到目標(biāo)圖片路徑。 const result = await client.processObjectSave( objectName, targetImage, processStr, bucketName ); console.log(result.res.status); callback(null, "done"); }
""" 本代碼樣例主要實(shí)現(xiàn)以下功能: * 從event中解析出OSS事件觸發(fā)相關(guān)信息。 * 根據(jù)以上獲取的信息,初始化OSS bucket客戶端。 * 將源圖片resize后持久化到OSS bucket下指定的目標(biāo)圖片路徑,從而實(shí)現(xiàn)圖片備份。 This sample code is mainly doing the following things: * Get OSS processing related information from event. * Initiate OSS client with target bucket. * Resize the source image and then store the processed image into the same bucket's copy folder to backup the image. """ # -*- coding: utf-8 -*- import oss2, json import base64 def handler(event, context): # 可以通過context.credentials獲取密鑰信息。 # Access keys can be fetched through context.credentials print("The content in context entity is: \n") print(context) creds = context.credentials # 設(shè)置權(quán)鑒,供OSS sdk使用。 # Setup auth, required by OSS sdk. auth = oss2.StsAuth( creds.access_key_id, creds.access_key_secret, creds.security_token) print("The content in event entity is: \n") print(event) # Load event content. oss_raw_data = json.loads(event) # Get oss event related parameters passed by oss trigger. oss_info_map = oss_raw_data['events'][0]['oss'] # Get oss bucket name. bucket_name = oss_info_map['bucket']['name'] # Set oss service endpoint. endpoint = 'oss-' + oss_raw_data['events'][0]['region'] + '-internal.aliyuncs.com' # Initiate oss client. bucket = oss2.Bucket(auth, endpoint, bucket_name) object_name = oss_info_map['object']['key'] # Download original image from oss bucket. remote_stream = bucket.get_object(object_name) if not remote_stream: print(f'{object_name} does not exist in bucket {bucket_name}') return # Processed images will be saved to processed/ processed_path = object_name.replace('source/', 'processed/') # 將圖片縮放為固定寬高128 px。 style = 'image/resize,m_fixed,w_128,h_128' # 指定處理后圖片名稱。如果圖片不在Bucket根目錄,需攜帶文件完整訪問路徑,例如exampledir/example.jpg。 process = "{0}|sys/saveas,o_{1},b_{2}".format(style, oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(processed_path))), oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(bucket_name)))) result = bucket.process_object(object_name, process) print(result)
/*本代碼樣例主要實(shí)現(xiàn)以下功能: * 1. 從request中解析出 endpoint,bucket,object。 * 2. 根據(jù)以上獲取的信息,初始化OSS客戶端。 * 3. 將源圖片resize后持久化到OSS bucket下指定的目標(biāo)圖片路徑,從而實(shí)現(xiàn)圖片備份。 * *This code sample mainly implements the following functions: * 1. Parse out endpoint, bucket, object from request. * 2. According to the information obtained above, initialize the OSS client. * 3. Resize the source image and then store the processed image into the same bucket's copy folder to backup the image. */ <?php use RingCentral\Psr7\Response; use OSS\OssClient; use OSS\Core\OssException; function base64url_encode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } function handler($event, $context) { $event = json_decode($event, $assoc = true); /* 阿里云賬號(hào)AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶進(jìn)行API訪問或日常運(yùn)維。 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。 本示例以從上下文中獲取AccessKey/AccessSecretKey為例。 */ $accessKeyId = $context["credentials"]["accessKeyId"]; $accessKeySecret = $context["credentials"]["accessKeySecret"]; $securityToken = $context["credentials"]["securityToken"]; $evt = $event['events']{0}; $bucketName = $evt['oss']['bucket']['name']; $endpoint = 'oss-' . $evt['region'] . '-internal.aliyuncs.com'; $objectName = $evt['oss']['object']['key']; $targetObject = str_replace("source/", "processed/", $objectName); try { // 連接OSS。 // Connect to OSS. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken); // 將圖片縮放為固定寬高128px。 $style = "image/resize,m_fixed,w_128,h_128"; $process = $style. '|sys/saveas'. ',o_'.base64url_encode($targetObject). ',b_'.base64url_encode($bucketName); // 將圖片 Resize 后保存到目標(biāo)文件中。 $result = $ossClient->processObject($bucketName, $objectName, $process); // 打印處理結(jié)果。 print($result); } catch (OssException $e) { print_r(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); } print(__FUNCTION__ . ": OK" . "\n"); return $targetObject; }
單擊函數(shù)代碼頁簽的測(cè)試函數(shù)。
執(zhí)行完成后,您可以在函數(shù)代碼頁簽的上方查看執(zhí)行結(jié)果。
常見問題
相關(guān)文檔
如果您想了解可以配置的OSS事件類型,請(qǐng)參見OSS事件定義。
除了函數(shù)計(jì)算控制臺(tái),您還可以通過以下方式配置觸發(fā)器:
通過Serverless Devs工具配置觸發(fā)器。更多操作,請(qǐng)參見觸發(fā)器相關(guān)命令。
通過SDK配置觸發(fā)器。更多操作,請(qǐng)參見SDK列表。
如果您需要對(duì)創(chuàng)建的觸發(fā)器進(jìn)行修改或刪除,具體操作請(qǐng)參見更新觸發(fā)器配置。
如果您需要在一個(gè)Bucket內(nèi)關(guān)聯(lián)10個(gè)以上的OSS觸發(fā)器,請(qǐng)參見配置EventBridge類別的OSS觸發(fā)器。
觸發(fā)器相關(guān)問題
如果您希望查看函數(shù)的執(zhí)行觸發(fā)了哪個(gè)事件,可以手動(dòng)在代碼邏輯中打印事件類型日志,具體請(qǐng)參見日志記錄。
如果您希望在函數(shù)中調(diào)用另一個(gè)函數(shù),可以使用API調(diào)用指定函數(shù)或使用云工作流編排函數(shù)。如果調(diào)用的函數(shù)需要執(zhí)行耗時(shí)操作且均為異步調(diào)用,可以配置異步調(diào)用目標(biāo)服務(wù)。具體請(qǐng)參見函數(shù)可以相互調(diào)用嗎?和配置異步調(diào)用目標(biāo)服務(wù)。