天天看点

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。