實作原理
OSS和函數計算無縫內建,通過為OSS各種類型的事件設定處理函數,當OSS系統捕獲到指定類型的事件後,會自動調用函數處理。例如,您可以設定函數來處理PutObject事件,當您調用OSS PutObject API上傳圖檔到bucket後,相關聯的函數會自動觸發擷取該圖檔實時同步上傳到其他的bucket中。
準備工作
需要準備的内容有:
開通OSS服務:有對應的AccessKey ID,AccessKey Secret,OSS EndPoint;
授權:需要給函數計算的賬号授權OSS的讀寫權限。
實作方式
我們需要在函數計算上實作的内容有:
1.建立函數計算的服務;
2.建立生成任務的函數,建立OSS觸發器;
3.函數計算代碼接收到回調後上傳到檔案到新bucket,完成同步;
實作步驟
1.建立新服務
在函數計算的控制台建立一個服務,可以在建立時進行進階配置,也可以建立後再行設定。
進階配置:在進階配置—>權限配置中,如果沒有已有角色,需要建立一個新角色,選擇AliyunOSSFullAccess,點選授權。
登入RAM通路控制 > RAM角色管理,找新建立的角色,點選添權重限,添加AliyunOSSFullAccess、AliyunSTSAssumeRoleAccess、AliyunLogFullAccess權限(如果已經授權,則不要添加)。
2 編寫函數
在建立的服務下,建立一個函數,用于生成任務:
建立一個函數:bucket_synvc
函數入口:oss_sync.handler
運作環境:Python3
函數執行記憶體:512MB(選擇最小值128MB已經夠用,這個和函數計算的計費相關)
逾時時間:600s
函數内容如下,需要使用者替換的參數:
OSS賬号相關的Bucket、OSS EndPoint(如果bucket同區域可以選擇内網)
# -*- coding: utf-8 -*-
import json
import time
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdkcore.request import CommonRequest
import oss2
import logging
ossEndPoint = "您的OSS EndPoint" # oss賬号EndPoint,請選擇外網通路
remoteEndpoint = "目的bucket Endpoint"
remoteBucket = "目的bucket"
def handler(event, context):
logger = logging.getLogger()
logger.info(event)
eventObj = json.loads(event)["events"]
eventName=eventObj[0]["eventName"]
bucketName=eventObj[0]["oss"]["bucket"]["name"]
ossFileName=eventObj[0]["oss"]["object"]["key"]
logger.info("eventName: %s" % eventName)
logger.info("bucketName: %s" % bucketName)
logger.info("ossFileName: %s" % ossFileName)
appKey = fileTransAppkey
# create file url
auth = oss2.StsAuth(creds.accessKeyId, creds.accessKeySecret, creds.securityToken)
bucket = oss2.Bucket(auth, ossEndPoint, bucketName)
fileLink = bucket.sign_url('GET', ossFileName, 3600)
logger.info("file link = " + fileLink)
# 上傳到目的bucket
bucket1 = oss2.Bucket(auth, remoteEndpoint, remoteBucket)
input = requests.get('http://www.aliyun.com')
bucket.put_object(ossFileName, input)
logger.info("Sync upload Completed ")
3 配置觸發器
說明:由于上傳音頻檔案到OSS的Bucket中,上傳方式:Put、Post和分片上傳,是以為了能觸發所有的上傳事件,需要選擇所有的事件:
觸發器類型:對象存儲觸發器;
觸發器名稱:可自定義;
觸發事件:分别選擇 oss:ObjectCreated:PutObject 和 oss:ObjectCreated:PostObject oss:ObjectCreated:CompleteMultipartUpload觸發器;
觸發規則:這裡不設定比對整個bucket (根據自己實際情況填寫);
字尾:這裡不設定比對整個bucket(根據自己實際情況填寫);
角色:如果已有合适角色,可直接選擇;如果沒有角色,則選擇建立角色。
建立結果:
建立成功後,可以在OSS控制台對應Bucket的函數計算中找到該觸發器。
4日志配置
在函數設定中可以開啟日志存儲到日志服務,進而檢視上傳日志資訊
至此所有配置完成,可在OSS源bucket中上傳檔案進行測試是否同步到目的bucket。