天天看點

OSS使用函數計算實作資料實時同步方案實作原理準備工作實作方式實作步驟

實作原理

OSS和函數計算無縫內建,通過為OSS各種類型的事件設定處理函數,當OSS系統捕獲到指定類型的事件後,會自動調用函數處理。例如,您可以設定函數來處理PutObject事件,當您調用OSS PutObject API上傳圖檔到bucket後,相關聯的函數會自動觸發擷取該圖檔實時同步上傳到其他的bucket中。

OSS使用函數計算實作資料實時同步方案實作原理準備工作實作方式實作步驟

準備工作

需要準備的内容有:

開通OSS服務:有對應的AccessKey ID,AccessKey Secret,OSS EndPoint;

授權:需要給函數計算的賬号授權OSS的讀寫權限。

實作方式

我們需要在函數計算上實作的内容有:

1.建立函數計算的服務;

2.建立生成任務的函數,建立OSS觸發器;

3.函數計算代碼接收到回調後上傳到檔案到新bucket,完成同步;

實作步驟

1.建立新服務

在函數計算的控制台建立一個服務,可以在建立時進行進階配置,也可以建立後再行設定。

OSS使用函數計算實作資料實時同步方案實作原理準備工作實作方式實作步驟

進階配置:在進階配置—>權限配置中,如果沒有已有角色,需要建立一個新角色,選擇AliyunOSSFullAccess,點選授權。

OSS使用函數計算實作資料實時同步方案實作原理準備工作實作方式實作步驟

登入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使用函數計算實作資料實時同步方案實作原理準備工作實作方式實作步驟

建立成功後,可以在OSS控制台對應Bucket的函數計算中找到該觸發器。

4日志配置

在函數設定中可以開啟日志存儲到日志服務,進而檢視上傳日志資訊

OSS使用函數計算實作資料實時同步方案實作原理準備工作實作方式實作步驟

至此所有配置完成,可在OSS源bucket中上傳檔案進行測試是否同步到目的bucket。